使用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;
    }
}
相关推荐
一只自律的鸡3 小时前
【MySQL】第二章 基本的SELECT语句
数据库·mysql
liliangcsdn4 小时前
如何使用python创建和维护sqlite3数据库
数据库·sqlite
TDengine (老段)10 小时前
TDengine 数学函数 DEGRESS 用户手册
大数据·数据库·sql·物联网·时序数据库·iot·tdengine
TDengine (老段)10 小时前
TDengine 数学函数 GREATEST 用户手册
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
RoboWizard11 小时前
扩容刚需 金士顿新款Canvas Plus存储卡
java·spring·缓存·电脑·金士顿
安当加密11 小时前
云原生时代的数据库字段加密:在微服务与 Kubernetes 中实现合规与敏捷的统一
数据库·微服务·云原生
爱喝白开水a11 小时前
LangChain 基础系列之 Prompt 工程详解:从设计原理到实战模板_langchain prompt
开发语言·数据库·人工智能·python·langchain·prompt·知识图谱
想ai抽11 小时前
深入starrocks-多列联合统计一致性探查与策略(YY一下)
java·数据库·数据仓库
武子康11 小时前
Java-152 深入浅出 MongoDB 索引详解 从 MongoDB B-树 到 MySQL B+树 索引机制、数据结构与应用场景的全面对比分析
java·开发语言·数据库·sql·mongodb·性能优化·nosql
longgyy11 小时前
5 分钟用火山引擎 DeepSeek 调用大模型生成小红书文案
java·数据库·火山引擎