redis生成全局唯一id(redisson实现)

本篇文章给大家谈谈redis生成全局唯一id,以及redisson实现对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

分库分表之后,id 主键如何处理?

分成多个表之后困扒,每个表都是从 1 开始累加,这样是不对的,我们需要一个全局唯一的 id 来支持。生成全局 id 有下面这几种方式:

UUID:不适合作为主键,因为太长了,宏改并且无序不可读,查询效率低。比较适合用于生成唯一的名字的标示比如文件的名字。

数据库自增 id : 两台数据库分别设置不同步长,生成不重复ID的策略来实现高可用。蔽尺判这种方式生成的 id 有序,但是需要独立部署数据库实例,成本高,还会有性能瓶颈。

利用 redis 生成 id : 性能比较好,灵活方便,不依赖于数据库。但是,引入了新的组件造成系统更加复杂,可用性降低,编码更加复杂,增加了系统成本。

[img]

Redis(五)-特性-消息队列

消息队列要能支持组件通信消息的快速读写,而Redis本身支持数据的樱羡歼高速访问,正好可以满足消息队列的读写性能需求。另外,消息队列在存取消息时,必须要满足三个需求:

针对消息队列的需求,本节就来分析下Redis实现消息队列的方案

BLPOP :队列为空时阻塞

LPUSH :队列满时阻塞

BRPOPLPUSH :取出消费同时保存到另外一个备份list

从消息有序性、唯一性、可靠性三个方面分析是否可行

为了解决可靠性问题可以使用BRPOPLPUSH

当consumer故障恢复后可以从备份队列中取出消息进行处理脊冲

Streams是Redis专门为消息队列设计的数据类型,它提供了丰富的消息队列操作派链命令;

XADD :插入消息,消息的格式是键-值对形式,保证有序,可以自动生成全局唯一ID;

XREAD :用于读取消息,可以按ID读取数据;

XREADGROUP :按消费组形式读取消息;

XPENDING :用来查询每个消费组内所有消费者已读取但尚未确认的消息

XACK :用于向消息队列确认消息处理已完成

-------- over ---------

如何在高并发分布式系统中生成全局唯一Id

c# 中的 Guid 就是唯一的,它保证对在同一时空中的所有机器都是唯一咐纤轿的. 据我所知,它也会产生碰撞,但是概率极小,完全可以不用理会的小。 可以用现有的支持原子操作的分布式数据库, 例:Redis 很多网竖祥站用Redis 的衡肆原子性来生成唯一标识符 我们可以用本机的Mac地址,硬盘序列号,本地最大标识符来拼接出唯一。 Mac 可被修改,硬盘序列号也有可能不唯一,但是这三样拼接在一起,碰撞的概率很小的 Md5 也会碰撞,不是么?

Redis 实现 消息队列

虽然消费者是异步处理消息,但是,消费者仍然需要按照生产者发送消息的顺序来处理消息,避免后发送的消息被先处理了。对于要求消息保序的场景来说,一旦出现这种消息被乱序处理的情况,就可能会导致业务逻辑被错误执行,从而给业务方造成损失。

消费者从消息队列读取消息时,有时会因为网络堵塞而出现消息重传的情况。此时,消费者可能会收到多条重复的消息。对于重复的消息,消费者如果多次处理的话,就可能造成一个业务逻辑被多次执行,如果业务逻辑正好是要修改数据,那就会出现数据被多次修改的问题了。

消费者在处理消息的时候,还猛耐可能出现因为故障或宕机导致消息没有处理完成的情况。此时,消息队列需要能提供消息可靠性的保证,也就是说,当消费者重启后,可以重新读取消息再次进行处理,否则,就会出现消息漏处理的问题了。

List 本身就是按先进先出的顺序对数据进行存取的,所以,如果使用 List 作为消息队列保存消息的话,就已经能满足消息保序的需求了。

生产者提供一个消息id,消费者要把已经处理过的消息 ID 号记录下来。当收到一条消息后,大侍消费者程序就可以对比收到的消息 ID 和记录的已处理过的消息 ID,来判断当前收到的消息有没有经过处理。如果已经处理过,那么,消费者程序就不再进行处理了。

为了留存消息,List 类型提供了 BRPOPLPUSH 命令,这个命令的作用是让消费者程序从一个 List 中读取消息,同时,Redis 会把这个消息再插入到另一个 List(可以叫作备份 List)留存。这样一来,如果消费者程序读了消息但没能正常处理,等它重启后,就可以从备份 List 中重新读取消息并进行处理了。

在生产者往 List 中写入数据时,List 并不会主动地通知消费者有新消息写入,如果消费者想要及时处理消息,就需要在程序中不停地调用 RPOP 命令(比如使用一个 while(1) 循环)。如果有新消息写入,RPOP 命令就会返回结果,否则,RPOP 命令返回空值,再继续循环。所以,即使没有新消息写入 List,消费者也要不停地调用 RPOP 命令,这就会导致消费者程序的 CPU 一直消耗在执行 RPOP 命令上,带来不必要的性能损失。为了解决这个问题,Redis 提供了 BRPOP 命令。BRPOP 命令也称为阻塞式读取,客户端在没有读到队列数据时,自动阻塞,直到有新的数据写入队列,再开始读取新数据。和消费者程序自己不停地调用 RPOP 命令相比,这种方式能节省 CPU 开销。

发送消息日志

消费消息日志

Streams 是 Redis 专门为消息队列设计的数据类型,它提供了丰富的消息队列操作命令。

XADD:插入消息,保证有序,可以自动生成全局唯一 ID;

XREAD:用于读取消息,可以按 ID 读取数据;

XREADGROUP:按消费组形式读取消息;

XPENDING :XPENDING 命令可以用来查询每个消费组内所有消费者已读取但尚未确认的消息,

XACK:XACK 命令用于向消息队列确认消息处理已完成。

监听器

监听器容器

初始化消息队列(integral-queue)和消费者组(integral-group),执行RedisMqTest.initMessageQueue()即可

可参考List实现的处理方式

可使用RedisMqTest.getPendingQueue()获取未滚知吵成功消费的消息队列进行处理

关于redis生成全局唯一id和redisson实现的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

相关阅读

  • mssqlserver(mssqlserver怎么安装)

    mssqlserver(mssqlserver怎么安装)

    简介:MSSQL Server是由微软公司开发的一种关系型数据库管理系统,是在Windows操作系统上运行的数据库服务器。它旨在提供可靠性、高性能和安全性,被广泛应用于企业级应用程序和网站开发中。多级标题:一、MSSQL Server的特点...

    2024.04.22 22:38:00作者:intanet.cnTags:mssqlserver
  • js转json(js转json在线)

    js转json(js转json在线)

    **简介**在IT技术领域中,JavaScript(简称JS)是一种常用的脚本语言,用于网页开发和编程。JSON(JavaScript Object Notation)则是一种轻量级的数据交换格式,常用于存储和传输数据。本文将讨论如何将Ja...

    2024.04.22 22:23:30作者:intanet.cnTags:js转json
  • 数据库有那些(数据库有哪些索引)

    数据库有那些(数据库有哪些索引)

    一、简介数据库是计算机中用于存储和管理数据的系统,是信息系统中最重要的组成部分之一。数据库技术在信息化时代发挥着重要作用,广泛应用于各行各业。数据库的种类有很多,每种都有其特点和适用场景。下面将介绍一些常见的数据库类型。二、关系数据库1....

    2024.04.22 22:14:00作者:intanet.cnTags:数据库有那些
  • 关于sparksqlsplit的信息

    关于sparksqlsplit的信息

    简介:作为一种基于内存的分布式数据处理框架,Spark SQL使得数据分析更加高效和灵活。而在Spark SQL中,split函数是非常常用的函数,用于将字符串通过指定的分隔符进行拆分。本文将详细介绍sparksqlsplit函数的用法和示...

    2024.04.22 22:13:30作者:intanet.cnTags:sparksqlsplit
  • 数据的处理方法(实验数据的处理方法)

    数据的处理方法(实验数据的处理方法)

    在当今数字化时代,数据处理变得越发重要。从企业管理到科研领域,人们需要处理大量的数据以获取有价值的信息。本文将介绍一些常见的数据处理方法,帮助读者更好地理解和应用数据处理技术。# 传统数据处理方法传统数据处理方法主要包括数据录入、数据清洗、...

    2024.04.22 22:09:30作者:intanet.cnTags:数据的处理方法
  • mongodb和hbase(mongodb和hbase性能)

    mongodb和hbase(mongodb和hbase性能)

    MongoDB和HBase是两种流行的NoSQL数据库系统,它们在处理大规模数据和高并发访问方面都有很好的表现。本文将对MongoDB和HBase进行比较和分析,以帮助读者了解它们各自的优缺点和适用场景。# 一、MongoDB介绍Mongo...

    2024.04.22 22:00:00作者:intanet.cnTags:mongodb和hbase
  • mysql转sqlserver(MySQL转sqlserver数据库)

    mysql转sqlserver(MySQL转sqlserver数据库)

    **简介**将MySQL数据库转移到SQL Server数据库是常见的需求,因为有时候企业需要更稳定、更强大的数据库管理系统来满足数据需求。在本文中,我们将详细讨论如何将MySQL数据库成功转移到SQL Server数据库。**准备工作**...

    2024.04.22 21:45:30作者:intanet.cnTags:mysql转sqlserver
  • 数据库的建立(数据库的建立与维护实验心得)

    数据库的建立(数据库的建立与维护实验心得)

    标题:数据库的建立简介:数据库是指在计算机系统中,用于存储和管理数据的系统。在IT技术领域,数据库起着至关重要的作用,它可以帮助我们更好地组织和管理数据,提高数据的访问效率和安全性。下面将详细介绍数据库的建立过程和相关知识。一、数据库类型1...

    2024.04.22 21:30:00作者:intanet.cnTags:数据库的建立