利用redis实现全局唯一ID

该文章介绍了一种在分布式环境中生成全局唯一ID的方法,通过结合Redis的自增特性,将时间戳和序列号结合。代码示例展示了如何使用Java的StringRedisTemplate进行操作,包括设置开始时间戳,利用Redis的opsForValue().increment方法生成序列号,并通过位运算组合成最终的全局唯一ID。
摘要由CSDN通过智能技术生成

注:该文章基于黑马程序员中《黑马点评》软件的学习

视频链接
涉及视频

P 48
P 49

全局唯一ID生成器

是一种再分布式系统下用来生成全局唯一ID的工具,一般需要满足唯一性 高可用 高性能 递增性 安全性

利用redis实现全局唯一ID

该全局唯一ID是一个Long类型的数据
其中该数据的第一位为符号位,一直为0
第2~32位为时间戳,存储当前时间减去设置的开始时间的时间差的数据
第33~64位为序列号,利用redis中设置string类型有自增长的特点生成
在这里插入图片描述

代码:
@Component
public class RedisIdWorker {
    /**
     * 开始时间戳 2020年1月一号的秒数
     */
    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);

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

代码的理解

1.关于BEGIN_TIMESTAMP的生成
+在这里插入图片描述
2.利用Redis中string类型存值设置自增长,设置的key由关键词(icr)+业务词(keyPrefix)+当前日期组成,方便后期对数据的分析和处理
在这里插入图片描述
3.拼接返回值,利用位运算,将时间戳左移32位后,形成二进制后面32位都是0,在和序列号或运算,做到将序列号拼接到时间戳的效果。
在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值