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;
    }
}
相关推荐
求学中--38 分钟前
MySQL 数据库完整操作命令与使用指南
数据库·sql·mysql·oracle
code bean1 小时前
【CMake】为什么需要清理 CMake 缓存文件?深入理解 CMake 生成器切换机制
java·spring·缓存
DKunYu2 小时前
误删数据库表导致出现1146报错
数据库
武子康2 小时前
Java-193 Spymemcached 深入解析:线程模型、Sharding 与序列化实践全拆解
java·开发语言·redis·缓存·系统架构·memcached·guava
xinyu_Jina3 小时前
动态媒体资源解析器:PWA、离线缓存与用户数据隐私的架构设计
缓存·媒体
惜分飞3 小时前
sql server 事务日志备份异常恢复案例---惜分飞
前端·数据库·php
sunddy_x3 小时前
MySQL入门
数据库·mysql
_Minato_3 小时前
数据库知识整理——数据库设计的步骤
数据库·经验分享·笔记·软考
坐吃山猪4 小时前
BrowserUse14-源码-ScreenShot模块-整理
linux·数据库·python
廋到被风吹走4 小时前
【数据库】【MySQL】各种 JOIN 的特点及应用场景
数据库·mysql