当前位置: 首页 > article >正文

redis:全局ID生成器实现

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

id的规律性太明显,

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

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

ID的组成:

符号位:1bit ,默认为0

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

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

@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;
    }
}

            


http://www.kler.cn/a/299762.html

相关文章:

  • 理解PLT表和GOT表
  • 2025春招 SpringCloud 面试题汇总
  • 【Redis】List 类型的介绍和常用命令
  • MV结构下设置Qt表格的代理
  • Celery
  • C# 与.NET 日志变革:JSON 让程序“开口说清话”
  • 【PHPStudy搭建Pikachu靶场】自定义网站站点和mysql端口本地搭建Pikachu靶场
  • 如何利用Linux提升工作效率和安全性?
  • Ubuntu源码安装gitlab13.7
  • Django 中的用户界面 - 创建速度计算器
  • Netty权威指南:Netty总结-编解码与序列化
  • centos 7 升级Docker 与Docker-Compose 到最新版本
  • 使用W外链创建微信短链接的方法
  • C# 数组定义和常用方法
  • 平板电脑开发软件思路——客户现场编译—SAAS本地化及未来之窗行业应用跨平台架构
  • 你真的了解电阻吗
  • 【文献阅读】Social Robot Detection Method with Improved Graph Neural Networks
  • java读取MultipartFile文件excel文件内容
  • 为什么windows系统cmd窗口中文会乱码?
  • qt 槽函数中获取发射信号的对象(widget)
  • 【题解单调队列优化dp】划分
  • 数据结构(14)——哈希表(1)
  • Winform实现石头剪刀布小游戏
  • 基于 SpringBoot 的实习管理系统
  • com.alibaba.druid.pool.DruidDataSource error
  • LVS负载均衡有几种工作方式?