Redis:实现全局唯一ID

news2025/7/20 22:31:21

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.coloradmin.cn/o/368661.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

墨天轮发布数据库行业报告,创邻科技Galaxybase大放异彩

近日,知名数据库社区墨天轮发布《2022中国数据库行业年度分析报告》,该报告由墨天轮联合业界专家学者共同编写,共122页,详细总结了2022年数据库行业产学研用的发展近况、挑战以及对未来趋势的展望。旨在于给数据库行业带来有价值的…

Hadoop命令大全

HDFS分布式文件系统 , 将一个大的文件拆分成多个小文件存储在多台服务器中 文件系统: 目录结构(树状结构) "/" 树根, 目录结构在namenode中维护 目录 1.查看当前目录 2.创建多级目录 3.上传文件 4.查…

狂神说:面向对象(二)

一、创建与初始化对象new分配内存空间、默认初始化、构造器调用二、构造器特点:1. 没有返回值 2. 方法名与类名相同类里面啥都没写的时候,new一个这个类对象,java会生成一个默认构造函数(构造器):构造器核心…

公司新招了个腾讯5年经验的测试员,让我见识到什么才是真正的测试天花板····

5年测试,应该是能达到资深测试的水准,即不仅能熟练地开发业务,而且还能熟悉项目开发,测试,调试和发布的流程,而且还应该能全面掌握数据库等方面的技能,如果技能再高些的话,甚至熟悉分…

Qt 进程间通信

Qt进程间通信的方法: TCP/IPLocal Server/Socket共享内存D-Bus (Unix库)QProcess会话管理 TCP/IP : 使用套接字的方式,进行通信(之前介绍了,这里就不介绍了)。 Local Server/Socket…

智能家居之主机--驱动层搭建

智能家居之主机--驱动层搭建bsp-底层驱动bsp_gpiobsp_adcbsp_uartbsp_timer伪调度bsp-底层驱动 bsp_gpio 利用一个config.h的配置文件,把所有要使用的gpio的属性配置好,这样有一个好处,比较集中,也比较好查,不需要一个…

fp32/fp64精度,4/8字节16进制转float/double十进制

1、IEEE-754 32位单精度浮点数(4字节) 1.1 32位单精度浮点数 其中, 32位16进制数包括1位符号位(SIGN),8位指数位(EXPONENT)和 23位尾数位(MANTISSA)。 例如: 25.3可以表示为41CA6666(0x41为高字节&#xf…

算法第十六期——动态规划(DP)之线性DP

【概述】 线性动态规划,是较常见的一类动态规划问题,其是在线性结构上进行状态转移,这类问题不像背包问题、区间DP等有固定的模板。 线性动态规划的目标函数为特定变量的线性函数,约束是这些变量的线性不等式或等式,目…

Mysql中关于查询日志的配置详解

查询日志 MySQL中的查询日志保存在文本文件中,能够记录MySQL中的所有数据操作。 开启查询日志 MySQL默认情况下没有开启查询日志,如果需要开启查询日志,则需要在 my.cnf 文件或者 my.ini 文件的 [mysqld] 选项下进行配置。例如,…

GoFrame工程目录设计介绍

GoFrame框架针对业务项目的目录设计,主体的思想来源于三层架构,但在具体实现中,对其进行了一定的改进和细化使其更符合工程实践和时代进步。 一.工程目录结构 GoFrame业务项目基本目录结构如下: 二.目录结构解释 对外接口 对…

浅谈智能电力运维管理系统在物业小区的应用分析

安科瑞 李亚俊 0引言 由于部分住宅小区存在电力设施纸质档案破损缺失、产权分界不清、查找故障点所在箱变(箱式变电站,下同)位置困难或小区出入口路径不明等情况,影响了抢修效率。为此,国网辽宁沈阳市沈北新区供电公…

IDEA Maven install Failed to execute goal org.apache.maven.plugins异常处理

目录一、异常错误二、原因三、解决方法修改pom.xml资源配置文件一、异常错误 由于服务器编译拦截了静态资源,导致出现异常,需要重新打包编译 打开IDEA带的Maven管理,双击clean清除由项目编译创建的target 再双击install安装jar包到本地仓库…

朴素贝叶斯笔记

贝叶斯公式在A 条件成立下,B的概率等于B的概率*在B条件成立下,A的概率/A的概率,推导假设一个学校中男生占总数的60%,女生占总数的40%。并且男生总是穿长裤,女生则一半穿长裤、一半穿裙子。1.正向概率。随机选取一个学生…

白盒测试方法的简单理解(通俗易懂)

白盒测试主要使用逻辑覆盖测试方法,包括语句覆盖、判定覆盖、条件覆盖、判定-条件覆盖、条件组合覆盖、路径覆盖等。 假设逻辑判断流程图如下图所示,我们简单来说说每种白盒测试方法是如何来进行的。 一、语句覆盖 语句覆盖的定义是:程序中…

Openwrt中动态IPV6 防火墙的正确设置方法

环境:光猫桥接公网IPV6 问题:动态IPV6地址不知道怎么设置防火墙 解决办法:模糊匹配前缀,特定后缀 背景:将家中光猫桥接后,获得了公网的IPV6地址,可以从外部用IPV6访问家中的设备,但I…

vue-cli引入wangEditor、Element,封装可上传附件的富文本编辑器组件(附源代码直接应用,菜单可调整)

关于Element安装引入,请参考我的另一篇文章:vue-cli引入Element Plus(element-ui),修改主题变量,定义全局样式_shawxlee的博客-CSDN博客_chalk variables 1、安装wangeditor npm i wangeditor --savewangE…

日常编程中和日期相关的代码和bug

本文主要是Java中和日期时间相隔的几个常用代码函数代码,做了总结,希望在日常编码中,可以帮到大家。 1.计算闰年 记住一个短语,“四年一润,百年不闰,四百再润”,不管换啥语言,相信…

HyperGBM用Adversarial Validation解决数据漂移问题

本文作者:杨健,九章云极 DataCanvas 主任架构师 数据漂移问题近年在机器学习领域来越来越得到关注,成为机器学习模型在实际投产中面对的一个主要挑战。当数据的分布随着时间推移逐渐发生变化,需要预测的数据和用于训练的数据分布…

剑指 Offer 30. 包含min函数的栈

摘要 剑指 Offer 30. 包含min函数的栈 一、栈解析 package Stock;import java.util.Stack;/*** Classname JZ30min函数栈* Description TODO* Date 2023/2/24 18:59* Created by xjl*/ public class JZ30min函数栈 {/*** description 最小栈的含义是每次从栈中获取的数据都是…

AWS攻略——使用中转网关(Transit Gateway)连接不同区域(Region)VPC

文章目录Peering方案Transit Gateway方案环境准备创建Transit Gateway Peering Connection接受邀请修改中转网关路由修改被邀请方中转网关路由修改邀请方中转网关路由测试修改Public子网路由知识点参考资料区别于 《AWS攻略——使用中转网关(Transit Gateway)连接同区域(Region…