当前位置:网站首页>基于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算法
- 数据库自增
边栏推荐
- XML文件详解:XML是什么、XML配置文件、XML数据文件、XML文件解析教程
- 小天才电话手表 Z3工作原理
- STM32 how to locate the code segment that causes hard fault
- open-mmlab labelImg mmdetection
- Characteristics, task status and startup of UCOS III
- Encodermappreduce notes
- arduino UNO R3的寄存器写法(1)-----引脚电平状态变化
- Gallery之图片浏览、组件学习
- Detailed explanation of Union [C language]
- Comparaison des solutions pour la plate - forme mobile Qualcomm & MTK & Kirin USB 3.0
猜你喜欢
E-commerce data analysis -- User Behavior Analysis
电商数据分析--用户行为分析
Basic knowledge of lithium battery
Basic use of pytest
Kaggle competition two Sigma connect: rental listing inquiries
RT thread API reference manual
机器学习--线性回归(sklearn)
Mp3mini playback module Arduino < dfrobotdfplayermini H> function explanation
E-commerce data analysis -- salary prediction (linear regression)
机器学习--决策树(sklearn)
随机推荐
Principle and implementation of MySQL master-slave replication
Fashion Gen: the general fashion dataset and challenge paper interpretation & dataset introduction
Redis interview questions
Understanding of AMBA, AHB, APB and Axi
Detailed explanation of 5g working principle (explanation & illustration)
gcc 编译选项
MySQL START SLAVE Syntax
Amba, ahb, APB, Axi Understanding
OSPF message details - LSA overview
arduino UNO R3的寄存器写法(1)-----引脚电平状态变化
MP3mini播放模块arduino<DFRobotDFPlayerMini.h>函数详解
STM32 如何定位导致发生 hard fault 的代码段
Apprentissage automatique - - régression linéaire (sklearn)
RuntimeError: cuDNN error: CUDNN_STATUS_NOT_INITIALIZED
GNN的第一个简单案例:Cora分类
Comparison of solutions of Qualcomm & MTK & Kirin mobile platform USB3.0
A possible cause and solution of "stuck" main thread of RT thread
ES6 grammar summary -- Part 2 (advanced part es6~es11)
JS正则表达式基础知识学习
Inline detailed explanation [C language]