使用redis RedisAtomicLong 生成订单号
背景产品需求要生成有序的订单 YY+6位日期+4位序号由0001-9999组成 且每天都是从0001开始公司系统有部署多台服务,这需要一个有序的序列不能重复而且得保证获取时的原子性这里 我们考虑使用了redisIncr 这个命令Redis Incr 命令能将 key 中储存的数字值增一,这样就不会取到重复的编号。使用package com.redis.service.impl;import jav
·
背景
产品需求要生成有序的订单 YY+6位日期+4位序号 由0001-9999组成 且每天都是从0001开始
公司系统有部署多台服务,这需要一个有序的序列不能重复而且得保证获取时的原子性这里 我们考虑使用了redis Incr 这个命令
Redis Incr 命令能将 key 中储存的数字值增一,这样就不会取到重复的编号。
使用
package com.redis.service.impl;
import java.util.concurrent.TimeUnit;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.support.atomic.RedisAtomicLong;
import org.springframework.stereotype.Service;
@Service
@SuppressWarnings(value = {"rawtypes" })
@Slf4j
public class test {
@Autowired
@Qualifier("redisTemplate")
private RedisTemplate redisTemplate;
/**
* 对取值补 0
*
* @param keyName
* @param lenght
* 补足多少位
* @return
*/
public String generateOrderNum(String keyName, int lenght) {
Integer serialNumber = getSerialNumber(keyName);
return String.format("%0" + lenght + "d", serialNumber);
}
/**
* 数量自增 已设置过期时间
*
* @param keyName
* @return
*/
public Integer getSerialNumber(String keyName) {
keyName = "SerialNumber:" + keyName;
try {
RedisAtomicLong entityIdCounter = new RedisAtomicLong(keyName, redisTemplate.getConnectionFactory());
Long incr = entityIdCounter.getAndIncrement();
if (null == incr || incr.longValue() == 0) {// 初始设置过期时间
// 设置过期时间 24小时
entityIdCounter.expire(24, TimeUnit.HOURS);
// 这里取第二次 incr 就是从1开始了,默认从0开始
incr = entityIdCounter.getAndIncrement();
}
log.debug(keyName + "==========" + incr);
return incr.intValue();
} catch (Exception e) {
log.error("======redisIncr======", e);
}
return null;
}
public void testMain(String[] args) {
String keyName = "test11";
for (int i = 0; i < 100; i++) {
System.out.println(generateOrderNum(keyName, 4));
}
}
}
更多推荐
已为社区贡献2条内容
所有评论(0)