用Redis实现实现全局唯一ID

全局唯一ID

如果使用数据库自增ID就存在一些问题:

  • id的规律性太明显
  • 受表数据量的限制

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

  • 唯一性
  • 高可用
  • 递增性
  • 安全性
  • 高性能

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

image-20240102173648497

ID的组成部分:

符号位:1bit,永远为0

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

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

Redis实现全局唯一ID

@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 nowSecond = now.toEpochSecond(ZoneOffset.UTC);
        long timestamp = nowSecond - BEGIN_TIMESTAMP;

        // 2.生成序列号
        // 2.1.获取当前日期,精确到天(方便统计每天的数据量)
        String date = now.format(DateTimeFormatter.ofPattern("yyyy:MM:dd"));
        // 2.2.自增长
        long count = stringRedisTemplate.opsForValue().increment("icr:" + keyPrefix + ":" + date);

        // 3.拼接并返回
        return timestamp << COUNT_BITS | count;
    }
}

相关推荐

  1. Redis 实现全局唯一ID

    2024-01-03 16:06:01       60 阅读
  2. Redis实现全局唯一id

    2024-01-03 16:06:01       43 阅读
  3. Redis实现全局唯一Id

    2024-01-03 16:06:01       42 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-03 16:06:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-03 16:06:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-03 16:06:01       87 阅读
  4. Python语言-面向对象

    2024-01-03 16:06:01       96 阅读

热门阅读

  1. kafka处理大量消息积压tips —— 筑梦之路

    2024-01-03 16:06:01       61 阅读
  2. vue常见面试题

    2024-01-03 16:06:01       44 阅读
  3. 基于SpringBoot的智慧生活商城系统

    2024-01-03 16:06:01       58 阅读
  4. CSS-5

    2024-01-03 16:06:01       55 阅读
  5. Linux内核--进程管理(七)进程的核心—task_truct

    2024-01-03 16:06:01       45 阅读
  6. IEC 61850 dsAin 和 dsDin的区别

    2024-01-03 16:06:01       54 阅读
  7. 华为鸿蒙应用--文件管理工具(鸿蒙工具)-ArkTs

    2024-01-03 16:06:01       136 阅读
  8. 第三方支付“收单”是什么?

    2024-01-03 16:06:01       137 阅读
  9. MySQL数据库连接超时和自动重连

    2024-01-03 16:06:01       56 阅读