使用RedisAtomicLong和StringRedisTemplate生成递增原子序列号
1. 参考链接
2. 为什么要使用redis生成原子序列号,而不是用java自带的atomic包一样进行原子性操作
- AtomicLong只能在一个应用中使用;
- RedisAtomicLong可以在所有与Redis有连接的应用中使用;
3. 为什么能够保证原子性
- RedisAtomicLong的getAndIncrement使用的是redis的incrBy命令。
- redis后台服务是串行的单线程执行,不存在并发,即多线程调用Incr/incrby方法,在redis服务器上仍然是串行的单线程执行,不存在并发,所以这俩命令都是原子自增、线程安全的。
- Redis Incrby 命令将 key 中储存的数字加上指定的增量值;Redis Incr 命令将 key 中储存的数字值增1;
4. 实现代码
@Autowired
StringRedisTemplate redis;
String taskNoKey = "20240706";
long num = this.incr(taskNoKey, redis.getConnectionFactory()) + 1;
public static Long incr(String key, RedisConnectionFactory redisConnectionFactory) {
RedisAtomicLong entityIdCounter = new RedisAtomicLong(key, redisConnectionFactory);
Long increment = entityIdCounter.getAndIncrement();
if ((null == increment || increment.longValue() == 0)) {
entityIdCounter.expire(1, TimeUnit.DAYS);
}
if (increment > 9999) {
}
return increment;
}