Redis实现全局唯一Id
一、全局唯一ID
每个店铺都可以发布优惠券:

当用户抢购时,就会生成订单并保存到tb_voucher_order这张表中,而订单表如果使用数据库自增ID就存在一些问题:
-
id的规律性太明显
-
受单表数据量的限制
场景分析:如果我们的id具有太明显的规则,用户或者说商业对手很容易猜测出来我们的一些敏感信息,比如商城在一天时间内,卖出了多少单,这明显不合适。
场景分析二:随着我们商城规模越来越大,mysql的单表的容量不宜超过500W,数据量过大之后,我们要进行拆库拆表,但拆分表了之后,他们从逻辑上讲他们是同一张表,所以他们的id是不能一样的, 于是乎我们需要保证id的唯一性。
全局ID生成器,是一种在分布式系统下用来生成全局唯一ID的工具,一般要满足下列特性:

为了增加ID的安全性,我们可以不直接使用Redis自增的数值,而是拼接一些其它信息:

成部分:符号位:1bit,永远为0
时间戳:31bit,以秒为单位,可以使用69年
序列号:32bit,秒内的计数器,支持每秒产生2^32个不同ID
二、Redis实现全局唯一Id
package com.dfrz.utils;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;@Component
public class MyRedisIncreaseIdUtil {/*** 开始时间戳,2022年1月1日0时0分0秒的时间的时间戳*/private static final long BEGIN_TIMESTAMP = 1640995200L;/*** 序列号的位数*/private static final int COUNT_BITS = 32;private static final String INCREASE_ID_PRE = "increase:id";@Autowiredprivate StringRedisTemplate stringRedisTemplate;public long nextId(String keyPrefix) {// 1.生成时间戳LocalDateTime now = LocalDateTime.now();long nowSecond = now.toEpochSecond(ZoneOffset.UTC);long timestamp = nowSecond - BEGIN_TIMESTAMP;// 2.生成序列号// 2.1.获取当前日期,精确到天String date = now.format(DateTimeFormatter.ofPattern("yyyy:MM:dd"));// 2.2.自增长long count = stringRedisTemplate.opsForValue().increment(INCREASE_ID_PRE + keyPrefix + ":" + date);// 3.拼接并返回return timestamp << COUNT_BITS | count;}/* public static void main(String[] args) {//使用LocalDateTime.of()方法创建了一个LocalDateTime对象,代表2022年1月1日0时0分0秒的时间LocalDateTime time = LocalDateTime.of(2022, 1, 1, 0, 0, 0);//使用toEpochSecond()方法将这个时间转换为从1970年1月1日0时0分0秒(UTC时间)开始的秒数long second = time.toEpochSecond(ZoneOffset.UTC);System.out.println(second);}*/}
测试类:


三、详细介绍
这段代码定义了一个名为MyRedisIncreaseIdUtil的类,用于生成基于时间和Redis自增操作的唯一ID。
具体来说,该类做了以下几件事情:
-
定义常量:
BEGIN_TIMESTAMP:这是开始时间戳,代表2022年1月1日0时0分0秒的时间的时间戳。COUNT_BITS:这是序列号的位数,这里设置为32位。INCREASE_ID_PRE:这是一个字符串常量,用于在Redis中作为键的前缀。
-
注入依赖:
- 使用
@Autowired注解将StringRedisTemplate对象注入到stringRedisTemplate成员变量中,这是Spring框架的自动装配特性。
- 使用
-
实现生成ID的方法:
nextId(String keyPrefix):这是一个公共方法,接受一个字符串参数keyPrefix,并返回一个长整型ID。- 首先,使用
LocalDateTime.now()获取当前时间,然后通过toEpochSecond(ZoneOffset.UTC)方法将其转换为Unix时间戳(从1970年1月1日0时0分0秒开始的秒数)。 - 接着,使用
now.format(DateTimeFormatter.ofPattern("yyyy:MM:dd"))获取当前日期,精确到天,并格式化为"yyyy:MM:dd"的字符串格式。 - 然后,使用
stringRedisTemplate.opsForValue().increment()对Redis中的键进行原子自增操作。这里使用了格式化的日期作为Redis键的一部分,以确保每个日期只有一个序列号。 - 最后,通过位运算(左移操作符
<<)将时间戳转换为二进制表示中的高位,序列号转换为低位,然后使用位或操作符|将它们拼接在一起,形成一个唯一的ID。
- 首先,使用
这个类的主要目的是生成基于当前时间和Redis自增操作的唯一ID,通过时间戳保证全局唯一性,通过Redis自增操作保证同一日期内的唯一性。
相关文章:
Redis实现全局唯一Id
一、全局唯一ID 每个店铺都可以发布优惠券: 当用户抢购时,就会生成订单并保存到tb_voucher_order这张表中,而订单表如果使用数据库自增ID就存在一些问题: id的规律性太明显 受单表数据量的限制 场景分析:如果我们的…...
【J-Flash基本使用总结】
【J-Flash基本使用总结】 VX:hao541022348 ■ 烧录文件■ 创建新的工程■ 烧录模式-SWD模式■ J-Flash下载程序到单片机 ■ J-Flash拼接多个hex或bin文件■ J-Flash读单片机的option byte■ J-Flash读单片机Flash数据■ 将读出来的文件用jflash烧录到其他的芯片■ 设…...
宝塔发布网站问题汇总和记录
1、添加网站站点后打不开 解决办法,关闭防跨站攻击2 2、laravel项目部署到linux的时候出现The stream or file "/home/www/storage/logs/laravel.log" could not be opened in append mode 给目录加权限 chmod -R 777 storage 3、Class "Redis"…...
决战排序之巅(二)
决战排序之巅(二) 排序测试函数 void verify(int* arr, int n) 归并排序递归方案代码可行性测试 非递归方案代码可行性测试 特点分析 计数排序代码实现代码可行性测试 特点分析 归并排序 VS 计数排序(Release版本)说明1w rand( ) …...
自动化网络监控:每分钟自动检测网站可用性
🧙♂️ 诸位好,吾乃诸葛妙计,编程界之翘楚,代码之大师。算法如流水,逻辑如棋局。 📜 吾之笔记,内含诸般技术之秘诀。吾欲以此笔记,传授编程之道,助汝解技术难题。 &…...
Asp .Net Core 系列:集成 Ocelot+Consul实现网关、服务注册、服务发现
什么是Ocelot? Ocelot是一个开源的ASP.NET Core微服务网关,它提供了API网关所需的所有功能,如路由、认证、限流、监控等。 Ocelot是一个简单、灵活且功能强大的API网关,它可以与现有的服务集成,并帮助您保护、监控和扩展您的微…...
MSSQL行转列、列转行
行转列 SELECT * FROM student PIVOT ( SUM(score) FOR subject IN (语文, 数学, 英语) ) AS PivotedData; 列转行 SELECT * FROM student1 UNPIVOT ( score FOR subject IN ("语文","数学","英语") )AS PivotedData;...
【MySQL】创建和管理表
文章目录 前置 标识符命名规则一、MySQL数据类型二、创建和管理数据库2.1 创建数据库2.2 使用数据库2.3 修改数据库2.4 删除数据库 三、创建表3.1 创建方式一3.2 创建方式二3.3 查看数据表结构 四、修改表4.1 增加一个列4.2 修改一个列4.3 重命名一个列4.4 删除一个列 五、重命…...
缓存和数据库一致性
前言: 项目的难点是如何保证缓存和数据库的一致性。无论我们是先更新数据库,后更新缓存还是先更新数据库,然后删除缓存,在并发场景之下,仍然会存在数据不一致的情况(也存在删除失败的情况,删除…...
iOS UI掉帧和卡顿优化解决方案记录
UI卡顿原理 在 VSync 信号到来后,系统图形服务会通过 CADisplayLink 等机制通知 App,App 主线程开始在 CPU 中计算显示内容,比如视图的创建、布局计算、图片解码、文本绘制等。随后 CPU 会将计算好的内容提交到 GPU 去,由 GPU 进行…...
transbigdata 笔记: 轨迹密集化/稀疏化 轨迹平滑
1 密集化 transbigdata.traj_densify(data, col[Vehicleid, Time, Lng, Lat], timegap15) 轨迹致密化,保证至多每隔timegap秒都有一个轨迹点 这边插补使用的是pandas的interpolate,method设置的是index 1.1 举例 transbigdata 笔记: 官方…...
反向代理的本质是什么?
反向代理是一种网络架构模式,通常用于提供静态内容、处理安全、负载均衡和缓存等任务。在这种架构中,客户端发送的请求首先到达反向代理服务器,然后由反向代理服务器将请求转发给后端的实际服务器。反向代理服务器可以处理和修改请求和响应&a…...
Kali Linux保姆级教程|零基础从入门到精通,看完这一篇就够了!(附工具包)
作为一名从事网络安全的技术人员,不懂Kali Linux的话,连脚本小子都算不上。 Kali Linux预装了数百种享誉盛名的渗透工具,使你可以更轻松地测试、破解以及进行与数字取证相关的任何其他工作。 今天给大家分享一套Kali Linux资料合集…...
UML-用例图
提示:用例图是软件建模的开始,软件建模中的其他图形都将以用例图为依据。用例图列举了系统所需要实现的所有功能,除了用于软件开发的需求分析阶段,也可用于软件的系统测试阶段。 UML-用例图 一、用例图的基础知识1.用例图的构成元…...
jmeter--8.加密传输
目录 1. Base64加密 2. MD5加密 3. SHA加密(sha1\sha\sha224\sha256\sha384\sha512) 4. RSA加密-公钥加密,私钥解密 1. Base64加密 1.1 在需要加密传输的接口下新增BeanShell 预处理程序,${username}可替换成value值ÿ…...
微信小程序canvas画布转图片转pdf文件
关键步骤介绍 步骤一:将canvas页面保存为图片 for(var a=0;a<this.data.page_canvas.length;++a){ var t_page_img = await this.canvas_to_image(this.data.page_canvas[a]) t_img.push(t_page_img) } this.data.page_canvas是保存的canvas界面,this.c…...
【Linux操作】国产Linux服务管理操作
【Linux操作】国产Linux服务管理操作 前言SAMBA配置服务器端1. 安装相关包2. 配置/etc/samba/smb.conf,在此文件末尾添加如下内容,并保存退出。3. 创建/home/share并更改权限4. 启动samba服务 客户端• Windows客户端• 麒麟客户端 Telnet1、telnet语法2…...
大语言模型系列-word2vec
文章目录 前言一、word2vec的网络结构和流程1.Skip-Gram模型2.CBOW模型 二、word2vec的训练机制1. Hierarchical softmax2. Negative Sampling 总结 前言 在前文大语言模型系列-总述已经提到传统NLP的一般流程: 创建语料库 > 数据预处理 > 分词向量化 > …...
vue项目运行报错this[kHandle] = new _Hash(algorithm, xofLen)
自从昨天分盘重装了最新版本的Node之后,项目是一启一个报错 出现这个报错时,需要在package.json文件中 dev命令行 增加:set NODE_OPTIONS–openssl-legacy-provider 出现该问题的原因: node.js V17开始版本中发布的是OpenSSL3.0,…...
APP兼容性测试,这几个面试硬技能,包教包会
兼容性测试主要通过人工或自动化的方式,在需要覆盖的终端设备上进行功能用例执行,查看软件性能、稳定性等是否正常。 对于需要覆盖的终端设备,大型互联网公司,像 BAT,基本都有自己的测试实验室,拥有大量终…...
【火箭】基于matlab模拟运载火箭俯仰控制系统中基于IMU的故障检测并结合执行器动力学【含Matlab源码 15550期】含报告
💥💥💥💥💥💥💞💞💞💞💞💞💞💞欢迎来到海神之光博客之家💞💞💞Ὁ…...
基于DeepSeek模型的IP文案自动化生成工作流设计与实现
基于DeepSeek模型的IP文案自动化生成工作流设计与实现 1. 项目背景与目标 在数字化营销和品牌建设过程中,IP(Intellectual Property,知识产权/品牌形象)文案扮演着至关重要的角色。高质量的IP文案能够有效传递品牌价值、塑造用户认知、提升转化率。传统的文案撰写依赖人工…...
从开题到定稿,okbiye AI 写作如何解决毕业论文 90% 的核心痛点
okbiye-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPT毕业论文 - Okbiye智能写作https://www.okbiye.com/ai/bylw 作为一名踩过论文无数坑的过来人,我深知毕业季被毕业论文支配的恐惧:对着 Word 空白页无从下笔,开题报告…...
机器学习生产化:从Notebook到可运维ML服务的实战路径
1. 项目概述:当模型走出笔记本,真正开始“呼吸”现实空气 你有没有经历过这样的时刻:Jupyter Notebook里所有指标都闪闪发亮,AUC 0.92,F1 0.87,交叉验证稳如泰山;业务方点头签字,上线…...
Unity URP中_Material Stencil属性报错的四层根因与修复
1. 这个报错不是材质没写对,而是渲染管线在“敲门问权限” 刚在Unity 2021.3 LTS项目里切完URP(Universal Render Pipeline)后打包iOS,突然弹出一行红字: Material xxx doesnt have _Stencil property 。我第一反应是…...
Windows 11终极优化指南:用Win11Debloat一键清理系统,性能提升51%
Windows 11终极优化指南:用Win11Debloat一键清理系统,性能提升51% 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other chang…...
百考通智能降重——为原创保驾护航 ��️
在毕业季的焦虑中,“降重”常被误解为一场与查重系统的文字游击战: 换同义词、调语序、加废话…… 但真正的问题从来不是“字重复”,而是表达缺乏原创性。 当你的论文充斥着“研究表明”“可以发现”“具有重要意义”这类千篇一律的学术套话…...
Dism++终极指南:轻松掌握Windows系统优化与维护的10个关键技巧
Dism终极指南:轻松掌握Windows系统优化与维护的10个关键技巧 【免费下载链接】Dism-Multi-language Dism Multi-language Support & BUG Report 项目地址: https://gitcode.com/gh_mirrors/di/Dism-Multi-language 你是否曾经因为Windows系统变得越来越慢…...
Perseus:5分钟解锁碧蓝航线全皮肤的神奇补丁
Perseus:5分钟解锁碧蓝航线全皮肤的神奇补丁 【免费下载链接】Perseus Azur Lane scripts patcher. 项目地址: https://gitcode.com/gh_mirrors/pers/Perseus 还在为碧蓝航线中那些精美皮肤需要付费而烦恼吗?想免费体验所有舰娘的不同外观吗&…...
Apache Doris多模态能力深度解析:从技术架构到大厂落地实践
这篇文章是个人的学习总结,AI时代下的Doris在多模态能力的支持上越来越完善,个人总结了背景、技术方案以及各大公司落地场景,方便查阅,大家可以点击收藏。前言Apache Doris 4.0正式引入原生向量索引、AI 函数与混合检索能力&#…...
