網站首頁 編程語言 正文
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();
}
}
原文鏈接:https://blog.csdn.net/weixin_41213402/article/details/106094915
相關推薦
- 2022-10-14 Redis常見分布鎖的原理和實現_Redis
- 2022-09-20 RecyclerView實現側滑和網絡斷點續傳_Android
- 2022-06-12 startup.bat啟動Tomcat閃退問題原因及解決_Tomcat
- 2022-12-05 Android自定義view實現左滑刪除的RecyclerView詳解_Android
- 2022-12-29 Kotlin使用滾動控件RecyclerView實例教程_Android
- 2023-10-15 自定義帶下箭頭彈出框
- 2022-04-01 Python格式化輸出之format用法詳解_python
- 2022-08-18 詳解如何從Matlab中導出清晰的結果圖片_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支