Redis实现全局唯一id的使用示例

 更新时间:2023年09月11日 09:56:56   作者:夏娃同学  
全局ID生成器,是一种在分布式系统下用来生成全局唯一ID的工具,本文主要介绍了Redis实现全局唯一id的使用示例,具有一定的参考价值,感兴趣的可以了解一下

一、全局ID生成器

全局ID生成器,是一种在分布式系统下用来生成全局唯一ID的工具,一般要满足下列特性:

二、原理 

为了增加ID的安全性,我们可以不直接使用Redis自增的数值,而是拼接一些其它信息:

 

ID的组成部分:

符号位:永远为0。

时间戳:31bit,以秒为单位,可以使用69年。

序列号:32bit,秒内的计数器,支持每秒产生2^32个不同ID。

三、样例代码

ID生成器代码:

@Component
public class RedisIdWorker {
    //开始时间戳
    private static final long BEGIN_TIMESTAMP = 1640995200L;
    @Resource
    private StringRedisTemplate stringRedisTemplate;
    public long nextId(String KeyPrefix){
        //生成时间戳
        LocalDateTime now = LocalDateTime.now();
        long nowSecond = now.toEpochSecond(ZoneOffset.UTC);
        long timestamp = nowSecond - BEGIN_TIMESTAMP;
        //生成序列号
        //获取当前格式,精确到天
        String date = now.format(DateTimeFormatter.ofPattern("yyyyMMdd"));
        Long count = stringRedisTemplate.opsForValue().increment("icr:" + KeyPrefix + ":" + date);
        //拼接并返回
        //位运算,时间戳向左移动32位,右边空出的0用序列号补充,可以用或运算填充
        return timestamp << 32 | count;
    }
    public static void main(String[] args) {
        LocalDateTime time = LocalDateTime.of(2022, 1, 1, 0, 0, 0);
        long second = time.toEpochSecond(ZoneOffset.UTC);
        System.out.println(second);
    }
}

测试代码:

    @Resource
    private RedisIdWorker redisIdWorker;
    private ExecutorService es = Executors.newFixedThreadPool(500);
    @Test
    void testIdWorker() throws InterruptedException {
        CountDownLatch latch = new CountDownLatch(300);
        Runnable task = () ->{
            for(int i = 0; i<100 ;i++){
                long id = redisIdWorker.nextId("order");
                System.out.println(id);
            }
            latch.countDown();
        };
        long begin = System.currentTimeMillis();
        for (int i = 0; i<300 ;i++){
            es.submit(task);
        }
        latch.await();
        long end = System.currentTimeMillis();
        System.out.println(end - begin);
    }

到此这篇关于Redis实现全局唯一id的使用示例的文章就介绍到这了,更多相关Redis 全局唯一id内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Ubuntu下安装redis的2种方法分享

    Ubuntu下安装redis的2种方法分享

    redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。这篇文章对redis就不进行详细的介绍了,这篇文章主要给大家介绍了Ubuntu下安装redis的两种方法,有需要的朋友们可以参考学习,下面来一起看看吧。
    2016-12-12
  • redis专属链表ziplist的使用

    redis专属链表ziplist的使用

    本文主要介绍了redis专属链表ziplist的使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • 关于Redis bigkeys命令会阻塞问题的解决

    关于Redis bigkeys命令会阻塞问题的解决

    这篇文章主要介绍了关于Redis bigkeys命令会阻塞问题的解决,今天分享一次Redis引发的线上事故,避免再次踩雷,实现快速入门,需要的朋友可以参考下
    2023-03-03
  • redis的五大数据类型应用场景分析

    redis的五大数据类型应用场景分析

    这篇文章主要介绍了redis的五大数据类型实现原理,本文给大家分享五大数据类型的应用场景分析,需要的朋友可以参考下
    2021-08-08
  • 详解Redis单线程架构的优势与不足

    详解Redis单线程架构的优势与不足

    很多人都遇到过这么一道面试题:Redis是单线程还是多线程?这个问题既简单又复杂,说他简单是因为大多数人都知道Redis是单线程,说复杂是因为这个答案其实并不准确,本文就给大家讲讲Redis单线程架构的优势与不足,需要的朋友可以参考下
    2024-02-02
  • Redis消息队列、阻塞队列、延时队列的实现

    Redis消息队列、阻塞队列、延时队列的实现

    Redis是一种常用的内存数据库,它提供了丰富的功能,通常用于数据缓存和分布式队列,本文主要介绍了Redis消息队列、阻塞队列、延时队列的实现,感兴趣的可以了解一下
    2023-11-11
  • 将音频文件转二进制分包存储到Redis的实现方法(奇淫技巧操作)

    将音频文件转二进制分包存储到Redis的实现方法(奇淫技巧操作)

    这篇文章主要介绍了将音频文件转二进制分包存储到Redis的实现方法(奇淫技巧操作),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • 利用Redis实现订单30分钟自动取消

    利用Redis实现订单30分钟自动取消

    本文主要介绍了利用Redis实现订单30分钟自动取消,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • 一文弄懂Redis Stream消息队列

    一文弄懂Redis Stream消息队列

    本文主要介绍了一文弄懂Redis Stream消息队列,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • redis分布式锁的go-redis实现方法详解

    redis分布式锁的go-redis实现方法详解

    这篇文章主要介绍了redis分布式锁的go-redis实现方法,本文给大家介绍的非常详细对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12

最新评论