当前位置: 首页 > news >正文

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

  1. 在utl层中定义一个RedisIdWorker类的bean;
  2. 写一个方法,返回值是long型;不同业务要区别,所以使用前缀区分业务;
  3. 生成 时间戳:即当前时间秒数 - 初始时间秒数;
  4. 生成 序列号:使用stringRedisTemplate中String类型的自增方法increment()/INCR,而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()用来等待技术归零,归零后就会执行当前线程;

http://www.lryc.cn/news/19264.html

相关文章:

  • webpack打包基本原理——实现webpack打包核心功能
  • git的使用(终端输入指令) 上
  • react定义css样式,使用less,css模块化
  • 基于JavaWeb的学生管理系统
  • win11右键新建菜单添加选项
  • leetcode Day5(卡线复试,放弃版)
  • cmake 入门二 库的编译,安装与使用
  • Python中实现将内容进行base64编码与解码
  • 集合TreeSet的使用-java
  • Mybatis-plus 分页集成以及基本使用总结 入门和案例 注解连表查询分页案例等
  • 5个设计师常用素材库
  • PHP/7.2.11 缺少 apache2/logs/httpd.pid 文件
  • 【centos7下部署mongodb】
  • pycharm首次使用爬虫框架scrapy遇到的问题和解决方法(二)
  • pyflink学习笔记(二):table_apisql
  • 嵌入式 STM32 实现STemwin移植+修改其配置文件,驱动LCD显示文本 (含源码,建议收藏)
  • [计算机网络(第八版)]第一章 概述(学习笔记)
  • AI绘图:常用镜头和视角
  • TCP四次挥手
  • Tomcat源码分析-类加载器
  • MySQL进阶篇之视图/存储过程/触发器
  • 【一看就会】实现仿京东移动端页面滚动条布局
  • 网易的“草长莺飞二月天”:增长稳健,加码研发,逐浪AI
  • NPC内网穿透教程-入门
  • 【Linux修炼】14.磁盘结构/文件系统/软硬链接/动静态库
  • Spring源码分析:创建 BeanDefinition 流程
  • Linux 练习一(思维导图 + 练习过程)
  • 高德地图基础教程超详细版
  • 基于A7核开发板的串口实现控制LED亮灭
  • HyperGBM用Adversarial Validation解决数据漂移问题