当前位置:网站首页>基于Redis的分布式ID生成器
基于Redis的分布式ID生成器
2022-07-06 09:17:00 【阿杆.】
基于Redis的分布式ID生成器
ID自增策略
- 每天一个key,方便统计订单量
- ID构造是 时间戳 + 计数器
ID的组成部分
- 符号位:1bit,永远为0
- 时间戳:31bit,以秒为单位,从2022年1月开始计数,可以使用68年,也可以根据需求,修改为每分钟、每小时或每天的计数器,可以增大可用时间。
- 序列号:32bit,每天的计数器,支持每天产生2^32个不同ID,也可以根据需求,修改为每小时、每分钟或每秒的计数器,但需要和时间戳相配合,可以增大ID数量。
这里是以秒为单位的时间戳和以天为单位的序列化计数器组成的ID生成器。
package cn.sticki.common.redis.utils;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
/** * @author 阿杆 * @version 1.0 * @date 2022/6/20 20:29 */
@Component
public class RedisIdGenerator {
/** * 开始时间戳 */
private static final long BEGIN_TIMESTAMP = 1640995200L;
/** * 序列号的位数 */
private static final int COUNT_BITS = 32;
private final RedisTemplate<String, Long> redisTemplate;
public RedisIdGenerator(RedisTemplate<String, Long> redisTemplate) {
this.redisTemplate = redisTemplate;
}
@SuppressWarnings("ConstantConditions")
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"));
// 2.2 获取redis自增长值
long increment = redisTemplate.opsForValue().increment("id:" + keyPrefix + ":" + date);
// 3. 拼接并返回
return increment << COUNT_BITS | timestamp;
}
}
其他全局唯一ID生成策略
- UUID
- Redis自增
- snowflake算法
- 数据库自增
边栏推荐
- Encodermappreduce notes
- Analysis of charging architecture of glory magic 3pro
- C语言函数之可变参数原理:va_start、va_arg及va_end
- Arm pc=pc+8 is the most understandable explanation
- R & D thinking 01 ----- classic of embedded intelligent product development process
- Pytoch temperature prediction
- .elf .map .list .hex文件
- A possible cause and solution of "stuck" main thread of RT thread
- There are three iPhone se 2022 models in the Eurasian Economic Commission database
- 互聯網協議詳解
猜你喜欢
荣耀Magic 3Pro 充电架构分析
VSCode基础配置
ES6语法总结--下篇(进阶篇 ES6~ES11)
Detailed explanation of 5g working principle (explanation & illustration)
Gallery's image browsing and component learning
ESP8266使用arduino连接阿里云物联网
STM32型号与Contex m对应关系
FTP文件上传文件实现,定时扫描文件夹上传指定格式文件文件到服务器,C语言实现FTP文件上传详解及代码案例实现
小天才电话手表 Z3工作原理
Feature of sklearn_ extraction. text. CountVectorizer / TfidVectorizer
随机推荐
Embedded startup process
. elf . map . list . Hex file
Togglebutton realizes the effect of switching lights
冒泡排序【C语言】
JS正则表达式基础知识学习
Gallery's image browsing and component learning
Arduino gets the length of the array
荣耀Magic 3Pro 充电架构分析
IOT system framework learning
JS变量类型以及常用类型转换
Some concepts often asked in database interview
Pytoch implements simple linear regression demo
ES6 grammar summary -- Part 2 (advanced part es6~es11)
Esp8266 connects to bafayun (TCP maker cloud) through Arduino IED
Détails du Protocole Internet
open-mmlab labelImg mmdetection
ES6语法总结--下篇(进阶篇 ES6~ES11)
Oppo vooc fast charging circuit and protocol
Arduino uno R3 register writing method (1) -- pin level state change
Cannot change version of project facet Dynamic Web Module to 2.3.