使用Redis生成全局唯一ID/分布式唯一ID

全局唯一ID在开发中的应用很多,特别是在生成一些诸如订单编号,对ID的唯一性,安全性,高可用性,生成的高效性有严格的要求。

通常我们习惯使用数据库的自增字段来作为ID,但是,这种方式生成的ID规律性强,安全性较低,容易被人猜测出来。并且在数据很多的时候,往往需要对数据库进行分库分表操作,这种ID生成方式加大了分库分表的复杂度,因此生成一些要求安全性高,唯一性高的ID时,不采用数据库自动生成的方式。

这里使用Redis来生成一个全局的唯一ID,这种生成方式也可以用于分布式系统。

代码:

java 复制代码
@Component
public class RedisIDWorker {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    //序列号位数
    private static final int COUNT_BITS = 32;
    //开始时间戳
    private static final long BEGIN_TIMESTAMP = 1640995200L;
    public long nextId(String keyPrefix) {
        //1.生成时间戳[时间]
        LocalDateTime now = LocalDateTime.now();
        long nowSecond = now.toEpochSecond(ZoneOffset.UTC);
        long timestamp = nowSecond - BEGIN_TIMESTAMP;

        //2.生成序列号 [icr:前缀:年份:月:日]
        //2.1 获取当前日期 yyyy:MM:dd
        String day = now.format(DateTimeFormatter.ofPattern("yyy:MM:dd"));
        long count = stringRedisTemplate.opsForValue().increment("icr:" + keyPrefix + ":" + day);

        //3.拼接返回[时间:icr:前缀:年份:月:日]
        return timestamp << COUNT_BITS | count;
    }
}
相关推荐
睿思达DBA_WGX3 小时前
由 DB_FILES 参数导致的 dg 服务器无法同步问题
运维·数据库·oracle
袋鼠云数栈4 小时前
使用自然语言体验对话式MySQL数据库运维
大数据·运维·数据库·后端·mysql·ai·数据治理·数栈·data+ai
阿里云大数据AI技术4 小时前
数据 + 模型 驱动 AI Native 应用发展
大数据·数据库·人工智能
??? Meggie5 小时前
【SQL】使用UPDATE修改表字段的时候,遇到1054 或者1064的问题怎么办?
android·数据库·sql
一屉大大大花卷5 小时前
初识Neo4j之图数据库(二)
数据库·neo4j
天翼云开发者社区5 小时前
OLAP分析数据库适用场景及主流产品对比
数据库
Britz_Kevin5 小时前
从零开始的云计算生活——番外2,MySQL组复制
数据库·mysql·云计算·生活·#组复制
工藤学编程5 小时前
分库分表之实战-sharding-JDBC绑定表配置实战
数据库·分布式·后端·sql·mysql
hcvinh6 小时前
CANDENCE 17.4 进行元器件缓存更新
学习·缓存
墨着染霜华6 小时前
Caffeine的tokenCache与Spring的CaffeineCacheManager缓存区别
java·spring·缓存