redis:全局ID生成器实现

问题:订单id不能设置为自增长的原因

id的规律性太明显,

受订单的数据量限制:若数据量过大,需要多张表存储,若自增会导致id重复

全局ID生成器:在分布式系统中用来生成全局唯一ID的工具

ID的组成:

符号位:1bit ,默认为0

时间戳: 31bit 以秒为单位,可以使用约69年

序列号:32bit,秒内的计数量,

java 复制代码
@Component
public class RedisIdWorker {
    @Resource
    private StringRedisTemplate stringRedisTemplate;
    //redis全局ID生成器策略
    /*
    *开始时间戳
     */
    private static final long BEGIN_TIMESTAMP=1704067200L;
    /*
    *序列号位数
     */
    private static final int COUNT_BITS=32;
    public long nextId(String keyPrefix) {
        //1.生成时间戳
        LocalDateTime now = LocalDateTime.now();
        long nowSecond = now.toEpochSecond(ZoneOffset.UTC);
        long timestamp = nowSecond - BEGIN_TIMESTAMP;
        //2.生成序列号,使用redis的自增
        //2.1.获取当天日期,redis的key中使用":",分层级
        String date = now.format(DateTimeFormatter.ofPattern("yyyy:MM:dd"));
        
        long count = stringRedisTemplate.opsForValue().increment("icr:" + keyPrefix + ":" + date);
        //3.组装返回,使用位运算
        return (timestamp << COUNT_BITS) | count;
    }
}
相关推荐
KIDULT°8 小时前
MySQL系列 (1):数据库原理
运维·数据库·mysql·云计算
我不是程序员三三8 小时前
透明加密软件偶发解密异常排错实录:文件时能打开时乱码
数据库·域智盾
snhna8 小时前
向量数据库深度实战:从 HNSW 到 pgvector、Milvus 选型与 RAG 落地
数据库·人工智能·python·postgresql·milvus
天行健,君子而铎9 小时前
数据分类分级的范式转换:从规则匹配到场景化高准确率一键部署
网络·数据库·安全
牛战士coding9 小时前
MySQL 读写分离完整链路:主从复制、多数据源与 @DS 路由
数据库·mysql
goehou10 小时前
MCP 查数实战:让 LLM 安全地查数据库(只读账号、SQL 校验、参数漂移)
数据库·ai·llm·教程·mcp·function calling
我不会插花弄玉10 小时前
7.函数【由浅入深-MySQL】
android·数据库·mysql
周小董11 小时前
[1369]Windows上安装PostgreSQL
数据库·windows·postgresql
一只积极向上的小咸鱼13 小时前
第一性原理思考:从拆解问题到用实验检验答案
数据库
这个DBA有点耶13 小时前
时序数据库InfluxDB高基数问题深度拆解:内存索引膨胀机制与OOM完整链路
数据库·架构·dba