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

  1. 在utils层中定义一个RedisIdWorker类的bean;
  2. 写一个方法,返回值是long型;不同业务要区别,所以使用前缀区分业务;
  3. 生成 时间戳:即当前时间秒数 - 初始时间秒数,保证每一秒生成一个不同的时间戳;
  4. 生成 序列号:使用stringRedisTemplate中String类型的自增方法increment()/INCR,而key(Redis的key最大为2^32)迟早会用完存不下,所以不能使用同一个key来自增,

序列号的key:所以使用精确到天的时间作为key,这样一个key就对应一天,不同天数的key不同,这样key的上限就是一天的下单量即2^32个,key够用;这样还方便统计订单量;

  1. 拼接前缀 + 符号位 + 时间戳 + 序列号,先使用位运算,将时间戳左移32位(序列号的位数),最低位都会变成0;
    然后把序列号count拼接上去:使用或运算填充,有1则1,否则为0;

三. 测试

  1. 用工厂方法创建线程池,容量500;
  2. 创建一个任务,在任务中生成并 打印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相关推荐

  1. Redis实现全局唯一id,实现优惠卷秒杀的下单功能

    Redis实现全局唯一id public class RedisIdWorker {private StringRedisTemplate stringRedisTemplate;public Red ...

  2. Redis实现全局唯一id

    需求: 每个店铺都可以发布优惠券,而每张优惠券都是唯一的.当用户抢购时,就会生成订单并保存到 tb_voucher_order 这张表中,而订单表如果使用数据库自增 ID 就存在一些问题: id 的规 ...

  3. Redis生成全局唯一ID

    简介: 全局唯一ID生成器是一种在分布式系统下用来生成全局唯一ID的工具 特性: 唯一性 高性能 安全性 高可用 递增性 生成规则: 有时为了增加ID的安全性,我们可以不直接使用Redis自增的数值, ...

  4. 【Redis】解决全局唯一 id 问题

    永远要记得坚持的意义 一.全局唯一 id 场景 概念: 以订单表的 id 为例 使用自增 id 会产生的问题: id 的规律性太明显,容易让用户猜测到一些信息 受表单数据量的限制 -- 分布式存储时, ...

  5. 如何在分布式场景下生成全局唯一 ID ?

    作者 l 会点代码的大叔(CodeDaShu) 在分布式系统中,有一些场景需要使用全局唯一 ID ,可以和业务场景有关,比如支付流水号,也可以和业务场景无关,比如分库分表后需要有一个全局唯一 ID,或 ...

  6. mysql并发获取唯一数值_高并发分布式环境中获取全局唯一ID[分布式数据库全局唯一主键生成]...

    需求说明 在过去单机系统中,生成唯一ID比较简单,可以使用MySQL的自增主键或者Oracle中的sequence, 在现在的大型高并发分布式系统中,以上策略就会有问题了,因为不同的数据库会部署到不同 ...

  7. 阿里P8架构师谈:分布式系统全局唯一ID简介、特点、5种生成方式

    什么是分布式系统唯一ID 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识. 如在金融.电商.支付.等产品的系统中,数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息,数据 ...

  8. [分布式] ------ 全局唯一id生成之雪花算法(Twitter_Snowflake)

    雪花算法(Twitter_Snowflake) 我们知道,分布式全局唯一id的生成,一般是以下几种: 基于雪花算法生成 基于数据库 基于redis 基于zookeeper 本文说下雪花算法,后面附源码 ...

  9. 分布式全局唯一ID的实现

    分布式全局唯一ID的实现 前言 上周末考完试,这周正好把工作整理整理,然后也把之前的一些素材,整理一番,也当自己再学习一番. 一方面正好最近看到几篇这方面的文章,另一方面也是正好工作上有所涉及,所以决 ...

最新文章

  1. 数据为王的时代,如何用图谱挖掘商业数据背后的宝藏?
  2. 远程桌面退出全屏/不能全屏/全屏切换的技巧
  3. 操作系统:再见CentOS,将于本月底终止维护!
  4. 简单音乐播放实例的实现,Android Service AIDL 远程调用服务
  5. maven项目的目录结构
  6. SAP License:你适合做SAP顾问吗?
  7. docker-compose.yml模板文件
  8. 湖南城市学院计算机题库和答案,湖南城市学院 计算机选择题题库
  9. IE下判断IE版本的语句...[if lte IE 8]……[endif]
  10. php操作剪贴板内容代码,查看剪贴板内容的方法
  11. Jmeter使用CSV文件读取大量测试数据
  12. en结尾的单词_以en结尾的形容词
  13. linux开机启动项怎么设置bios,bios怎么设置开机启动项
  14. 《洛克菲勒留给儿子的38封信》
  15. 【XGantt教程】为甘特图分组添加舒适排序选项的三个步骤
  16. 51GIF GIF动图中文搜索平台,表情包发源地,GIF动图素材库
  17. 如何找短视频素材?这些工具可以帮到你
  18. Golang的单引号、双引号与反引号用法
  19. DataHub调研数据血缘
  20. 汽车通信脉冲电子 100Base-T1 汽车|以太网共模扼流圈

热门文章

  1. 达梦数据charindex_sqlite数据库实现字符串查找的方法(instr,substring,charindex替代方案)...
  2. 网易云iframe插件测试
  3. 普通人下半年做电商还有机会吗?
  4. 2021年资料员-通用基础(资料员)报名考试及资料员-通用基础(资料员)证考试
  5. 聚财云库团队给大家分享这些年经历的网赚时代
  6. eos源码赏析(十二):EOS之从“狼人游戏”看智能合约调用及权限分配(下)
  7. 最优化学习 KKT条件(最优解的一阶必要条件)
  8. 宽字节TCHAR之间的比较
  9. 腾讯---即时通讯im--在聊天消息打开文件的解决方案
  10. 新上线软件需不需要防御?