使用 Redis 实现自增流水号

该博客介绍了如何利用Redis的高效内存操作特性来生成符合特定格式的自增流水号,如202202150001。通过创建一个SequenceUtil工具类,结合getCurrentDate()方法获取当前日期,并使用incr()方法实现递增,确保流水号的唯一性和顺序性。文章还提及了Redis的两种序列化策略,解释了为什么StringRedisTemplate更适合进行数值自增操作。
摘要由CSDN通过智能技术生成

使用 Redis 实现自增流水号

场景需求

项目上有个场景是客餐申请审核以后需要生成一个流水号,规则为:202202150001,202202150002,前几位为年月日,后四位依次递增。

想到 Redis 是基于内存操作的,而且速度比较快,也不占用数据库资源。于是便采用 Redis 实现的方式。

代码实现

形成规则工具类:

/**
 * @author Greenarrow
 * @date 2022-02-15 8:01
 **/
public class SequenceUtil {

    static final int DEFAULT_LENGTH = 4;

    /**
     * 格式化 key 
     * @param seq
     * @return
     */
    public static String getSequence(Long seq) {
        String str = String.valueOf(seq);
        int len = str.length();
        // 取决于业务规模
        if (len >= DEFAULT_LENGTH) {
            return str;
        }
        int rest = DEFAULT_LENGTH - len;
        StringJoiner stringJoiner = new StringJoiner("");
        for (int i = 0; i < rest; i++) {
            stringJoiner.add("0");
        }
        stringJoiner.add(str);
        return stringJoiner.toString();
    }

    /**
     * 获取当前年月日
     * @return
     */
    public static String getCurrentDate(){
        LocalDate localDate = LocalDate.now();
        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyyMMdd");
        return df.format(localDate);
    }
}

获取递增:

  /**
     * 获取递增
     * @param key
     * @return
     */
    public long incr(String key){
        return stringRedisTemplate.opsForValue().increment(key);
    }

具体实现:

        String currentDate = SequenceUtil.getCurrentDate();
        String key = "serial.number:" + currentDate;
        long sequence = redisService.incr(key);
        String seq = SequenceUtil.getSequence(sequence);
        StringJoiner sj = new StringJoiner("");
        sj.add(currentDate).add(seq);
        System.out.println(sj.toString());

输出结果:

202202150001
202202150002
202202150003
202202150004

本地 Redis 库中的数据:

扩展知识

Redis 序列化的策略有两种,分别是 StringRedisTemplateRedisTemplate,其中StringRedisTemplate 用于操作字符串,RedisTemplate 使用的是JDK 默认的二进制序列化。

大家都知道 redis 序列化是将 key,value 值先转换为流的形式,再存储到 redis 中。

RedisTemplate 是使用的 JdkSerializationRedisSerializer 序列化,序列化后的值包含了对象信息,版本号,类信息等,是一串字符串,所以无法进行数值自增操作。

StringRedisTemplate 序列化策略是字符串的值直接转为字节数组,所以存储到 redis 中是数值,所以可以进行自增操作。

- END -

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值