一、全局唯一ID生成策略
UUID (16进制,字符串结构,不是单调递增的)
Redis自增(单调递增 ,长度也不大,数字类型,占据空间小)
snowflake算法(雪花算法,不依赖于redis , 理论上来讲是比redis要更好。 缺点是对于时钟的依赖比较高的,如果时间不准确可能会出现异常的问题)
数据库自增
二、Redis自增ID策略: 整体结构 —— 时间戳 + 自增id
@Component
public class RedisIdWorker {
/**
* 开始时间戳 下面数值来源于2022 1月1日 0时0分0秒 获取的时间戳为基准
*/
private static final long BEGIN_TIMESTAMP = 1640995200L;
/**
* 序列号的位数
*/
private static final int COUNT_BITS = 32 ;
private StringRedisTemplate stringRedisTemplate;
private 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;
}
}
本文探讨了全局唯一ID的生成策略,包括UUID、Redis自增ID、Snowflake算法和数据库自增ID。重点介绍了使用Redis实现自增ID的策略,通过结合时间戳和自增序列号生成唯一ID。代码示例展示了如何利用Redis进行ID生成,确保在特定日期内的唯一性。
2575

被折叠的 条评论
为什么被折叠?



