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

 更新时间:2022年06月09日 15:58:19   作者:SLC神奇的阿杜跟  
全局唯一ID生成器是一种在分布式系统下用来生成全局唯一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 << 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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • antd为Tree组件标题附加操作按钮功能

    antd为Tree组件标题附加操作按钮功能

    这篇文章主要介绍了antd为Tree组件标题附加操作按钮功能,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • 使用Redis缓存时高效的批量删除的几种方案

    使用Redis缓存时高效的批量删除的几种方案

    这篇文章主要介绍了使用Redis缓存时高效的批量删除的几种方案的相关资料,需要的朋友可以参考下
    2023-01-01
  • Redis6.0搭建集群Redis-cluster的方法

    Redis6.0搭建集群Redis-cluster的方法

    这篇文章主要介绍了Redis6.0搭建集群Redis-cluster的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • Redis中事件驱动模型示例详解

    Redis中事件驱动模型示例详解

    Redis这个数据库相信不用过多介绍了,大家应该都知道,下面这篇文章主要给大家介绍了关于Redis中事件驱动模型的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2018-03-03
  • Redis中常见的几种集群部署方案

    Redis中常见的几种集群部署方案

    本文主要介绍了Redis中常见的几种集群部署方案,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 浅谈Redis跟MySQL的双写问题解决方案

    浅谈Redis跟MySQL的双写问题解决方案

    项目中有遇到这个问题,跟MySQL中的数据不一致,记录一下,本文主要介绍了Redis跟MySQL的双写问题解决方案,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Redis内存回收策略

    Redis内存回收策略

    这篇文章主要介绍了Redis内存回收策略,需要的朋友可以参考下
    2007-02-02
  • 关于Redis的主从复制及哨兵问题

    关于Redis的主从复制及哨兵问题

    redis中以master为主机,slave为从机,一个master可以对应多个slave,而一个slave只能对应一个master,这篇文章主要介绍了Redis的主从复制及哨兵,需要的朋友可以参考下
    2022-06-06
  • 基于 Redis 实现接口限流的方式

    基于 Redis 实现接口限流的方式

    今天想和小伙伴们聊聊用 Redis 处理接口限流,这也是最近的 TienChin 项目涉及到这个知识点了,我就拎出来和大家聊聊这个话题
    2022-05-05
  • Redis持久化RDB和AOF区别详解

    Redis持久化RDB和AOF区别详解

    这篇文章主要介绍了Redis持久化RDB和AOF区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10

最新评论