当前位置:网站首页> 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生成器内容请搜索软件开发网以前的文章或继续浏览下面的相关文章希望大家以后多多支持软件开发网!
边栏推荐
- 【愚公系列】2022年7月 Go教学课程 004-Go代码注释
- 【数字IC验证快速入门】8、数字IC中的典型电路及其对应的Verilog描述方法
- Is it safe for CICC fortune to open an account online?
- 【数字IC验证快速入门】9、Verilog RTL设计必会的有限状态机(FSM)
- Leetcode: binary tree 15 (find the value in the lower left corner of the tree)
- document方法
- [C language] three implementations of quick sorting and optimization details
- Wechat applet regular expression extraction link
- National Eye Care Education Conference, 2022 the Fourth Beijing International Youth eye health industry exhibition
- Mongodb/ document operation
猜你喜欢

Rainbow 5.7.1 supports docking with multiple public clouds and clusters for abnormal alarms

小程序事件绑定
![[quick start of Digital IC Verification] 3. Introduction to the whole process of Digital IC Design](/img/92/7af0db21b3d7892bdc5dce50ca332e.png)
[quick start of Digital IC Verification] 3. Introduction to the whole process of Digital IC Design

2022 Beijing eye health products exhibition, eye care products exhibition, China eye Expo held in November

【愚公系列】2022年7月 Go教学课程 004-Go代码注释

零道云新UI设计中

Applet page navigation

Zero cloud new UI design

2.8 basic knowledge of project management process

Leetcode skimming: binary tree 17 (construct binary tree from middle order and post order traversal sequence)
随机推荐
信息学奥赛一本通 1339:【例3-4】求后序遍历 | 洛谷 P1827 [USACO3.4] 美国血统 American Heritage
document方法
Leetcode (695) - the largest area of an island
Informatics Olympiad 1337: [example 3-2] word search tree | Luogu p5755 [noi2000] word search tree
Applet project structure
[Yugong series] go teaching course in July 2022 004 go code Notes
Solve the problem that the database configuration information under the ThinkPHP framework application directory is still connected by default after modification
3.3 project evaluation
Mongodb/ document operation
强化学习-学习笔记4 | Actor-Critic
Welcome to the game and win rich bonuses: Code Golf Challenge officially launched
Leetcode brush questions: binary tree 11 (balanced binary tree)
Which securities is better for securities account opening? Is online account opening safe?
Mysql频繁操作出现锁表问题
[record of question brushing] 1 Sum of two numbers
CTF逆向基础
点云文件的.dat文件读取保存
Some problems encountered in cocos2d-x project summary
Notes on key vocabulary in the English original of the biography of jobs (12) [chapter ten & eleven]
Unity编辑器扩展 UI控件篇