使用redis实现自增序列
来源:
https://www.cnblogs.com/shigj/p/11215262.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | public class TestService { @Resource RedisTemplate<String, Object> redisTemplate; public String getId() { SimpleDateFormat sdf= new SimpleDateFormat( "yyyyMMdd" ); Date date= new Date(); String formatDate=sdf.format(date); String key= "key" +formatDate; Long incr = getIncr(key, getCurrent2TodayEndMillisTime()); if (incr== 0 ) { incr = getIncr(key, getCurrent2TodayEndMillisTime()); //从001开始 } DecimalFormat df= new DecimalFormat( "000" ); //三位序列号 return formatDate+df.format(incr); } public Long getIncr(String key, long liveTime) { RedisAtomicLong entityIdCounter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory()); Long increment = entityIdCounter.getAndIncrement(); if (( null == increment || increment.longValue() == 0 ) && liveTime > 0 ) { //初始设置过期时间 entityIdCounter.expire(liveTime, TimeUnit.MILLISECONDS); //单位毫秒 } return increment; } //现在到今天结束的毫秒数 public Long getCurrent2TodayEndMillisTime() { Calendar todayEnd = Calendar.getInstance(); // Calendar.HOUR 12小时制 // HOUR_OF_DAY 24小时制 todayEnd.set(Calendar.HOUR_OF_DAY, 23 ); todayEnd.set(Calendar.MINUTE, 59 ); todayEnd.set(Calendar.SECOND, 59 ); todayEnd.set(Calendar.MILLISECOND, 999 ); return todayEnd.getTimeInMillis()- new Date().getTime(); } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构