You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Redis生成自定义连续编码?为何选择Redis实现?

为什么要用Redis生成这类连续编码?

你原来的数据库方案在高并发场景下会踩坑,换成Redis主要有这几个核心原因:

  • 彻底解决并发重复问题:如果多个请求同时从数据库读取当前最大编号,各自加1后生成编码,必然会出现重复编码。数据库加锁能解决,但会把并发请求变成串行处理,性能暴跌。而Redis的INCR命令是原子操作,不管多少请求同时调用,每次都会返回唯一的递增值,根本不会出现重复。
  • 性能碾压数据库:数据库依赖磁盘IO,频繁读写自增字段会拖慢整个库的响应;Redis是纯内存操作,速度比数据库快几个数量级,高并发场景下完全能扛住压力。
  • 分组计数更省心:你需要按姓名前缀(PR、EC、TG)分序列生成编码,用Redis可以给每个前缀单独建一个计数器键(比如seq:PR),不用在数据库里建多张表或者额外字段来区分不同序列,维护起来简单太多。
用Redis实现编码生成的具体步骤

逻辑非常简单,核心就是利用Redis的原子递增命令:

  1. 给每个前缀创建独立计数器:比如PR前缀对应Redis键seq:PR,EC前缀对应seq:EC,用来存储该前缀编码的当前最大序号。
  2. 原子递增获取新序号:调用INCR命令操作对应键——这个命令是原子性的,并发场景下绝对不会出现重复序号。如果键不存在,INCR会自动把它初始化为1,刚好对应第一个编码的序号。
  3. 格式化拼接编码:把返回的数字格式化为固定长度的补零字符串(比如5位,1变成00001),再和前缀拼接,就得到最终的连续编码。

实际操作示例

Redis命令行直接操作

# 生成PR前缀的第一个编码
127.0.0.1:6379> INCR seq:PR
(integer) 1
# 把1转成00001,拼接PR得到PR00001

# 再调用一次,生成第二个编码
127.0.0.1:6379> INCR seq:PR
(integer) 2
# 得到PR00002

Python代码实现(用redis-py库)

import redis

# 连接Redis实例
r = redis.Redis(host='localhost', port=6379, db=0)

def generate_code(prefix):
    # 原子递增获取序号
    seq_num = r.incr(f"seq:{prefix}")
    # 格式化为5位补零的字符串
    formatted_seq = f"{seq_num:05d}"
    # 拼接前缀并返回最终编码
    return f"{prefix}{formatted_seq}"

# 测试调用
print(generate_code("PR"))  # 输出 PR00001
print(generate_code("PR"))  # 输出 PR00002
print(generate_code("EC"))  # 输出 EC00001

额外提示

  • 如果需要重置某个前缀的序列,直接用SET命令设置键值即可,比如SET seq:PR 0,下次调用INCR就会从1开始计数。
  • 担心Redis重启丢失计数器数据?开启Redis的RDB或AOF持久化功能,就能保证计数器数据不会丢失。

内容的提问来源于stack exchange,提问作者information

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 15:50:15