登录
首页 >  数据库 >  Redis

Redis生成全局唯一ID的实现方法

来源:脚本之家

时间:2022-12-31 21:15:51 454浏览 收藏

怎么入门数据库编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《Redis生成全局唯一ID的实现方法》,涉及到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 

测试类:

@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 

今天关于《Redis生成全局唯一ID的实现方法》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:脚本之家 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表