简单实用!利用Redis轻松实现高并发全局ID生成器

Redis作为高性能的简单KV数据库,并且操作还是实用松实生成原子性的,所以用来做支持高并发的利用发号器十分合适。
本文给大家介绍3种常见的轻全局器全局ID生成方式。
1、现高全局递增ID
目标:一直递增的简单全局ID。
/
*** 一直递增的实用松实生成全局id
** @param redisTemplate redis客户端对象
* @param busId 业务id,可以按需配置
* @param step 步长,利用即每次递增的轻全局器间隔
*/
public static String getNo(RedisTemplate redisTemplate, String busId, int step) {
//保存redis中的key,注意不要重复
String redisKey = "uniqueNo_";
//利用increment即redis原生incrBy命令的现高原子性特性生成递增的序列号
Long increment = redisTemplate.opsForValue().increment(redisKey, step);
if (increment == null) {
throw new RuntimeException("redis命令执行失败");
}
//业务id+递增id,如果需要纯数字,简单去掉业务id即可
return busId + increment;
}2、实用松实生成以天为分割的利用全局ID
目标:生成格式为 yyyyMMdd + 递增序列号的服务器租用全局ID。
/
*** 以天为间隔的轻全局器递增序列号
* @param redisTemplate redis客户端对象
* @param busId 业务id,可以按需配置
* @param step 步长,现高即每次递增的间隔
*/
public static String getNo(RedisTemplate redisTemplate, String busId, int step) {
//当天日期,比如20221226
String date = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
//保存redis中的key,注意不要重复
String redisKey = "uniqueNo_" + date;
//利用increment即redis原生incrBy命令的原子性特性生成递增的序列号
Long increment = redisTemplate.opsForValue().increment(redisKey, step);
if (increment == null) {
throw new RuntimeException("redis命令执行失败");
}
if (step == increment.intValue()) {
//首次执行时,给redisKey设置ttl,第二天这个key就可以被redis自动删除
redisTemplate.expire(redisKey, 25, TimeUnit.HOURS);
}
//组合 20221226 + 业务id + 0001(可以根据需要自由调整序列号的长度)
return date + busId + String.format("%04d", increment);
}3、批量获取ID
有时我们需要批量的获取递增ID,比如给一批订单号设置ID。
/
*** 批量获取id
** @param redisTemplate redis客户端对象
* @param busId 业务id,可以按需配置
* @param size 获取的id个数,与步长类似
*/
public static List getNoByGroup(RedisTemplate redisTemplate, String busId, int size) {
//保存redis中的key,注意不要重复
String redisKey = "uniqueNo_group";
//设置步长为size,相当于一次性申请size个id
Long increment = redisTemplate.opsForValue().increment(redisKey, size);
if (increment == null) {
throw new RuntimeException("redis命令执行失败");
}
long begin = increment - Long.parseLong(size + "");
List rs = new ArrayList<>();
for (long i = begin + 1; i <= increment; i++) {
rs.add(busId + i);
}
return rs;
}总结
无论我们需要什么格式的云服务器提供商ID,其实只要我们把握住其中的核心:incrBy命令,根据其原子性的特性,就可以生成我们需要的全局ID。
但是需要注意的是,虽然incrBy命令是原子性的,但是通过组合键进行组合时,其实是破坏了这种原子性。如果有特殊的ID格式要求,务必要进行充分的测试。
相关文章
- 摘要:随着科技的发展,固态硬盘SSD)作为一种新型的存储设备,逐渐受到广大用户的青睐。相较于传统的机械硬盘,固态硬盘具备更高的读写速度和更低的能耗,能够显著提升电脑系统的性能。本文将为...2025-11-04
 NixImports:一款功能强大的.NET代码程序加载工具
关于NixImportsNixImports是一款功能强大的.NET代码程序加载工具,该工具专为恶意软件研究人员或安全分析专家设计,可以帮助我们对恶意软件或系统安全进行研究和分析。值得一提的是,该工具2025-11-04
说好了写 TienChin 项目的,最近这个分布式事务算是一个支线任务吧,今天是最后一篇,松哥再来一个短篇和小伙伴们总结一下分布式事务。首先先说一个大原则:分布式事务能不用就不要用,毕竟这个用起来还是2025-11-04- 复制makePREFIX=/usr&& makePREFIX=/usrinstall 1.2.3.4.2025-11-04
 - 摘要:随着电脑在我们生活中的日益普及和重要性的增加,人们对电脑的个性化需求也越来越高。在这篇文章中,我们将为大家介绍一种制作个性化电脑印章的方法——使用激光印章。激光印章不仅可以满足个性...2025-11-04
 - 复制#chown-Rnagios:nagios/usr/local/nagios/nagiosql 1.2.2025-11-04
 

最新评论