以下是使用 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 个序列号,你可以观察到序列号的格式和递增规律

Java 基于 redisTemplate 生成序列号格式为 JS+年月日+五位数序列如超出99999则恢复为初始0

原文地址: http://www.cveoy.top/t/topic/egH1 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录