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;
    }
}
相关推荐
x***58707 小时前
后端分布式缓存一致性哈希,Java实现
分布式·缓存·哈希算法
wzy06237 小时前
Redis 哨兵模式中客户端访问服务器的过程详解
redis·sentinel
清静诗意7 小时前
Ubuntu Redis 安装与配置指南
linux·redis·ubuntu
q***4648 小时前
离线安装 Nginx
运维·数据库·nginx
T***u3338 小时前
后端缓存技术学习,Redis实战案例
redis·学习·缓存
0***R5158 小时前
前端构建工具缓存,node_modules
前端·缓存
我科绝伦(Huanhuan Zhou)8 小时前
SQL进阶必备:从计算字段到多表联结,让查询效率翻倍!
数据库·sql
梁萌8 小时前
缓存高可用架构-读缓存
redis·缓存·架构·高可用架构·读缓存
i***48619 小时前
Redis重大版本整理(Redis2.6-Redis7.0)
java·数据库·redis
r***86989 小时前
Redis 6.2.7安装配置
前端·数据库·redis