Java 基于 redisTemplate 生成序列号格式为 JS+年月日+五位数序列如超出99999则恢复为初始0
以下是使用 Java 基于 redisTemplate 生成序列号的示例代码:
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.support.atomic.RedisAtomicLong;
public class SerialNumberGenerator {
private RedisTemplate<String, Long> redisTemplate;
private RedisAtomicLong serialNumber;
public SerialNumberGenerator(RedisTemplate<String, Long> redisTemplate) {
this.redisTemplate = redisTemplate;
String today = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
String key = "serialNumber:" + today;
serialNumber = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
serialNumber.expireAt(LocalDate.now().plusDays(1).atStartOfDay().toInstant(ZoneOffset.UTC));
}
public String generate() {
long number = serialNumber.incrementAndGet();
if (number > 99999) {
serialNumber.set(0);
number = serialNumber.incrementAndGet();
}
String today = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
return "JS" + today + String.format("%05d", number);
}
}
在这个示例中,我们使用了 RedisAtomicLong 类来生成序列号。我们在构造函数中指定了每天一个序列号的 key,然后设置了过期时间为当天的最后一秒。在 generate() 方法中,我们先递增序列号,如果超过了 99999,则将序列号设置为 0,重新开始计数。最后,我们将序列号拼接成指定格式的字符串,返回给调用方。
你可以将上面的代码添加到你的项目中,并使用以下代码来测试:
RedisTemplate<String, Long> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(new LettuceConnectionFactory());
redisTemplate.afterPropertiesSet();
SerialNumberGenerator generator = new SerialNumberGenerator(redisTemplate);
for (int i = 0; i < 100000; i++) {
System.out.println(generator.generate());
}
这个测试会连续生成 100000 个序列号,你可以观察到序列号的格式和递增规律
原文地址: http://www.cveoy.top/t/topic/egH1 著作权归作者所有。请勿转载和采集!