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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一篇吃透Redis缓存穿透、雪崩、击穿问题

    一篇吃透Redis缓存穿透、雪崩、击穿问题

    这篇文主要介绍了Redis缓存穿透,缓存雪崩,缓存击穿的问题解决方法,文中有详细的图文介绍,对大家了解Redis有一定的帮助,需要的朋友可以参考下
    2023-05-05
  • Deepin UOS编译安装Redis的实现步骤

    Deepin UOS编译安装Redis的实现步骤

    本文主要介绍了Deepin UOS编译安装Redis的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • Redis Lua同步锁实现源码解析

    Redis Lua同步锁实现源码解析

    这篇文章主要为大家介绍了Redis Lua同步锁实现源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • redis部署及各种数据类型使用命令详解

    redis部署及各种数据类型使用命令详解

    这篇文章主要介绍了redis部署及各种数据类型使用命令,编译安装redis及部署过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • redis通过redis-dump镜像实现数据迁移

    redis通过redis-dump镜像实现数据迁移

    本文主要介绍了redis通过redis-dump镜像实现数据迁移,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-04-04
  • 关于Redis单线程的正确理解

    关于Redis单线程的正确理解

    很多同学对Redis的单线程和I/O多路复用技术并不是很了解,所以我用简单易懂的语言让大家了解下Redis单线程和I/O多路复用技术的原理,对学好和运用好Redis打下基础,感兴趣的朋友跟随小编一起看看吧
    2021-11-11
  • redis加锁的几种方式汇总

    redis加锁的几种方式汇总

    这篇文章主要介绍了redis加锁的几种方式汇总,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • 启动redis出现闪退情况的解决办法

    启动redis出现闪退情况的解决办法

    最近使用Redis遇到启动闪退的问题,查阅资料后在一位大神的文章中找到了答案,这篇文章主要给大家介绍了关于启动redis出现闪退情况的解决办法,需要的朋友可以参考下
    2023-11-11
  • Redis存取序列化与反序列化性能问题详解

    Redis存取序列化与反序列化性能问题详解

    这篇文章主要给大家介绍了关于Redis存取序列化与反序列化性能问题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • redis事务如何解决超卖问题

    redis事务如何解决超卖问题

    使用Redis事务可以有效避免超卖问题,首先,通过MULTI命令开启事务,将需要执行的多个命令加入到事务中,然后通过EXEC命令提交事务,确保这些命令可以一次性、顺序地执行,在事务执行期间,Redis服务器不会执行其他客户端的命令
    2024-11-11

最新评论