Redis唯一ID生成器的實現

 更新時間:2022年07月05日 16:28:36   作者:Chen陳c  
本文主要介紹了Redis唯一ID生成器的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

ID的組成部分:

  • 符號位:1bit,永遠為0
  • 時間戳:31bit,以秒為單位,可以使用69年
  • 序列號:32bit,秒內的計數器,支持每秒產生2^32個不同ID

生成代碼:

public class RedisIdWorker {

? ? /**
? ? ?* 開始時間戳
? ? ?*/
? ? private static final long BEGIN_TIMESTAMP = 1640995200L;
? ? /**
? ? ?* 序列號的位數
? ? ?*/
? ? private static final int COUNT_BITS = 32;

? ? private StringRedisTemplate stringRedisTemplate;
?? ??? ?//構造方法形式注入
? ? public RedisIdWorker(StringRedisTemplate stringRedisTemplate) {
? ? ? ? this.stringRedisTemplate = stringRedisTemplate;
? ? }

? ? public long nextId(String keyPrefix){
? ? ? ? //1. 生成時間戳
? ? ? ? LocalDateTime now = LocalDateTime.now();
? ? ? ? long nowSecond = now.toEpochSecond(ZoneOffset.UTC);
? ? ? ? long timestamp = nowSecond - BEGIN_TIMESTAMP;
? ? ? ? //2.生成序列號
? ? ? ? // 2.1 獲取當前日期,精確到天
? ? ? ? String date = now.format(DateTimeFormatter.ofPattern("yyyy:MM:dd"));
? ? ? ? long count = stringRedisTemplate.opsForValue().increment("icr:" + keyPrefix + ":" + date);
? ? ? ? //3.拼接并返回

? ? ? ? return timestamp << COUNT_BITS | count;
? ? }
}

PS:Redis實現全局唯一id生成

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.concurrent.TimeUnit;

/**
?* 描述:
?* 唯一ID生成器
?* @author jimmy
?* @create 2020-11-06 16:06
?*/
@Component
public class GenerateIDUtil {

? ? @Autowired
? ? private RedisTemplate redisTemplate;

? ? /**
? ? ?* 生成每天的初始Id
? ? ?* @param key
? ? ?* @return
? ? ?*/ ?public String initPrimaryId(String key) {
? ? ? ? Assert.hasLength(key, "hashName不能為空");
? ? ? ? String hashCol = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
? ? ? ? //自定義編號規則
? ? ? ? String hashColVal = hashCol + "00001";
// ? ? ? ?redisTemplate.opsForHash().putIfAbsent(hashName, hashCol, hashColVal);

? ? ? ? Long expiresTime = getSecondsNextEarlyMorning();
? ? ? ? redisTemplate.opsForValue().set(key, Long.valueOf(hashColVal), expiresTime, TimeUnit.SECONDS);
? ? ? ? return hashColVal;
? ? }


? ? /**
? ? ?* 獲取分布式Id ? ??
? ? ?* @param key
? ? ?* @return
? ? ?*/
? ? public String getPrimaryId(String key) {

? ? ? ? String id = "";
? ? ? ? if(redisTemplate.hasKey(key)){
? ? ? ? ? ? // redisTemplate.opsForValue().get(key);
? ? ? ? ? ? // redisTemplate.delete(key);
? ? ? ? ? ? id = String.valueOf(redisTemplate.opsForValue().increment(key, 1));
? ? ? ? } else {
? ? ? ? ? ? id = initPrimaryId(key);
? ? ? ? }
? ? ? ? return id;
? ? }


? ? /**
? ? ?* 判斷當前時間距離第二天凌晨的秒數
? ? ?* @return 返回值單位為[s:秒]
? ? ?*/
? ? public Long getSecondsNextEarlyMorning() {
? ? ? ? Calendar cal = Calendar.getInstance();
? ? ? ? cal.add(Calendar.DAY_OF_YEAR, 1);
? ? ? ? cal.set(Calendar.HOUR_OF_DAY, 0);
? ? ? ? cal.set(Calendar.SECOND, 0);
? ? ? ? cal.set(Calendar.MINUTE, 0);
? ? ? ? cal.set(Calendar.MILLISECOND, 0);
? ? ? ? return (cal.getTimeInMillis() - System.currentTimeMillis()) / 1000;
? ? }
}

到此這篇關于Redis唯一ID生成器的實現的文章就介紹到這了,更多相關Redis唯一ID生成器內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 在ssm項目中使用redis緩存查詢數據的方法

    在ssm項目中使用redis緩存查詢數據的方法

    本文主要簡單的使用Java代碼進行redis緩存,即在查詢的時候先在service層從redis緩存中獲取數據。如果大家對在ssm項目中使用redis緩存查詢數據的相關知識感興趣的朋友跟隨腳本之家小編一起看看吧
    2018-03-03
  • 淺談Redis的幾個過期策略

    淺談Redis的幾個過期策略

    在使用redis時,一般會設置一個過期時間,當然也有不設置過期時間的,也就是永久不過期。當設置了過期時間,redis是如何判斷是否過期,以及根據什么策略來進行刪除的。
    2021-05-05
  • Redis如何存儲對象與集合示例詳解

    Redis如何存儲對象與集合示例詳解

    redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、 zset(sorted set --有序集合)和hash(哈希類型)本文介紹了關于Redis是如何存儲對象與集合的相關資料,需要的朋友可以參考下
    2018-05-05
  • Redis分布式鎖升級版RedLock及SpringBoot實現方法

    Redis分布式鎖升級版RedLock及SpringBoot實現方法

    這篇文章主要介紹了Redis分布式鎖升級版RedLock及SpringBoot實現,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • redis事務常用操作詳解

    redis事務常用操作詳解

    在本篇文章里小編給大家分享了關于redis事務常用操作的相關知識點內容,有興趣的朋友們可以跟著學習參考下。
    2019-07-07
  • Redis Cluster集群主從切換的踩坑與填坑

    Redis Cluster集群主從切換的踩坑與填坑

    這篇文章主要介紹了Redis Cluster集群主從切換的踩坑與填坑,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • redis基本類型和使用方法詳解

    redis基本類型和使用方法詳解

    這篇文章主要介紹了redis基本類型和使用方法詳解,需要的朋友可以參考下
    2020-02-02
  • 淺析Redis分布式鎖

    淺析Redis分布式鎖

    本篇文章通過實例給大家講解了Redis分布式鎖工作原理以及用法分享,有需要的朋友參考學習下吧。
    2017-12-12
  • redis分布式鎖的8大坑總結梳理

    redis分布式鎖的8大坑總結梳理

    這篇文章主要介紹了redis分布式鎖的8大坑總結梳理,使用redis的分布式鎖,我們首先想到的可能是setNx命令,文章圍繞setNx命令展開詳細的內容介紹,感興趣的小伙伴可以參考一下
    2022-07-07
  • 詳解Redis的慢查詢日志

    詳解Redis的慢查詢日志

    這篇文章主要介紹了Redis的慢查詢日志的相關資料,幫助大家更好的理解和學習Redis數據庫,感興趣的朋友可以了解下
    2020-08-08

最新評論

美丽人妻被按摩中出中文字幕