当前位置:网站首页> Redis唯一ID生成器的实现
Redis唯一ID生成器的实现
2022-07-05 20:35:00 【1024问】
ID的组成部分:
符号位:1bit,永远为0
时间戳:31bit,以秒为单位,可以使用69年
序列号:32bit,秒内的计数器,支持每秒产生2^32个不同ID
生成代码:
public class RedisIdWorker { /** * 开始时间戳 */ private static final long BEGIN_TIMESTAMP = 1640995200L; /** * 序列号的位数 */ private static final int COUNT_BITS = 32; private StringRedisTemplate stringRedisTemplate; //构造方法形式注入 public RedisIdWorker(StringRedisTemplate stringRedisTemplate) { this.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")); long count = stringRedisTemplate.opsForValue().increment("icr:" + keyPrefix + ":" + date); //3.拼接并返回 return timestamp << COUNT_BITS | count; }}
PS:Redis实现全局唯一id生成
import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.stereotype.Component;import org.springframework.util.Assert;import java.time.LocalDate;import java.time.format.DateTimeFormatter;import java.util.Calendar;import java.util.concurrent.TimeUnit;/** * 描述: * 唯一ID生成器 * @author jimmy * @create 2020-11-06 16:06 */@Componentpublic class GenerateIDUtil { @Autowired private RedisTemplate redisTemplate; /** * 生成每天的初始Id * @param key * @return */ public String initPrimaryId(String key) { Assert.hasLength(key, "hashName不能为空"); String hashCol = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); //自定义编号规则 String hashColVal = hashCol + "00001";// redisTemplate.opsForHash().putIfAbsent(hashName, hashCol, hashColVal); Long expiresTime = getSecondsNextEarlyMorning(); redisTemplate.opsForValue().set(key, Long.valueOf(hashColVal), expiresTime, TimeUnit.SECONDS); return hashColVal; } /** * 获取分布式Id * @param key * @return */ public String getPrimaryId(String key) { String id = ""; if(redisTemplate.hasKey(key)){ // redisTemplate.opsForValue().get(key); // redisTemplate.delete(key); id = String.valueOf(redisTemplate.opsForValue().increment(key, 1)); } else { id = initPrimaryId(key); } return id; } /** * 判断当前时间距离第二天凌晨的秒数 * @return 返回值单位为[s:秒] */ public Long getSecondsNextEarlyMorning() { Calendar cal = Calendar.getInstance(); cal.add(Calendar.DAY_OF_YEAR, 1); cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.MILLISECOND, 0); return (cal.getTimeInMillis() - System.currentTimeMillis()) / 1000; }}
到此这篇关于Redis唯一ID生成器的实现的文章就介绍到这了,更多相关Redis唯一ID生成器内容请搜索软件开发网以前的文章或继续浏览下面的相关文章希望大家以后多多支持软件开发网!
边栏推荐
- Propping of resources
- 小程序页面导航
- Applet page navigation
- Ffplay document [easy to understand]
- Informatics Orsay all in one 1339: [example 3-4] find the post order traversal | Valley p1827 [usaco3.4] American Heritage
- 炒股开户最低佣金,低佣金开户去哪里手机上开户安全吗
- Wechat applet regular expression extraction link
- Leetcode brush questions: binary tree 11 (balanced binary tree)
- 信息学奥赛一本通 1338:【例3-3】医院设置 | 洛谷 P1364 医院设置
- ICTCLAS word Lucene 4.9 binding
猜你喜欢
计算lnx的一种方式
Mysql频繁操作出现锁表问题
Welcome to the game and win rich bonuses: Code Golf Challenge officially launched
Solve the problem that the database configuration information under the ThinkPHP framework application directory is still connected by default after modification
A way to calculate LNX
【数字IC验证快速入门】7、验证岗位中必备的数字电路基础知识(含常见面试题)
Introduction to dead letter queue (two consumers, one producer)
14、Transformer--VIT TNT BETR
港股将迎“最牛十元店“,名创优品能借IPO突围?
无卷积骨干网络:金字塔Transformer,提升目标检测/分割等任务精度(附源代码)...
随机推荐
【愚公系列】2022年7月 Go教学课程 004-Go代码注释
.Net分布式事务及落地解决方案
Applet project structure
Leetcode (347) - top k high frequency elements
Convolution free backbone network: Pyramid transformer to improve the accuracy of target detection / segmentation and other tasks (with source code)
小程序全局配置
Bzoj 3747 poi2015 kinoman segment tree
mongodb/文档操作
Rainbow 5.7.1 supports docking with multiple public clouds and clusters for abnormal alarms
Minimum commission for stock trading account opening, where to open an account with low commission? Is it safe to open an account on your mobile phone
[Yugong series] go teaching course in July 2022 004 go code Notes
Is it safe for Galaxy Securities to open an account online?
Enter the parallel world
[quick start of Digital IC Verification] 9. Finite state machine (FSM) necessary for Verilog RTL design
Informatics Orsay all in one 1339: [example 3-4] find the post order traversal | Valley p1827 [usaco3.4] American Heritage
PyTorch 1.12发布,正式支持苹果M1芯片GPU加速,修复众多Bug
Y57. Chapter III kubernetes from entry to proficiency -- business image version upgrade and rollback (30)
Common view container class components
信息学奥赛一本通 1337:【例3-2】单词查找树 | 洛谷 P5755 [NOI2000] 单词查找树
3.3、项目评估