首页 > 数据库 >使用 Redis 实现自增流水号

使用 Redis 实现自增流水号

时间:2023-08-04 13:33:13浏览次数:33  
标签:自增 return String seq Redis 流水号 key 序列化

使用 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);

}

}

1

获取递增:

/**

* 获取递增

* @param key

* @return

*/

public long incr(String key){

return stringRedisTemplate.opsForValue().increment(key);

}

1

具体实现:

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());

1

输出结果:

202202150001

202202150002

202202150003

202202150004

1

本地 Redis 库中的数据:

扩展知识

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

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

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

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

- END -


标签:自增,return,String,seq,Redis,流水号,key,序列化
From: https://blog.51cto.com/u_16111396/6960796

相关文章

  • redis删除key
    [root@izuf6byjhd4wd8vdncreg8z~]#locateredis-server/usr/local/redis/bin/redis-server/usr/local/redis/src/redis-server[root@izuf6byjhd4wd8vdncreg8z~]#/usr/local/redis/bin/redis-cli127.0.0.1:6379>keys"SCHEDULED:SKU"(emptyarray)127......
  • 虹科分享 | 妙招频出,Redis 企业版这样解决缓存问题
    为什么企业需要数字化?数字化转型的根本目的是什么?数据的缓存为什么如此的重要?虹科RedisEnterprise又能够在哪些方面助力企业解决数据处理难题?当前数据库缓存面临的挑战:使用当前数据库实现速度和可扩展性实现满足用户期望所需的数据性能并不容易。企业需要应对遗留基础设施、缓慢......
  • 虹科干货 | DevOps 团队为什么独独青睐 Redis Enterprise ?
    快速部署是保障成功的DevOps的关键要素。虹科RedisEnterprise提供了一种快速的数据库。DevOps团队面临的挑战1.提高应用程序处理速度,赢得商业竞争许多企业中,DevOps团队(DevOps是一组过程、方法与系统的统称,用于促进开发、技术运营和质量保障部门之间的沟通、协作与整合)正在引......
  • windows redis集群搭建
    一、安装5.0以后版本的链接:https://pan.baidu.com/s/1uXj_46ausPASNjDMxbNAQQ提取码:egpf二、准备多个redis环境1、新建一个父文件夹(例如:redis-cluster)2、将redis安装目录拷贝多份,放到二级目录,并分别以端口号命名 3、编辑每个环境的redis.windows.conf文件内容 4、进......
  • Redis从入门到放弃(8):哨兵模式
    在前面的文章中介绍了Redis的主从复制,但主从复制存在一定的缺陷。如果Master节点宕机,因为不具备自动恢复功能,需要人工干预,那么在这个干预过程中Redis将不可用。为了解决这一问题,Redis官方推荐一种高可用方案:哨兵模式(Sentinel)。1、什么是哨兵模式?哨兵模式是Redis的高可用解决方案......
  • #yyds干货盘点#Redis分布式锁正确打开方式
    1、为什么要有分布式锁?JUC提供的锁机制,可以保证在同一个JVM进程中同一时刻只有一个线程执行操作逻辑;多服务多节点的情况下,就意味着有多个JVM进程,要做到这样,就需要有一个中间人;分布式锁就是用来保证在同一时刻,仅有一个JVM进程中的一个线程在执行操作逻辑;换句话说,JUC的锁和分布式锁都......
  • Redis从入门到放弃(8):哨兵模式
    在前面的文章中介绍了Redis的主从复制,但主从复制存在一定的缺陷。如果Master节点宕机,因为不具备自动恢复功能,需要人工干预,那么在这个干预过程中Redis将不可用。为了解决这一问题,Redis官方推荐一种高可用方案:哨兵模式(Sentinel)。1、什么是哨兵模式?哨兵模式是Redis的高可用解决方......
  • pyspark 环境搭建和相关操作redis ,es
    一.环境搭建1.创建虚拟环境,指定python包2.切换到虚拟环境,安装你所需要的python相关模块包3.把整个虚拟环境打成.zip4.将zip上传的hadfs5.spark-submit指定python包的路径可以参考 https://dandelioncloud.cn/article/details/1589470996832964609二.pyspark数据r......
  • Redis持久化
    RDB持久化Redis可以通过创建快照来获得存储在内存里面的数据在 某个时间点 上的副本。Redis创建快照之后,可以对快照进行备份,可以将快照复制到其他服务器从而创建具有相同数据的服务器副本(Redis主从结构,主要用来提高Redis性能),还可以将快照留在原地以便重启服务器的时候使......
  • A07、redis
    review#Spring全家桶#Spring#中间件回顾1.springboot特性版本锁定继承官方的parent起步依赖完成某个功能的坐标集合体自动装配可以通过默认规则创建对象2.yml配置文件简单对象/map集合3.整合junit4.整合ssm5.整合日志今日目标1.掌握......