成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

簡單實用!利用Redis輕松實現高并發全局ID生成器

數據庫 Redis
無論我們需要什么格式的ID,其實只要我們把握住其中的核心:incrBy命令,根據其原子性的特性,就可以生成我們需要的全局ID。

Redis作為高性能的KV數據庫,并且操作還是原子性的,所以用來做支持高并發的發號器十分合適。

本文給大家介紹3種常見的全局ID生成方式。

1、全局遞增ID

目標:一直遞增的全局ID。

/**
* 一直遞增的全局id
*
* @param redisTemplate redis客戶端對象
* @param busId 業務id,可以按需配置
* @param step 步長,即每次遞增的間隔
*/
public static String getNo(RedisTemplate<String, Object> redisTemplate, String busId, int step) {
//保存redis中的key,注意不要重復
String redisKey = "uniqueNo_";
//利用increment即redis原生incrBy命令的原子性特性生成遞增的序列號
Long increment = redisTemplate.opsForValue().increment(redisKey, step);
if (increment == null) {
throw new RuntimeException("redis命令執行失敗");
}
//業務id+遞增id,如果需要純數字,去掉業務id即可
return busId + increment;
}

2、以天為分割的全局ID

目標:生成格式為 yyyyMMdd + 遞增序列號的全局ID。

/**
* 以天為間隔的遞增序列號
* @param redisTemplate redis客戶端對象
* @param busId 業務id,可以按需配置
* @param step 步長,即每次遞增的間隔
*/
public static String getNo(RedisTemplate<String, Object> redisTemplate, String busId, int step) {
//當天日期,比如20221226
String date = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
//保存redis中的key,注意不要重復
String redisKey = "uniqueNo_" + date;
//利用increment即redis原生incrBy命令的原子性特性生成遞增的序列號
Long increment = redisTemplate.opsForValue().increment(redisKey, step);
if (increment == null) {
throw new RuntimeException("redis命令執行失敗");
}
if (step == increment.intValue()) {
//首次執行時,給redisKey設置ttl,第二天這個key就可以被redis自動刪除
redisTemplate.expire(redisKey, 25, TimeUnit.HOURS);
}
//組合 20221226 + 業務id + 0001(可以根據需要自由調整序列號的長度)
return date + busId + String.format("%04d", increment);
}

3、批量獲取ID

有時我們需要批量的獲取遞增ID,比如給一批訂單號設置ID。

/**
* 批量獲取id
*
* @param redisTemplate redis客戶端對象
* @param busId 業務id,可以按需配置
* @param size 獲取的id個數,與步長類似
*/
public static List<String> getNoByGroup(RedisTemplate<String, Object> redisTemplate, String busId, int size) {
//保存redis中的key,注意不要重復
String redisKey = "uniqueNo_group";
//設置步長為size,相當于一次性申請size個id
Long increment = redisTemplate.opsForValue().increment(redisKey, size);
if (increment == null) {
throw new RuntimeException("redis命令執行失敗");
}
long begin = increment - Long.parseLong(size + "");
List<String> rs = new ArrayList<>();
for (long i = begin + 1; i <= increment; i++) {
rs.add(busId + i);
}
return rs;
}

總結

無論我們需要什么格式的ID,其實只要我們把握住其中的核心:incrBy命令,根據其原子性的特性,就可以生成我們需要的全局ID。

但是需要注意的是,雖然incrBy命令是原子性的,但是通過組合鍵進行組合時,其實是破壞了這種原子性。如果有特殊的ID格式要求,務必要進行充分的測試。

責任編輯:姜華 來源: 今日頭條
相關推薦

2024-10-29 08:30:31

2017-07-01 16:02:39

分布式ID生成器

2019-12-27 10:00:34

開源技術 軟件

2022-07-25 10:27:36

背景生成器工具前端

2024-01-26 08:28:41

工單號生成器場景

2022-03-03 08:30:41

GeneratorES6函數

2025-03-11 08:50:00

CASID分布式

2020-08-21 13:15:29

開發技能代碼

2022-02-15 10:30:58

UUID

2015-08-25 11:07:58

2025-01-23 08:36:27

CSS開發工具

2011-12-23 13:42:05

JavaScript

2010-09-07 16:31:17

SQL語句insert

2021-04-22 21:15:38

Generator函數生成器

2025-01-06 09:06:04

JavaScriptWeb 開發Generators

2017-03-20 17:49:21

Java Web模板代碼

2016-01-08 10:55:31

PHP莫斯電碼生成器

2016-12-21 10:55:55

PHP莫斯電碼生成器

2021-07-14 07:17:37

Springboot分布式UIDGenerato

2024-11-01 15:51:06

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产在线观看一区 | 国产91网址 | 久久日韩粉嫩一区二区三区 | 国产成人免费视频网站高清观看视频 | 国产高清一二三区 | 国产视频中文字幕 | 欧洲精品码一区二区三区免费看 | 色橹橹欧美在线观看视频高清 | 啪啪综合网 | 亚洲成人自拍 | 精品真实国产乱文在线 | 丝袜 亚洲 另类 欧美 综合 | 欧美日韩国产在线观看 | 久久精品国产一区二区三区不卡 | 日韩在线不卡视频 | 精品国产一区二区三区四区在线 | 精品国产一区三区 | av网址在线 | 一区二区三区四区av | 亚洲精品区 | 久久逼逼 | www.日本三级 | 国产一区精品 | 久久看片| 国产一区二区精品自拍 | 日韩一区二区在线观看视频 | 国产91在线播放 | 国内精品视频免费观看 | 日韩中文在线视频 | 亚洲一区不卡 | 亚洲三区在线观看 | 九九热精品在线 | 日韩精品一区二区三区中文在线 | 免费一级片 | 日韩国产中文字幕 | 亚洲综合色网站 | 爱综合 | 久久新 | 日本高清aⅴ毛片免费 | 亚洲综合激情 | www视频在线观看 |