Redis實現(xiàn)全局唯一id的使用示例
一、全局ID生成器
全局ID生成器,是一種在分布式系統(tǒng)下用來生成全局唯一ID的工具,一般要滿足下列特性:
二、原理
為了增加ID的安全性,我們可以不直接使用Redis自增的數(shù)值,而是拼接一些其它信息:
ID的組成部分:
符號位:永遠(yuǎn)為0。
時間戳:31bit,以秒為單位,可以使用69年。
序列號:32bit,秒內(nèi)的計數(shù)器,支持每秒產(chǎn)生2^32個不同ID。
三、樣例代碼
ID生成器代碼:
@Component public class RedisIdWorker { //開始時間戳 private static final long BEGIN_TIMESTAMP = 1640995200L; @Resource private StringRedisTemplate stringRedisTemplate; public long nextId(String KeyPrefix){ //生成時間戳 LocalDateTime now = LocalDateTime.now(); long nowSecond = now.toEpochSecond(ZoneOffset.UTC); long timestamp = nowSecond - BEGIN_TIMESTAMP; //生成序列號 //獲取當(dāng)前格式,精確到天 String date = now.format(DateTimeFormatter.ofPattern("yyyyMMdd")); Long count = stringRedisTemplate.opsForValue().increment("icr:" + KeyPrefix + ":" + date); //拼接并返回 //位運算,時間戳向左移動32位,右邊空出的0用序列號補充,可以用或運算填充 return timestamp << 32 | count; } public static void main(String[] args) { LocalDateTime time = LocalDateTime.of(2022, 1, 1, 0, 0, 0); long second = time.toEpochSecond(ZoneOffset.UTC); System.out.println(second); } }
測試代碼:
@Resource private RedisIdWorker redisIdWorker; private ExecutorService es = Executors.newFixedThreadPool(500); @Test void testIdWorker() throws InterruptedException { CountDownLatch latch = new CountDownLatch(300); Runnable task = () ->{ for(int i = 0; i<100 ;i++){ long id = redisIdWorker.nextId("order"); System.out.println(id); } latch.countDown(); }; long begin = System.currentTimeMillis(); for (int i = 0; i<300 ;i++){ es.submit(task); } latch.await(); long end = System.currentTimeMillis(); System.out.println(end - begin); }
到此這篇關(guān)于Redis實現(xiàn)全局唯一id的使用示例的文章就介紹到這了,更多相關(guān)Redis 全局唯一id內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Redis實戰(zhàn)之百度首頁新聞熱榜的實現(xiàn)代碼
這篇文章主要介紹了Redis實戰(zhàn)之百度首頁新聞熱榜的實現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02使用Redis命令操作數(shù)據(jù)庫的常見錯誤及解決方法
由于Redis是內(nèi)存數(shù)據(jù)庫,因此可能會存在一些安全問題,下面這篇文章主要給大家介紹了關(guān)于使用Redis命令操作數(shù)據(jù)庫的常見錯誤及解決方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-02-02基于Redis實現(xiàn)延時隊列的優(yōu)化方案小結(jié)
本文主要介紹了基于Redis實現(xiàn)延時隊列的優(yōu)化方案小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07Redis五大基本數(shù)據(jù)類型及對應(yīng)使用場景總結(jié)
Redis有五種基本數(shù)據(jù)類型,分別是字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted?Set),這些基本數(shù)據(jù)類型使得Redis具備了豐富的數(shù)據(jù)結(jié)構(gòu)和功能,適用于各種不同的應(yīng)用場景,本文就給大家詳細(xì)的介紹一下這五大類型2023-08-08Redis通用命令介紹以及key的層級結(jié)構(gòu)講解
這篇文章主要介紹了Redis通用命令以及key的層級結(jié)構(gòu),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-12-12