当前位置:网站首页>基於Redis的分布式ID生成器
基於Redis的分布式ID生成器
2022-07-06 12:12: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算法
- 數據庫自增
边栏推荐
- imgcat使用心得
- Fashion Gen: the general fashion dataset and challenge paper interpretation & dataset introduction
- Kconfig Kbuild
- A possible cause and solution of "stuck" main thread of RT thread
- Kaggle competition two Sigma connect: rental listing inquiries (xgboost)
- XML file explanation: what is XML, XML configuration file, XML data file, XML file parsing tutorial
- Apprentissage automatique - - régression linéaire (sklearn)
- Arduino get random number
- C language, log print file name, function name, line number, date and time
- Unit test - unittest framework
猜你喜欢
IOT system framework learning
A possible cause and solution of "stuck" main thread of RT thread
ESP8266使用arduino连接阿里云物联网
Machine learning -- linear regression (sklearn)
几个关于指针的声明【C语言】
锂电池基础知识
Principle and implementation of MySQL master-slave replication
Kaggle competition two Sigma connect: rental listing inquiries
Fashion Gen: the general fashion dataset and challenge paper interpretation & dataset introduction
Symbolic representation of functions in deep learning papers
随机推荐
Arduino uno R3 register writing method (1) -- pin level state change
MP3mini播放模块arduino<DFRobotDFPlayerMini.h>函数详解
E-commerce data analysis -- User Behavior Analysis
Mp3mini playback module Arduino < dfrobotdfplayermini H> function explanation
Arm pc=pc+8 is the most understandable explanation
VSCode基础配置
History object
Pytoch implements simple linear regression demo
电商数据分析--用户行为分析
Imgcat usage experience
C language callback function [C language]
ES6语法总结--上篇(基础篇)
JS 函数提升和var变量的声明提升
Mysql database interview questions
锂电池基础知识
Vscode basic configuration
Time slice polling scheduling of RT thread threads
数据分析之缺失值填充(重点讲解多重插值法Miceforest)
Detailed explanation of Union [C language]
基于Redis的分布式锁 以及 超详细的改进思路