一、全局唯一ID生成策略
- UUID (16进制,字符串结构,不是单调递增的)
- Redis自增(单调递增 ,长度也不大,数字类型,占据空间小)
- snowflake算法(雪花算法,不依赖于redis , 理论上来讲是比redis要更好。 缺点是对于时钟的依赖比较高的,如果时间不准确可能会出现异常的问题)
- 数据库自增
二、Redis自增ID策略: 整体结构 —— 时间戳 + 自增id
注意:
- 每天不同的key,方便统计一天处理了多少数据
- 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;
}
}