当前位置:网站首页> 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生成器内容请搜索软件开发网以前的文章或继续浏览下面的相关文章希望大家以后多多支持软件开发网!
边栏推荐
- Leetcode skimming: binary tree 17 (construct binary tree from middle order and post order traversal sequence)
- Informatics Olympiad 1338: [example 3-3] hospital setting | Luogu p1364 hospital setting
- CTF逆向基础
- 信息学奥赛一本通 1337:【例3-2】单词查找树 | 洛谷 P5755 [NOI2000] 单词查找树
- 14、Transformer--VIT TNT BETR
- National Eye Care Education Conference, 2022 the Fourth Beijing International Youth eye health industry exhibition
- 2022年7月4日-2022年7月10日(ue4视频教程mysql)
- [quick start of Digital IC Verification] 3. Introduction to the whole process of Digital IC Design
- Is it safe to open an account online? Where can I get a low commission?
- 1、强化学习基础知识点
猜你喜欢
2022 Beijing eye health products exhibition, eye care products exhibition, China eye Expo held in November
About the priority of Bram IP reset
【数字IC验证快速入门】8、数字IC中的典型电路及其对应的Verilog描述方法
14、Transformer--VIT TNT BETR
PyTorch 1.12发布,正式支持苹果M1芯片GPU加速,修复众多Bug
Convolution free backbone network: Pyramid transformer to improve the accuracy of target detection / segmentation and other tasks (with source code)
Rainbond 5.7.1 支持对接多家公有云和集群异常报警
A solution to PHP's inability to convert strings into JSON
全国爱眼教育大会,2022第四届北京国际青少年眼健康产业展会
1、强化学习基础知识点
随机推荐
Welcome to the game and win rich bonuses: Code Golf Challenge officially launched
插值查找的简单理解
Applet global configuration
Fundamentals - configuration file analysis
Leetcode (347) - top k high frequency elements
【数字IC验证快速入门】9、Verilog RTL设计必会的有限状态机(FSM)
Usaco3.4 "broken Gong rock" band raucous rockers - DP
E. Singhal and Numbers(质因数分解)
Model method
[record of question brushing] 1 Sum of two numbers
ByteDance dev better technology salon was successfully held, and we joined hands with Huatai to share our experience in improving the efficiency of web research and development
July 4, 2022 - July 10, 2022 (UE4 video tutorial MySQL)
实操演示:产研团队如何高效构建需求工作流?
mongodb文档间关系
全国爱眼教育大会,2022第四届北京国际青少年眼健康产业展会
无卷积骨干网络:金字塔Transformer,提升目标检测/分割等任务精度(附源代码)...
【愚公系列】2022年7月 Go教学课程 004-Go代码注释
Nprogress plug-in progress bar
Oracle tablespace management
Hong Kong stocks will welcome the "best ten yuan store". Can famous creative products break through through the IPO?