日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Redis生成全局唯一ID的實現方法_Redis

作者:SLC神奇的阿杜跟 ? 更新時間: 2022-08-03 編程語言

簡介:

全局唯一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));
? ? }

原文鏈接:https://blog.csdn.net/nnitxufd/article/details/124022266

欄目分類
最近更新