当前位置:网站首页>基於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算法
- 數據庫自增
边栏推荐
猜你喜欢
随机推荐
[esp32 learning-2] esp32 address mapping
MySQL占用内存过大解决方案
Basic operations of databases and tables ----- modifying data tables
Basic operations of databases and tables ----- view data tables
Custom view puzzle getcolor r.color The color obtained by colorprimary is incorrect
JS 函数提升和var变量的声明提升
高通&MTK&麒麟 手机平台USB3.0方案对比
A possible cause and solution of "stuck" main thread of RT thread
JS数组常用方法的分类、理解和运用
Dead loop in FreeRTOS task function
RuntimeError: cuDNN error: CUDNN_STATUS_NOT_INITIALIZED
Basic operations of databases and tables ----- classification of data
[esp32 learning-1] construction of Arduino esp32 development environment
Fashion Gen: the general fashion dataset and challenge paper interpretation & dataset introduction
arduino获取数组的长度
List and set
機器學習--線性回歸(sklearn)
Reno7 60W super flash charging architecture
vim命令行笔记
Machine learning -- linear regression (sklearn)