Redis:实现全局唯一ID

2023-10-29

一. 概述

全局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()用来等待技术归零,归零后就会执行当前线程;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis:实现全局唯一ID 的相关文章

随机推荐

  • java字符串不足长度自动补0

    1 方法一 import org apache commons lang3 StringUtils StringUtils leftPad String str int size String padStr 例子 StringUtils l
  • Quartus中的unused pin设置

    在逻辑可编程器件中并不是每个引脚都会用到 对于没有用到的引脚 我们也可以通过设置Quartus II software gt assignments gt settings gt devices gt unused pins把它们设置为需要
  • GLSL中Uniform块

    Uniform块 当着色器程序变复杂时 用到的uniform变量数量也会上升 通常会在多个着色器程序中用到同一个uniform变量 由于uniform变量的位置是着色器链接的时候产生的 也就是glLinkProgram 的时候 因此它在应用
  • SQL新用户留存分析

    表 用户登录日期区间表 dws app user act rng 2020 09 04 前一天 其中9999 12 31代表计算当天也登录过 用户日活表 dws app trf agr user 2020 09 05 新一天 需求 求出用户
  • 【2022最新Java面试宝典】—— ZooKeeper面试题(28道含答案)

    目录 1 ZooKeeper 是什么 2 ZooKeeper 提供了什么 3 Zookeeper 文件系统 4 ZAB 协议 5 四种类型的数据节点 Znode 6 Zookeeper Watcher 机制 数据变更通知 7 客户端注册 W
  • sublime搭建C/C++编译环境(超完美的配置并配上内容详细讲解!!)

    sublime搭建C C 编译环境 超完美的配置并配上内容详细讲解
  • 证书服务 笔记

    1 www verisign com www ssl com www godaddy com www wosign com 2 转载于 https www cnblogs com emmagikyo p 5292820 html
  • Unexpected token o in JSON at position 1 报错原因及解决方法

    Unexpected token o in JSON at position 1 报错原因及解决方 问题描述 在做登录页面 实现登录功能 返回token值时 提示 Unexpected token o in JSON at position
  • Burst(突发)信号详解

    突发信号是一个根据字面意思非常难以理解的信号 为此头疼了好久 终于理解了什么是突发信号 突发是指在同一行中相邻的存储单元连续进行数据传输的方式 连续传输所涉及到存储单元 列 的数量就是突发长度 SDRAM 简称BL burst length
  • EQ均衡器原理

    做音乐最离不开的效果器是什么 相信大多数朋友都会回答 是EQ 不错 正是有了这个所谓 均衡 的效果器 我们的音乐才不会过载 乐器音色才会如此丰富 然而知道1加1等于2更要知道1加1为什么等于2 今天我把这个效果器扒光 从根本上来分析它的工作
  • my-innodb-heavy-4G.cnf配置文件详解

    client 客户端 port 3306 客户端连接端口 socket tmp mysql sock 客户端套接字文件的路径 mysqld port 3306 服务器监听端口 socket tmp mysql sock 服务器套接字文件的路
  • 做自动化测试可选择的工具有哪些?

    如今 作为一名软件测试工程师 几乎所有人都需要具备自动化测试相关的知识 并且懂得如何去利用工具 来为企业减少时间成本和错误成本 这是为什么呢 在以前 会测试人员一般都只需要扮演终端用户 会做手动测试用例并记录观察结果就足够了 但如今 一旦你
  • QT中connect函数中的lambda表达式关于局部变量的按值拷贝与按引用拷贝,以及mutable关键字

    1 当lambda表达式中使用 时 为按值拷贝作用范围的局部变量 默认不可修改按值传进来的拷贝 如图 不加mutable时报错 a不可改变 加mutable后可以改变a值 但是时修改的拷贝对象 connect上边的a值未修改 include
  • Spring Boot 3.0 (十四): Spring Boot 整合 Shiro安全框架

    官方暂时还没有适配 Spring Boot 3 X 这篇文章我们来学习如何使用 Spring Boot 集成 Apache Shiro 安全应该是互联网公司的一道生命线 几乎任何的公司都会涉及到这方面的需求 在 Java 领域一般有 Spr
  • wxc-progress使用

  • docker 安装gitlab

    https www cnblogs com zuxing articles 9329152 html
  • C语言中输出string方法c_str()用法

    今天突然用printf s str str 是一个string 的时候突然出现乱码 就查了一下为什么 任何时候只有自己敲代码的时候才能发现 可以用cout lt
  • 智慧节能照明系统的八大应用场景

    节能 作为社会经济发展的主旋律 在生产生活的方面都要积极实践 照明是首当其冲需要进行节能升级的 智慧节能照明系统解决方案 基于电力网络 以物联网 自动化控制 无线通讯等技术 结合智能化物联网设备 实现对照明系统的集中 定时 模式等多样化控制
  • xcode编译代码的时候 ld: library not found for -xxx 解决方法

    有时候在Xcode下面我们需要引入第三方类库 或者自己写的静态库 如果配置不正确 就会出现如下错误 ld library not found for lpcre clang error linker command failed with
  • Redis:实现全局唯一ID

    Redis 实现全局唯一ID 一 概述 二 实现 1 获取初始时间戳 2 生成全局ID 三 测试 为什么可以实现全局唯一 其他唯一ID策略 补充 countDownLatch 一 概述 全局ID生成器 是一种在 分布式系统下 用来生成全局唯