当前位置:网站首页> 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生成器内容请搜索软件开发网以前的文章或继续浏览下面的相关文章希望大家以后多多支持软件开发网!
边栏推荐
猜你喜欢
![[quick start of Digital IC Verification] 1. Talk about Digital IC Verification, understand the contents of the column, and clarify the learning objectives](/img/90/88a1f79a07016738d2688548e21949.png)
[quick start of Digital IC Verification] 1. Talk about Digital IC Verification, understand the contents of the column, and clarify the learning objectives

Leetcode(695)——岛屿的最大面积

Zero cloud new UI design

港股将迎“最牛十元店“,名创优品能借IPO突围?

.Net分布式事務及落地解决方案

【数字IC验证快速入门】2、通过一个SoC项目实例,了解SoC的架构,初探数字系统设计流程

CTF reverse Foundation

Hong Kong stocks will welcome the "best ten yuan store". Can famous creative products break through through the IPO?

Unity编辑器扩展 UI控件篇

B站UP搭建世界首个纯红石神经网络、基于深度学习动作识别的色情检测、陈天奇《机器学编译MLC》课程进展、AI前沿论文 | ShowMeAI资讯日报 #07.05
随机推荐
插值查找的简单理解
2020 CCPC 威海 - A. Golden Spirit(思维),D. ABC Conjecture(大数分解 / 思维)
证券开户选择哪个证券比较好?网上开户安全么?
Schema和Model
.Net分布式事务及落地解决方案
[quick start to digital IC Verification] 8. Typical circuits in digital ICs and their corresponding Verilog description methods
E. Singhal and Numbers(质因数分解)
Mysql频繁操作出现锁表问题
Notes on key vocabulary in the English original of the biography of jobs (12) [chapter ten & eleven]
Leetcode brush questions: binary tree 18 (largest binary tree)
Solve the problem that the database configuration information under the ThinkPHP framework application directory is still connected by default after modification
kubernetes资源对象介绍及常用命令(五)-(ConfigMap&Secret)
小程序页面导航
Codeforces Round #804 (Div. 2) - A, B, C
ROS2专题【01】:win10上安装ROS2
14、Transformer--VIT TNT BETR
Bzoj 3747 poi2015 kinoman segment tree
[Yugong series] go teaching course in July 2022 004 go code Notes
【数字IC验证快速入门】2、通过一个SoC项目实例,了解SoC的架构,初探数字系统设计流程
常用的视图容器类组件