【Redis】生成全局唯一id

1,255 阅读1分钟

1.全局唯一id

1.1全局唯一id

全局ID生成器,是一种在分布式系统下用来生成全局唯一ID的工具,一般要满足下列特性:

1.唯一性 2.递增性 3.安全性 4.高性能 5.高可用

2.构造方式

redis 字符串自带递增功能。

为了增加ID的安全性,我们可以不直接使用Redis自增的数值,而是拼接一些其它信息。

3.生成策略

根据业务和日期每天生成一个key,方便统计订单量ID构造是(时间戳 + 计数器)

4.代码实现

@Component
public class RedisIdWorker {
    /**
     * 开始时间戳
     */
    private static final long BEGIN_TIMESTAMP = 1640995200L;
    /**
     * 序列号的位数
     */
    private static final int COUNT_BITS = 32;

    private StringRedisTemplate stringRedisTemplate;

    public 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"));
        // 2.2.自增长
        Long count = stringRedisTemplate.opsForValue().increment("icr:" + keyPrefix + ":" + date);
        if (Objects.nonNull(count)){

        }
        // 3.拼接并返回
        return timestamp << COUNT_BITS | count;
    }
}