Redis:实现全局唯一ID
Redis:实现全局唯一ID
- 一. 概述
- 二. 实现
- (1)获取初始时间戳
- (2)生成全局ID
- 三. 测试
- 为什么可以实现全局唯一?
- 其他唯一ID策略
- 补充:countDownLatch
一. 概述
全局ID生成器:是一种在【分布式系统下】用来生成全局唯一ID的工具;
全局ID需要满足的特性:
1.唯一性
2.高可用:集群、哨兵机制;
3.高性能
4.递增性:Redis中的String数据类型的有自增特性!
5.安全性:将自增数值进行拼接,不容易猜出来;
ID结构:
符号位(1位) + 时间戳
(31位) + 序列号
(32位);
时间戳为从起始时间
到现在的时间差;
理论上支持1秒钟2^32个订单;
二. 实现
(1)获取初始时间戳
先设定一个初始时间如2022年1月1日,获取初始时间的时间戳;
(2)生成全局ID
- 在utils层中定义一个
RedisIdWorker
类的bean; - 写一个方法,返回值是long型;不同业务要区别,所以使用前缀区分业务;
- 生成
时间戳
:即当前时间秒数 - 初始时间秒数,保证每一秒生成一个不同的时间戳; - 生成
序列号
:使用stringRedisTemplate中String类型的自增方法increment()/INCR
,而key(Redis的key最大为2^32)迟早会用完存不下,所以不能使用同一个key来自增,
序列号的key:所以使用精确到天的时间作为key,这样一个key就对应一天,不同天数的key不同,这样key的上限就是一天的下单量即2^32个,key够用;这样还方便统计订单量;
- 拼接前缀 + 符号位 + 时间戳 + 序列号,先使用位运算,将时间戳左移32位(序列号的位数),最低位都会变成0;
然后把序列号count拼接上去:使用或运算填充,有1则1,否则为0;
三. 测试
- 用工厂方法创建线程池,容量500;
- 创建一个任务,在任务中生成并 打印ID100次,共给线程池提交300次任务;
由于线程池会异步执行,使用countDownLatch
,300个线程,每个线程会countdown
一次,直到计数为0就会唤醒await()
所在的当前线程,就会去main中打印所花的时间了;
结果:生成共3w个ID;
查看Redis:
为什么可以实现全局唯一?
因为生成ID时用的是Redis的 increment / INCR
功能,每调用一次都会进行自增;
其他唯一ID策略
Redis产生的ID是数值类型long,占空间小;
UUID:JDK自带,16进制字符串,不是自增的,不满足要求;
雪花snowflake算法:需要维护机器id,对于时钟依赖比较高;
数据库实现,性能不如Redis;
补充:countDownLatch
用来进行线程同步协作,等待所偶有线程完成倒计时;
其中构造参数用来初始化等待计数值,countDown()
用来计数-1,await()
用来等待技术归零,归零后就会执行当前线程;
Redis:实现全局唯一ID相关推荐
- Redis实现全局唯一id,实现优惠卷秒杀的下单功能
Redis实现全局唯一id public class RedisIdWorker {private StringRedisTemplate stringRedisTemplate;public Red ...
- Redis实现全局唯一id
需求: 每个店铺都可以发布优惠券,而每张优惠券都是唯一的.当用户抢购时,就会生成订单并保存到 tb_voucher_order 这张表中,而订单表如果使用数据库自增 ID 就存在一些问题: id 的规 ...
- Redis生成全局唯一ID
简介: 全局唯一ID生成器是一种在分布式系统下用来生成全局唯一ID的工具 特性: 唯一性 高性能 安全性 高可用 递增性 生成规则: 有时为了增加ID的安全性,我们可以不直接使用Redis自增的数值, ...
- 【Redis】解决全局唯一 id 问题
永远要记得坚持的意义 一.全局唯一 id 场景 概念: 以订单表的 id 为例 使用自增 id 会产生的问题: id 的规律性太明显,容易让用户猜测到一些信息 受表单数据量的限制 -- 分布式存储时, ...
- 如何在分布式场景下生成全局唯一 ID ?
作者 l 会点代码的大叔(CodeDaShu) 在分布式系统中,有一些场景需要使用全局唯一 ID ,可以和业务场景有关,比如支付流水号,也可以和业务场景无关,比如分库分表后需要有一个全局唯一 ID,或 ...
- mysql并发获取唯一数值_高并发分布式环境中获取全局唯一ID[分布式数据库全局唯一主键生成]...
需求说明 在过去单机系统中,生成唯一ID比较简单,可以使用MySQL的自增主键或者Oracle中的sequence, 在现在的大型高并发分布式系统中,以上策略就会有问题了,因为不同的数据库会部署到不同 ...
- 阿里P8架构师谈:分布式系统全局唯一ID简介、特点、5种生成方式
什么是分布式系统唯一ID 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识. 如在金融.电商.支付.等产品的系统中,数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息,数据 ...
- [分布式] ------ 全局唯一id生成之雪花算法(Twitter_Snowflake)
雪花算法(Twitter_Snowflake) 我们知道,分布式全局唯一id的生成,一般是以下几种: 基于雪花算法生成 基于数据库 基于redis 基于zookeeper 本文说下雪花算法,后面附源码 ...
- 分布式全局唯一ID的实现
分布式全局唯一ID的实现 前言 上周末考完试,这周正好把工作整理整理,然后也把之前的一些素材,整理一番,也当自己再学习一番. 一方面正好最近看到几篇这方面的文章,另一方面也是正好工作上有所涉及,所以决 ...
最新文章
- 用 Hystrix 构建高可用服务架构
- could not load inserted library: /usr/lib/libgmalloc.dylib
- java里写分页,自己写的Java分页类
- Linux后台进程管理以及ctrl+z(挂起)、ctrl+c(中断)、ctrl+\(退出)和ctrl+d(EOF)的区别
- 求周期方波信号的傅里叶级数_1-1 求周期方波(见图1-4)的傅里叶级数(复指数函数形 ….doc...
- 面试题汇总---深度学习(图像识别,NLP内容)
- 数据泵 远程服务端数据导出
- 一文详解 SpringBoot 多数据源中的分布式事务
- MS SQL入门基础:打开游标
- 分享几个软件测试逻辑思维和综合面试题【含答案】
- repo报错:SyntaxError: invalid syntax
- 手把手阿里云企业邮箱设置教程三步搞定
- 思创易控cetron-Cetron Wi-Fi 6 AP 荣获2020年度创新产品•鼎智奖
- 用论文写作平台Overleaf写中文论文
- 玩游戏4g计算机的内存不足,别再说内存不足了!教你一招彻底解决,电脑运行加速3倍!...
- 阿里云主机遭受DDOS攻击IP不能使用如何更换弹性公网IP
- mmdetection-inference-画出bbox和mask
- mt4登录下方显示没有服务器,FXCM福汇MT4登录没有FXCM-USDReal07服务器怎么办,登录不了...
- 2014区域赛北京站总结
- 嗨CE系列教程全套(入门,进阶,高阶)游戏驱动反调试
热门文章
- 基于TCP Reno的拥塞控制的基本原理
- 大丰画家朱新建_朱新建:画家像是一只鸡
- 提高国际短信验证成功率的方法
- http常见状态码有哪些?
- LDAP Port 636
- 几个KNOCKOUT.JS 框架使用技巧
- Cannot add PPA: ‘ppa:~jonathonf/ubuntu/vim‘. ERROR: ‘~jonathonf‘ user or team does not exist.解决方法
- python报错TypeError: unsupported operand type(s) for -: ‘decimal.Decimal‘ and ‘float‘的解决方法
- java错误1601解决方法,未知错误1601解决方法
- 2022 年全国职业院校技能大赛 网络搭建与应用赛项正式赛卷