使用redis如何生成自增序列号码

 更新时间:2022年11月23日 08:26:23   作者:饭团小哥哥iop  
这篇文章主要介绍了使用redis如何生成自增序列号码,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

redis生成自增序列号码

导入依赖

<!--redis-->
<dependency>
    <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
        <exclusion>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
    </exclusion>
    </exclusions>
</dependency>

yml 配置

  redis:
      database: 10
      host: localhost
      port: 7701
      password: root

工具方法

package com.sd.sdactivity.controller;
import io.netty.util.internal.StringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**

 * 使用redis生成自增序列

 */
@RestController
public class testController {
@Autowired
private StringRedisTemplate redisTemplate;
    /**
     * 自增序列号
     * @param prefix  前缀
     * @param numLength  要生成多少位数字
     * @return
     */ 
@RequestMapping("/SeqGenerator")
    public String SeqGenerator(String prefix,int numLength){
        String upperCode ="";   
   Long size=redisTemplate.opsForList().size(prefix);//查找 prefix 的key值的数据长度
        if(size>0){//有数据
List leve =redisTemplate.opsForList().range(prefix,0,-1);//获取该key下面的所有值(-1 所有的值,;1下一个值
  upperCode=leve.get(leve.size()-1).toString();//返回最后一个值
        }
           String returnCode="";
          int Suffix;  //后缀数字 if (!StringUtil.isNullOrEmpty(upperCode)){ //有数据
            String sequence =upperCode.substring(prefix.length());//截取前缀开始的后面的数字
            Suffix=Integer.parseInt(sequence); 
             Suffix++;//最后的序号加一
         }else{
            Suffix=1;//没有数据
        }
           returnCode=prefix+String.format("%0"+numLength+"d",Suffix);//后缀不够numLength长,前面补充0
        redisTemplate.opsForList().rightPush(prefix,returnCode);//存入Redis
        System.out.println(returnCode+"%%%");
        return  returnCode;
  }
}

测试

2020-05-13 11:43:31.230  INFO 39268 --- [           main] c.f.SpringbootRedisApplicationTests      : seq00000002

redis生成唯一编号

在系统开发中,保证数据的唯一性是至关重要的一件事,目前开发中常用的方式有使用数据库的自增序列、UUID、时间戳或者时间戳+随机数等。

因为Redis是原子性的,所以我们可以用redis生成一个唯一的号码,记录一个编号,我们用这个编号可以配合时间戳生成一个唯一的key

接下来是上代码

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.support.atomic.RedisAtomicLong;
import org.springframework.stereotype.Service;
 
import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
 
/**
 * 使用redis生成唯一key
 */
@Service("reportNumberUtils")
public class ReportNumberUtils {
 
    private static Logger logger = LoggerFactory.getLogger(ReportNumberUtils.class);
 
    @Resource
    private RedisTemplate redisTemplate;
 
    //传入制定的key和prefix
    public String getSeqNo(String key, String prefix)
    {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, 23);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 59);
        calendar.set(Calendar.MILLISECOND, 999);
        //设置过期时间,这里设置为当天的23:59:59
        Date expireDate = calendar.getTime();
        //返回当前redis中的key的最大值
        Long seq = generate(redisTemplate, key, expireDate);
        //获取当天的日期,格式为yyyyMMdd
        String date = new SimpleDateFormat("yyyyMMdd").format(expireDate);
        //生成八为的序列号,如果seq不够八位,seq前面补0,
        //如果seq位数超过了八位,那么无需补0直接返回当前的seq
        String sequence = StringUtils.leftPad(seq.toString(), 8, "0");
        if (prefix == null)
        {
            prefix = "";
        }
        //拼接业务编号
        String seqNo = prefix + date + sequence;
        logger.info("KEY:{}, 序列号生成:{}, 过期时间:{}", key, seqNo, String.format("%tF %tT ", expireDate, expireDate));
        return seqNo;
    }
 
    /**
     * @param key
     * @param expireTime <i>过期时间</i>
     * @return
     */
    public static long generate(RedisTemplate<?,?> redisTemplate,String key,Date expireTime) {
        //RedisAtomicLong为原子类,根据传入的key和redis链接工厂创建原子类
        RedisAtomicLong counter = new RedisAtomicLong(key,redisTemplate.getConnectionFactory());
        //设置过期时间
        counter.expireAt(expireTime);
        //返回redis中key的值,内部实现下面详细说明
        return counter.incrementAndGet();
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Redis 5.05 单独模式安装及配置方法

    Redis 5.05 单独模式安装及配置方法

    这篇文章主要介绍了Redis 5.05 单独模式安装,文中通过代码给大家介绍了Redis 5.0.5 单节点 安装配置方法,需要的朋友可以参考下
    2019-10-10
  • Redis+Lua脚本实现计数器接口防刷功能(升级版)

    Redis+Lua脚本实现计数器接口防刷功能(升级版)

    这篇文章主要介绍了Redis+Lua脚本实现计数器接口防刷功能,使用脚本使得set命令和expire命令一同达到Redis被执行且不会被干扰,在很大程度上保证了原子操作,对Redis实现计数器接口防刷功能感兴趣的朋友一起看看吧
    2022-02-02
  • redis的hGetAll函数的性能问题(记Redis那坑人的HGETALL)

    redis的hGetAll函数的性能问题(记Redis那坑人的HGETALL)

    这篇文章主要介绍了redis的hGetAll函数的性能问题,需要的朋友可以参考下
    2016-02-02
  • NestJS+Redis实现缓存步骤详解

    NestJS+Redis实现缓存步骤详解

    这篇文章主要介绍了NestJS+Redis实现缓存,本文分步骤给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • 详解使用Redis SETNX 命令实现分布式锁

    详解使用Redis SETNX 命令实现分布式锁

    本篇文章主要介绍了详解使用Redis SETNX 命令实现分布式锁,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • Redis中AOF与RDB持久化策略深入分析

    Redis中AOF与RDB持久化策略深入分析

    Redis作为一款内存数据库,因为是内存读写,所以性能很强,但内存存储是易失性的,断电或系统奔溃都会导致数据丢失,因此Redis也需要将其数据持久化到磁盘上面,当Redis服务重启时,会把磁盘上的数据再加载进内存,Redis提供了两种持久化机制-RDB快照和AOF日志
    2022-11-11
  • redis哨兵模式分布式锁实现与实践方式(redisson)

    redis哨兵模式分布式锁实现与实践方式(redisson)

    这篇文章主要介绍了redis哨兵模式分布式锁实现与实践方式(redisson),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • Redis利用Pipeline加速查询速度的方法

    Redis利用Pipeline加速查询速度的方法

    这篇文章主要给大家介绍了关于Redis利用Pipeline加速查询速度的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Redis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-07-07
  • Redis分布式锁解决超卖问题

    Redis分布式锁解决超卖问题

    超卖问题是典型的多线程安全问题,本文就来介绍一下Redis分布式锁解决超卖问题,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • Redis 配置文件重要属性的具体使用

    Redis 配置文件重要属性的具体使用

    Redis在IT公司中的使用率自不必说,今天我们就来介绍一下Redis 配置文件重要属性的具体使用,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05

最新评论