Redis 串行生成顺序编码的方法实现

场景:针对于分布式并发环境,易出现编码生成重复问题

方案特点:串行操作可避免阻塞加锁,处理效率更高

具体解决方案

private final static String ENTERPRISE_CODE = "enterpriseCode";

@Resource
private RedisTemplate redisTemplate;

private String generateCode() {
    String code;
    if (!redisTemplate.hasKey(ENTERPRISE_CODE)) {
        // Mybatis-Plus 查询数据库中企业编码最大值
        EnterprisePO enterprise = enterpriseService.getOne(
            Wrappers.<EnterprisePO>lambdaQuery()
                .orderByDesc(EnterprisePO::getCode)
                .last("limit 1"));
        // 缓存企业编码
        if (ObjectUtils.isNotEmpty(enterprise)) {
            // 如果 key 不存在才 set 避免并发重复 set,setIfAbsent() 属于原子操作
            redisTemplate.opsForValue().setIfAbsent(ENTERPRISE_CODE, Long.valueOf(enterprise.getCode()));
            // 也可设置 key 过期时间,此处设置为 1 天
            // redisTemplate.opsForValue().setIfAbsent(ENTERPRISE_CODE, Long.valueOf(enterprise.getCode()), 1, TimeUnit.DAYS);
        }
    }
    // 以递增方式缓存最新编码
    Long number = redisTemplate.opsForValue().increment(ENTERPRISE_CODE, 1L);
    // %06d 意为保留 6 位数,不足六位数字前面补 0
    code = String.format("%06d", number);
    return code;
}

到此这篇关于 Redis 串行生成顺序编码的方法实现的文章就介绍到这了,更多相关 Redis 串行生成顺序编码内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • redis中的数据结构和编码详解

    redis中的数据结构和编码:     背景: 1>redis在内部使用redisObject结构体来定义存储的值对象. 2>每种类型都有至少两种内部编码,Redis会根据当前值的类型和长度来决定使用哪种编码实现. 3>编码类型转换在Redis写入数据时自动完成,这个转换过程是不可逆的,转换规则只能从小内存编码向大内存编码转换.     源码: 值对象redisObject: typedef struct redisObject {                 unsigned ty

  •  Redis 串行生成顺序编码的方法实现

    场景:针对于分布式并发环境,易出现编码生成重复问题 方案特点:串行操作可避免阻塞加锁,处理效率更高 具体解决方案 private final static String ENTERPRISE_CODE = "enterpriseCode"; @Resource private RedisTemplate redisTemplate; private String generateCode() {     String code;     if (!redisTemplate.hasKe

  • 通过命令行生成vue项目框架的方法

    本文介绍了通过命令行生成vue项目框架的方法,现在分享给大家 -- 安装nodejs 用命令行生成vue项目框架需要npm包管理器来安装,而npm又是在安装nodejs的时候同时安装的, 所以首先要安装nodejs,学习vue有必要了解下nodejs和npm的基本知识: nodejs安装: http://www.jb51.net/article/113457.htm npm 介绍: http://www.jb51.net/article/87893.htm -- 安装命令行工具 npm inst

  • redis命令行查看中文不乱码的方法(十六进制字符串处理)

    redis命令行查看中文不乱码 Redis在使用命令行操作时,如果查看内容中包含中文,会显示16进制的字符串"\xe4\xb8\xad\xe5\x9b\xbd" 127.0.0.1:6379> set k1 '中国' OK 127.0.0.1:6379> get k1 "\xe4\xb8\xad\xe5\x9b\xbd" 如果想要看到的中文不乱码,解决方案有两种: 一.使用echo $ echo -e `redis-cli get k1` 中国 二.re

  • Redis数据库中实现分布式锁的方法

    分布式锁是一个在很多环境中非常有用的原语,它是不同进程互斥操作共享资源的唯一方法.有很多的开发库和博客描述如何使用Redis实现DLM(Distributed Lock Manager),但是每个开发库使用不同的方式,而且相比更复杂的设计与实现,很多库使用一些简单低可靠的方式来实现. 这篇文章尝试提供更标准的算法来使用Redis实现分布式锁.我们提出一种算法,叫做Relock,它实现了我们认为比vanilla单一实例方式更安全的DLM(分布式锁管理).我们希望社区分析它并提供反馈,以做为更加复杂

  • Python3 pickle对象串行化代码实例解析

    1.pickle对象串行化 pickle模块实现了一个算法可以将任意的Python对象转换为一系列字节.这个过程也被称为串行化对象.可以传输或存储表示对象的字节流,然后再重新构造来创建有相同性质的新对象. 1.1 编码和解码字符串中的数据 第一个例子使用dumps()将一个数据结构编码为一个字符串,然后把这个字符串打印到控制台.它使用了一个完全由内置类型构成的数据结构.任何类的实例都可以pickled,如后面的例子所示. import pickle import pprint data = [{

  • 详解IOS串行队列与并行队列进行同步或者异步的实例

    详解IOS串行队列与并行队列进行同步或者异步的实例 IOS中GCD的队列分为串行队列和并行队列,任务分为同步任务和异步任务,他们的排列组合有四种情况,下面分析这四种情况的工作方式. 同步任务,使用GCD dispatch_sync 进行派发任务 - (void)testSync { dispatch_queue_t serialQueue = dispatch_queue_create("com.zyt.queue", DISPATCH_QUEUE_SERIAL); dispatch_

  • 利用XMLSerializer将对象串行化到XML

    微软已经意识到串行化数据的重要性,因此在.NET框架中包含了命名空间System.Runtime.Serialization和System.Xml.Serialization以提供串行化功能,为用户自己编写串行化方法提供了一个框架.System.Xml.Serialization命名空间提供了将一个对象串行化为XML格式的基本方法.下面我们来看看如何使用这种方法. XML的魅力 串行化XML是指为了方便存储或传输,把一个对象的公共的域和属性保存为一种串行格式(这里是XML格式)的过程.非串行化则

  • php面向对象全攻略 (十六) 对象的串行化

    把对象串行化 有时候需要把一个对象在网络上传输,为了方便传输,可以把整个对象转化为二进制串, 等到达另一端时,再还原为原来的对象,这个过程称之为串行化,就像我们现在想把一辆汽 车通过轮船运到美国去,因为汽车的体积比较大,我们可以把汽车拆开成小的部件,然后我们把这些部件通过轮般运到美国去,到了美国再把这些部件组装回汽车. 有两种情况我们必须把对象串行化,第一种情况就是把一个对象在网络中传输的时候要 将对象串行化,第二种情况就是把对象写入文件或是数据库的时候用到串行化. 串行化有两个过程,一个是串行

  • PHP串行化与反串行化实例分析

    本文实例讲述了PHP串行化与反串行化.分享给大家供大家参考,具体如下: 对象也是一种在内存中存储的数据类型,他的寿命通常随着生成该对象的程序的终止而终止.有时候可能需要把对象的状态保存下来,需要时再将其回复.串行化是把每个对象转化为二进制字符串. <?php class Person { var $name; var $sex; var $age; function __construct($name = "", $sex = "男", $age = 22)

  • Java实现读取及生成Excel文件的方法

    本文实例讲述了Java实现读取及生成Excel文件的方法.分享给大家供大家参考,具体如下: 一.读取Excel文件 需要先下载poi-3.0.1-FINAL-20070705.jar(点击此处本站下载poi-3.0.1-FINAL-20070705.jar.) ExcelExamRead.java import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.apache.p

随机推荐