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

全局唯一id生成

工具类

@Component
public class RedisIdWorker {/*** 开始时间戳(2023-01-01)*/private static final long BEGIN_TIMESTAMP = 1672531200L;/*** 序列号的位数(32位)*/private static final int COUNT_BITS = 32;/*** 生成分布式 ID* @param keyPrefix ID 的业务前缀,如 "YYD"、"QBD" 等。如果为空或 null,默认使用 "ASD"* @return 全局唯一递增的 Long 型 ID*/public static long nextId(String keyPrefix) {// 如果 keyPrefix 为 null 或空字符串,则使用默认值 "ASD"String safePrefix = (StrUtil.isBlank(keyPrefix)) ? "ASD" : keyPrefix;LocalDateTime now = LocalDateTime.now();long nowSecond = now.toEpochSecond(ZoneOffset.UTC);long timestamp = nowSecond - BEGIN_TIMESTAMP;String date = now.format(DateTimeFormatter.ofPattern("yyyy:MM:dd"));// 构建 redis的KeyString redisKey = "ICR:" + safePrefix + ":" + date;long count = RedissonUtil.incrementWithExpire(redisKey,Duration.ofDays(2)); //缓存两天// 拼接返回结果:时间戳左移 COUNT_BITS 位,与自增序列进行按位或return (timestamp << COUNT_BITS) | count;}/*** 生成带业务前缀的 ID 字符串* @param keyPrefix 如 "QBD", "YYD",允许为 null 或空字符串,会自动替换为 "ASD"* @return 带前缀的字符串 ID,如 "QBD1234567890"*/public static String nextIdWithPrefix(String keyPrefix) {long id = nextId(keyPrefix); // 调用 nextId,已处理 null 和空字符串String safePrefix = (StrUtil.isEmpty(keyPrefix)) ? "ASD" : keyPrefix;return safePrefix + id;}
}

redis工具类

    /*** 自增并设置过期时间(仅当 value == 1 的时候)* @param key 要自增的 key* @param expireDuration 过期时间(如 Duration.ofDays(3))* @return 自增后的值*/public static long incrementWithExpire(String key, Duration expireDuration) {RAtomicLong atomicLong = redissonClient.getAtomicLong(key);long value = atomicLong.incrementAndGet();if (value == 1) {// Duration 转换为 Instant:当前时间 + 持续时间Instant expirationTime = Instant.now().plus(expireDuration);atomicLong.expire(expirationTime); // 设置过期时间}return value;}
http://www.lryc.cn/news/586371.html

相关文章:

  • JavaScript加强篇——第七章 浏览器对象与存储要点
  • 深度学习-卷积化
  • 深入详解:决策树在医学影像领域心脏疾病诊断的应用及实现细节
  • Vue框架之钩子函数详解
  • ngrok使用
  • 企业商业秘密保卫战:经营信息类案件维权全攻略
  • 第三章第三节 GPIO 输入
  • Unity开发中常用的洗牌算法
  • 程序改错---字符串
  • 【离线数仓项目】——电商域DIM层开发实战
  • [特殊字符] 实时数据洪流突围战:Flink+Paimon实现毫秒级分析的架构革命(附压测报告)——日均百亿级数据处理成本降低60%的工业级方案
  • Spring Boot 2.4+中bootstrap.yml加载顺序的源码深度解析
  • 北京高铁3h可达城市周末游攻略
  • 堆内存的详细结构以及java中内存溢出和排查方式
  • 大模型量化相关
  • 钉钉企业应用开发实战:从零构建组织级业务工具
  • cuDNN 的 IMPLICIT_GEMM 算法
  • bp使用爆破模块破解pikachu的登陆密码
  • C++11之emplace
  • 【C++】封装红黑树模拟实现set和map
  • 支付宝购买功能的使用
  • EPLAN 电气制图(七):电缆设计全攻略
  • 从0设计一个短链接服务:如何实现尽可能短、可变长的短网址系统?
  • NLP:RNN文本生成案例分享
  • 【MediaSoup】MS_DUMP打印转换为PLOGI的形式
  • CTFHub————Web{信息泄露[Git泄露(Stash、Index)]}
  • React - createPortal
  • React useState原理解密:从源码到实战
  • python的婚纱影楼管理系统
  • 【深度学习】常见评估指标Params、FLOPs、MACs