一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Redis - 簡單實用!利用Redis輕松實現高并發全局ID生成器

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

2023-05-07 05:15未知服務器之家 Redis

Redis作為高性能的KV數據庫,并且操作還是原子性的,所以用來做支持高并發的發號器十分合適。 本文給大家介紹3種常見的全局ID生成方式。 1、全局遞增ID 目標:一直遞增的全局ID。 /** * 一直遞增的全局id * * @param redisTemplate redi

簡單實用!利用Redis輕松實現高并發全局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格式要求,務必要進行充分的測試。

延伸 · 閱讀

精彩推薦
  • Redis詳解Redis復制原理

    詳解Redis復制原理

    與大多數db一樣,Redis也提供了復制機制,以滿足故障恢復和負載均衡等需求。復制也是Redis高可用的基礎,哨兵和集群都是建立在復制基礎上實現高可用的...

    李留廣10222021-08-09
  • RedisRedis的配置、啟動、操作和關閉方法

    Redis的配置、啟動、操作和關閉方法

    今天小編就為大家分享一篇Redis的配置、啟動、操作和關閉方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 ...

    大道化簡5312019-11-14
  • RedisRedis如何實現數據庫讀寫分離詳解

    Redis如何實現數據庫讀寫分離詳解

    Redis的主從架構,能幫助我們實現讀多,寫少的情況,下面這篇文章主要給大家介紹了關于Redis如何實現數據庫讀寫分離的相關資料,文中通過示例代碼介紹...

    羅兵漂流記6092019-11-11
  • Redisredis實現排行榜功能

    redis實現排行榜功能

    排行榜在很多地方都能使用到,redis的zset可以很方便地用來實現排行榜功能,本文就來簡單的介紹一下如何使用,具有一定的參考價值,感興趣的小伙伴們...

    乘月歸5022021-08-05
  • RedisRedis全量復制與部分復制示例詳解

    Redis全量復制與部分復制示例詳解

    這篇文章主要給大家介紹了關于Redis全量復制與部分復制的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Redis爬蟲具有一定的參考學習...

    豆子先生5052019-11-27
  • RedisRedis 事務知識點相關總結

    Redis 事務知識點相關總結

    這篇文章主要介紹了Redis 事務相關總結,幫助大家更好的理解和學習使用Redis,感興趣的朋友可以了解下...

    AsiaYe8232021-07-28
  • Redisredis中如何使用lua腳本讓你的靈活性提高5個逼格詳解

    redis中如何使用lua腳本讓你的靈活性提高5個逼格詳解

    這篇文章主要給大家介紹了關于redis中如何使用lua腳本讓你的靈活性提高5個逼格的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具...

    一線碼農5812019-11-18
  • Redisredis 交集、并集、差集的具體使用

    redis 交集、并集、差集的具體使用

    這篇文章主要介紹了redis 交集、并集、差集的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友...

    xiaojin21cen10152021-07-27
主站蜘蛛池模板: 精品日本三级在线观看视频 | 满溢游泳池免费 | 特黄特色大片免费影院 | 我与白丝同桌的故事h文 | 久久成人免费大片 | 91精品久久国产青草 | 胸奶好大好紧好湿好爽 | 四虎成人免费视频 | 国产haodiaose最新 | 亚洲日韩中文字幕一区 | 国产夜趣福利第一视频 | 日本mature乱子视频 | 国内精品久久久久久久 | 亚洲欧美日韩国产一区二区精品 | 国产aⅴ一区二区三区 | 共妻高h| 亚洲 另类 欧美 变态屎尿 | 亚洲成人网导航 | 亚洲精品高清中文字幕完整版 | 成人影院www在线观看 | 91色+91sesex| 国产精品嫩草影院在线 | 美女的隐私脱裤子无遮挡 | 猥琐对着美女飞机喷到脸上 | 国产老妇| 亚洲第一人黄所 | 草草视频在线观看最新 | 99久久国产视频 | 日韩在线视频一区二区三区 | chinese壮直男gay老年人 | 91制片厂制作传媒网站破解 | 爸爸干女儿小说 | 亚洲精品国产综合久久一线 | 国产区成人精品视频 | 国产成人性毛片aaww | 国内自拍网红在线自拍综合 | 免费视频片在线观看 | 国产a免费观看 | 四虎影免看黄 | 精品国产一区二区三区在线观看 | 二区三区不卡不卡视频 |