面试相关
使用Redis生成全局唯一id
00 分钟
2024-11-23
2024-11-23
type
status
date
slug
summary
tags
category
icon
为了生成一个符合要求的分布式全局ID,我们可以使用 StringRedisTemplate 来实现。这个ID由三部分组成:
  1. 符号位(1 bit):始终为0,表示正数。
  1. 时间戳(31 bit):表示从某个起始时间点(例如2023-01-01 00:00:00)到现在的秒数。
  1. 序列号(32 bit):用于在同一秒内生成不同的ID。

实现步骤

  1. 计算时间戳:从某个起始时间点到现在的秒数。
  1. 生成序列号:使用Redis的原子递增操作来生成序列号。
  1. 组合ID:将时间戳和序列号组合成一个64位的长整型数字。

代码实现

代码解释

  1. EPOCH:起始时间点,例如2023-01-01 00:00:00,转换为秒数。
  1. SEQUENCE_KEY_PREFIX:Redis中存储序列号的键前缀。
  1. generateId 方法
  • currentTimeSec:从起始时间点到现在的秒数。
  • sequenceKey:根据当前时间戳生成的Redis键。
  • sequence:使用 opsForValue().increment 方法生成序列号,确保在同一秒内生成不同的ID。
  • 序列号溢出处理:如果序列号达到最大值(2^32 - 1),则重置为0,并设置键在1秒后过期。
  • 组合ID:将时间戳左移32位,然后与序列号进行按位或操作,生成最终的64位ID。

测试代码

上一篇
redis实现分布式锁
下一篇
Redis缓存三兄弟解决方案及实现