使用Redis生成全局唯一id
为了生成一个符合要求的分布式全局ID,我们可以使用 StringRedisTemplate 来实现。这个ID由三部分组成:
- 符号位(1 bit):始终为0,表示正数。
- 时间戳(31 bit):表示从某个起始时间点(例如2023-01-01 00:00:00)到现在的秒数。
- 序列号(32 bit):用于在同一秒内生成不同的ID。
实现步骤
- 计算时间戳:从某个起始时间点到现在的秒数。
- 生成序列号:使用Redis的原子递增操作来生成序列号。
- 组合ID:将时间戳和序列号组合成一个64位的长整型数字。
代码实现
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.concurrent.TimeUnit;@Service
public class DistributedIdGenerator {@Autowiredprivate StringRedisTemplate stringRedisTemplate;// 起始时间点,例如2023-01-01 00:00:00private static final long EPOCH = ZonedDateTime.of(2023, 1, 1, 0, 0, 0, 0, ZoneId.systemDefault()).toInstant().toEpochMilli() / 1000;// 序列号的Redis键前缀private static final String SEQUENCE_KEY_PREFIX = "sequence:";/*** 生成分布式全局ID** @return 分布式全局ID*/public long generateId() {// 获取当前时间戳(从起始时间点到现在的秒数)long currentTimeSec = Instant.now().getEpochSecond() - EPOCH;// 生成序列号String sequenceKey = SEQUENCE_KEY_PREFIX + currentTimeSec;long sequence = stringRedisTemplate.opsForValue().increment(sequenceKey, 1);if (sequence >= (1L << 32)) { // 序列号溢出,重置为0stringRedisTemplate.expire(sequenceKey, 1, TimeUnit.SECONDS); // 设置1秒后过期sequence = 0;}// 组合IDlong id = (currentTimeSec << 32) | sequence;return id;}
}
代码解释
- EPOCH:起始时间点,例如2023-01-01 00:00:00,转换为秒数。
- SEQUENCE_KEY_PREFIX:Redis中存储序列号的键前缀。
- generateId 方法:
-
- currentTimeSec:从起始时间点到现在的秒数。
- sequenceKey:根据当前时间戳生成的Redis键。
- sequence:使用
opsForValue().increment方法生成序列号,确保在同一秒内生成不同的ID。 - 序列号溢出处理:如果序列号达到最大值(2^32 - 1),则重置为0,并设置键在1秒后过期。
- 组合ID:将时间戳左移32位,然后与序列号进行按位或操作,生成最终的64位ID。
测试代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class IdController {@Autowiredprivate DistributedIdGenerator idGenerator;@GetMapping("/generate-id")public long generateId() {return idGenerator.generateId();}
}
相关文章:
使用Redis生成全局唯一id
为了生成一个符合要求的分布式全局ID,我们可以使用 StringRedisTemplate 来实现。这个ID由三部分组成: 符号位(1 bit):始终为0,表示正数。时间戳(31 bit):表示从某个起始…...
pnpm:包管理的新星,平替 npm 和 yarn
pnpm,一个老牌的 node.js 包管理器,支持 npm 的所有功能,完全足以用来替代 npm。它采用全局存储,每个项目内部使用了硬链接,所以很省空间,安装速度快。 本文介绍下 pnpm 的基本概念,安装、…...
Android调起系统分享图片到其他应用
Android调起系统分享图片到其他应用 有时候分享不想接第三方的,其实如果你的分享要求不是很高,调系统的分享也是可以的。 一、思路: 用intent.action Intent.ACTION_SEND 二、效果图: 三、关键代码: //这个是分享…...
详解Qt QBuffer
文章目录 **QBuffer 的详解****前言****QBuffer 是什么?****QBuffer 的主要用途****构造函数****主要成员函数详解****1. open()****原型:****作用:****参数:****返回值:****示例代码:** **2. write()****原…...
Python基础学习-11函数参数
1、"值传递” 和“引用传递” 1)不可变的参数通过“值传递”。比如整数、字符串等 2)可变的参数通过“引用参数”。比如列表、字典。 3)避免可变参数的修改 4)内存模型简介 2、函数参数类型 1) def func() #无参…...
GTK#框架让C# Winform程序跨平台运行
在软件开发领域,跨平台能力是一个重要的考量因素。对于C#开发者来说,Winform是构建桌面应用的强大工具,但原生Winform只支持Windows平台。幸运的是,GTK#框架的出现让C# Winform程序跨平台运行成为可能。本文将详细介绍如何使用GTK…...
在Kubernetes使用CronJob实现定时删除指定天数外的文件(我这里使用删除备份mysql数据库文件为例)
文章目录 一、代码使用方式1、golang代码2、使用方法二、容器镜像使用方式1、制作镜像2、我公开的镜像3、使用方法一、代码使用方式 1、golang代码 vim cleanfile.go package mainimport ("flag""fmt""io/ioutil""os""path/fi…...
使用 Elastic 收集 Windows 遥测数据:ETW Filebeat 输入简介
作者:来自 Elastic Chema Martinez 在安全领域,能够使用 Windows 主机的系统遥测数据为监控、故障排除和保护 IT 环境开辟了新的可能性。意识到这一点,Elastic 推出了专注于 Windows 事件跟踪 (ETW) 的新功能 - 这是一种强大的 Windows 原生机…...
力扣-位运算-4【算法学习day.44】
前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非…...
Stable Diffusion 3详解
🌺系列文章推荐🌺 扩散模型系列文章正在持续的更新,更新节奏如下,先更新SD模型讲解,再更新相关的微调方法文章,敬请期待!!!(本文及其之前的文章均已更新&…...
c#异步编程(async/await)
注:下文摘自ChatGPT,总结与案例都非常完善,可以快速理解并应用 0:使用场景 在winform界面程序中,在ui操作中涉及到一些耗时的等待操作,使用线程自己处理已经显得力不从心,如何能更好的实现&am…...
TCP/IP学习笔记
TCP\IP从实际应用的五层结构开始,自顶而下的去分析每一层。 TCP/IP五层架构概述 学术上面是TCP/IP四层架构,OSI/ISO是七层架构,实际中使用的是TCP/IP五层架构。 数据链路层 ICMP数据包分析 Wireshark抓包分析ICMP协议_wireshark抓ping包分析…...
0000_vim自定义快捷键_alias
vim自定义快捷键_alias 如下: 1.直接打开vi ~/.bashrc 然后到最底部,添加alias快捷键 2.添加alias快捷键mgplat 以后只要发送mgplat就等于出发了那么长一条指令 3.保存退出即可 【注意】 操作完后,可能你用mgplat无法使用,可…...
Spring Boot项目中,实体类是否需要实现Serializable接口
在Spring Boot项目中,实体类是否需要实现Serializable接口并不是一个硬性规定,而是取决于具体的应用场景和需求。以下是对这一问题的更详细分析: 1. 序列化的基本概念 序列化是将对象的状态信息转换为可以存储或传输的形式的过程。反序列化则…...
打通工业通信壁垒实现Ethernetip转profinet网络互通
西门子S7-1500 PLC(profinet)与AB PLC 1769-L32E以太网通讯(EtherNet/IP)。今天与大家分享一篇Profinet转EtherNet/IP的通讯配置方案。本文主要介绍开疆智能的Profinet转EtherNet/IP网关KJ-PNG-208,连接西门子S7-1500 …...
数据结构_图的应用
最小生成树 Prim算法 int AMGraph::sum(string v) {int start, totalW, cnt, minW, u, vv, i, j;start LocateVex(v); // 获取起始顶点编号memset(visited, false, sizeof(visited)); // 初始化访问状态visited[start] true;totalW 0; // 最小生成树的总权重cnt 1; // 当前…...
C#中面试的常见问题002
1.wpf和Winfrom的区别 1. 技术基础 WPF:基于.NET Framework,使用XAML(可扩展应用程序标记语言)作为界面描述语言,支持矢量图形和高级布局。WinForms:基于.NET Framework,使用纯代码或拖放设计…...
快速理解微服务中Ribbon的概念
一.基本概念 1.在微服务架构中,Ribbon 是一个客户端负载均衡器,用于控制服务间的通信方式。 2.Ribbon 是一个开源的库,最早由 Netflix 开发,用于实现客户端负载均衡。 3.Ribbon 主要解决的是在微服务架构中,多个服务…...
K8S简介、使用教程
以下是关于 Kubernetes(通常缩写为 K8S)的简介和使用教程: 一、Kubernetes 简介 定义与作用 Kubernetes 是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它最初由谷歌开发,后捐赠给云原生计算基…...
极狐GitLab 17.6 正式发布几十项与 DevSecOps 相关的功能【四】
GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料: 极狐GitLab 官网极狐…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
