Redis生成全局唯一ID的實現方法
簡介:
全局唯一ID生成器是一種在分佈式系統下用來生成全局唯一ID的工具
特性:
- 唯一性
- 高性能
- 安全性
- 高可用
- 遞增性
生成規則:
有時為瞭增加ID的安全性,我們可以不直接使用Redis自增的數值,而是拼接一些其他信息
ID組成部分:
- 符號位:1bit,永遠為0
- 時間戳:31bit,以秒為單位,可以使用69年
- 序列號:32bit,秒內的計數器,支持每秒產生2^32個不同ID
ID生成類:
package com.example.util; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; import java.time.LocalDateTime; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; /** * @Author DaBai * @Date 2022/3/17 下午 09:25 * @Version 1.0 */ @Component 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 nowScond = now.toEpochSecond(ZoneOffset.UTC); long timestamp = nowScond - BEGIN_TIMESTAMP; //2、生成序列號 // 2.1 獲取當前日期,精確到天 String date = now.format(DateTimeFormatter.ofPattern("yyyy:MM:dd")); long count = stringRedisTemplate.opsForValue().increment("icr" + keyPrefix + ":" + date); //3、拼接字符串 // 時間戳左移32位,然後 或 序列號,有1為1 long ids = timestamp << COUNT_BITS | count; return ids; }
測試類:
@Resource RedisIDWorker redisIDWorker; private ExecutorService es = Executors.newFixedThreadPool(500); @Test public void ShowID() throws InterruptedException { CountDownLatch countDownLatch = new CountDownLatch(300); Runnable task = () -> { for (int i = 0; i < 100; i++) { long id = redisIDWorker.nextID("order"); System.out.println("id = " + id); } countDownLatch.countDown(); }; long startTime = System.currentTimeMillis(); for (int i = 0; i < 300; i++) { es.submit(task); } countDownLatch.await(); long end = System.currentTimeMillis(); System.out.println("time = " + (end - startTime)); }
到此這篇關於Redis生成全局唯一ID的實現方法的文章就介紹到這瞭,更多相關Redis生成全局唯一ID內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Redis全局ID生成器的實現
- Redis唯一ID生成器的實現
- SpringBoot使用Redis的zset統計在線用戶信息
- Java8的DateTimeFormatter與SimpleDateFormat的區別詳解
- SpringBoot整合Redis實現常用功能超詳細過程