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;
    }
}
相关推荐
yashuk20 小时前
Redis的安装教程(Windows+Linux)【超详细】
linux·数据库·redis
lzp079120 小时前
mysql之联合索引
数据库·mysql
qq56801807620 小时前
【MySQL】超详细MySQL常用日期格式转换函数、字符串函数、聚合函数(最新版)
数据库·mysql
中杯可乐多加冰20 小时前
Serverless 时代的内核革命——华为 openYuanrong 深度解析 异构多级缓存与 D2D 高速传输实测
缓存·华为·开源·serverless·openyuanrong
逆境不可逃20 小时前
【从零入门23种设计模式21】行为型之空对象模式
java·开发语言·数据库·算法·设计模式·职场和发展
灰阳阳20 小时前
Redis的缓存机制
数据库·redis·缓存
wenlonglanying20 小时前
【Redis】设置Redis访问密码
数据库·redis·缓存
盐水冰20 小时前
【烘焙坊项目】后端搭建(6)- 店铺状态设置
java·redis
@insist12320 小时前
软件设计师-数据库技术基础:系统组成、三级模式两级映像与数据模型核心考点解析
数据库·软考·软件设计师
咖啡の猫21 小时前
Redis命令-List命令
windows·redis·list