在订单业务中,我们需要保证id是绝对唯一的。 使用数据库自增长的id在分布式的情况下把表做了拆分处理后有可能会出现id重复的情况,这就违背了唯一性。而且数据自增长的id有很强的规律性,可以根据id推断出订单的数量信息,这也是不安全的。
二、使用redis实现全局唯一ID生成器。 redis可以用作全局唯一ID生成器实现的原因: 递增性:redis本身就采用递增方案。唯一性:redis是独立于数据库之外的,不论数据库有几张表,redis只有一个,使用incr命令自增是唯一的。高可用性:redis可以用主从,集群等等方案可以确保它的高可用性。安全性:使用时间戳进行拼接确保安全性。并且Redis 的自增命令是原子性的,保证了在多线程或多进程并发情况下生成的 ID 的唯一性。高性能:Redis 是一个基于内存的数据库,读写速度非常快 使用这种拼接方式,前面为31位的时间戳,大约为68年,理论完全可用,但是在高并发的情况下,每秒可能有很多个订单,这种方式支持2^32个订单,完全可用。 代码实现 public class RedisIdWorker {/*** 开始时间戳*/private static final long BEGIN_TIMESTAMP = 1640995200L;//2022年1月1日0时0分0秒对应的时间戳/*** 序列号的位数*/private static final int COUNT_BITS = 32;private StringRedisTemplate stringRedisTemplate;public RedisIdWorker(StringRedisTemplate stringRedisTemplate) {this.stringRedisTemplate = stringRedisTemplate;}public long nextId(String keyPrefix) {// 1.生成时间戳LocalDateTime now = LocalDateTime.now();long nowSecond = now.toEpochSecond(ZoneOffset.UTC);long timestamp = nowSecond - BEGIN_TIMESTAMP;// 2.生成序列号// 2.1.获取当前日期,精确到天String date = now.format(DateTimeFormatter.ofPattern("yyyy:MM:dd"));// 2.2.自增长long count = stringRedisTemplate.opsForValue().increment("icr:" + keyPrefix + ":" + date);// 3.拼接并返回return timestamp << COUNT_BITS | count;//使用逻辑运算符拼接}}【Redis实现全局唯一ID】,诺基亚n98图片(redis 全局唯一id)
cpugpu芯片开发光刻机
硬件技术
19
文件名:【Redis实现全局唯一ID】,诺基亚n98图片
【Redis实现全局唯一ID】
一、全局唯一ID的需求产生。
同类推荐
-

【ProcessOn】流程图咏道图Axure自定义元件使用----含流程图案例,a豆
查看 -

【QT5-自我学习-线程qThread练习-两种使用方式-2:通过继承Qobject类-自己实现功能函数方式-基础样例】,长虹z1怎么样
查看 -

【QT】 QFileQFileInfo文件操作,索爱w850i
查看 -

【Qt之QAssociativeIterable】使用,ipod shuffle 6代
查看 -

【Qt之QStandardItemModel】使用,tableview、listview、treeview设置模型,tom玩乐吧
查看 -

【RK3588】YOLO V5在瑞芯微板子上部署问题记录汇总,索爱k850i
查看 -

【RNA biology】RNA的多功能性与早期生命进化,硕泰克
查看 -

【RT-DETR改进】SIoU、GIoU、CIoU、DIoU、AlphaIoU等二十余种损失函数,hp 2133
查看 -

【React】React学习:从初级到高级(一),rs690(react68)
查看
控制面板
网站分类
搜索
最新留言
文章归档
网站收藏
友情链接