redis--007

一、分布式全局唯一 ID 生成器

1. 业务背景

秒杀下单会生成优惠券订单,存入tb_voucher_order订单表。 数据库自增 ID 存在缺陷

  • ID 规律性太强,容易被爬虫推算订单数量
  • 分库分表场景下,单表自增会出现 ID 重复,受单表数据量约束

2. 全局 ID 五大核心特性

  • 唯一性:整个分布式系统不能出现重复 ID
  • 高性能:高并发秒杀场景,生成 ID 速度要快
  • 高可用:不能因为 ID 生成服务故障导致业务瘫痪
  • 递增性:ID 大体有序,方便数据库索引
  • 安全性:ID 不能轻易被猜测、推算业务数据

3. 常见 ID 生成方案对比

  1. UUID:无序,字符串,数据库索引性能差
  2. 数据库自增:简单;分库分表会冲突,ID 有规律不安全
  3. 雪花算法 snowflake:本地计算生成,性能高;依赖系统时间,时间回拨会产生重复 ID
  4. Redis 自增:利用 Redis 的 incr 做计数器,性能强;依赖 Redis 服务

4. Redis 自增 ID 方案(黑马点评使用)

  • key 按日期划分,每天一个 key,便于统计每日订单数量
  • ID 结构:时间戳 + Redis 自增序列号

bit 位结构:

  1. 符号位:1bit,固定为 0,保证正数
  2. 时间戳:31bit,单位秒,可以覆盖约 69 年
  3. 序列号:32bit,秒内计数器,同一秒内,每个请求拿到不同序号,每秒可生成海量 ID

原理:拿到当前时间戳,再用 Redis incr 拿到当天 key 的自增数字,拼接组合得到完整全局 ID。

java 复制代码
@Component
public class RedisIdWorker {

    private static final long BEGIN_TIMESTAMP = 1787673600L;

    private StringRedisTemplate stringRedisTemplate;

    public long nexId(String keyPrefix) {
        //生成时间戳
        LocalDateTime now = LocalDateTime.now();
        long epochSecond = now.toEpochSecond(ZoneOffset.UTC);
        Long timestamp =  epochSecond - BEGIN_TIMESTAMP;
        //生成序列号
        String yyyyMMdd = now.format(DateTimeFormatter.ofPattern("yyyyMMdd"));
        Long increment = stringRedisTemplate.opsForValue().increment("icr" + keyPrefix + ":" + yyyyMMdd);

        return timestamp << 32 | increment;
    }
    public static void main(String[] args) {
        LocalDateTime localDateTime = LocalDateTime.of(2026, 8, 25, 0, 0, 0);
        long epochSecond = localDateTime.toEpochSecond(ZoneOffset.UTC);
        System.out.println("second" + epochSecond);
    }
}
相关推荐
考虑考虑6 小时前
数据库中的EXISTS
运维·数据库·后端
Wang's Blog6 小时前
Java框架快速入门: Spring Security+OAuth2之数据库和实体类的RBAC改造
java·数据库·spring
梦想平凡7 小时前
百游棋牌源代码开发搭建教程(十):隔离部署、备份恢复与双端验收
java·前端·javascript·数据库·源代码管理
xcLeigh8 小时前
让大模型长出手脚,自己写SQL查数据库(Function Calling初探)
数据库·人工智能·sql·时序数据库·timechoai
yume_sibai8 小时前
06-Rust Web 开发实战(Axum 框架 + 数据库 + JWT 认证 + 中间件 + 部署)
前端·数据库·rust
AugustRed9 小时前
Neo4j 图数据库原理 + 应用场景简单介绍
数据库·neo4j
Gl�ria10 小时前
Redis 高可用架构对比
数据库·redis
IpdataCloud10 小时前
高可用的IP数据接口平台有哪些?从可用性、P99延迟到离线部署的评估框架(含代码)
数据库·tcp/ip·ip
呆萌很10 小时前
MySQL 数据库和表的管理操作(命令行)
数据库·mysql
IvorySQL11 小时前
当PostgreSQL“听懂”MySQL——协议兼容层的设计与实战
数据库·人工智能·postgresql