如何用Redis生成自定义连续编码?为何选择Redis实现?
为什么要用Redis生成这类连续编码?
你原来的数据库方案在高并发场景下会踩坑,换成Redis主要有这几个核心原因:
- 彻底解决并发重复问题:如果多个请求同时从数据库读取当前最大编号,各自加1后生成编码,必然会出现重复编码。数据库加锁能解决,但会把并发请求变成串行处理,性能暴跌。而Redis的
INCR命令是原子操作,不管多少请求同时调用,每次都会返回唯一的递增值,根本不会出现重复。 - 性能碾压数据库:数据库依赖磁盘IO,频繁读写自增字段会拖慢整个库的响应;Redis是纯内存操作,速度比数据库快几个数量级,高并发场景下完全能扛住压力。
- 分组计数更省心:你需要按姓名前缀(PR、EC、TG)分序列生成编码,用Redis可以给每个前缀单独建一个计数器键(比如
seq:PR),不用在数据库里建多张表或者额外字段来区分不同序列,维护起来简单太多。
用Redis实现编码生成的具体步骤
逻辑非常简单,核心就是利用Redis的原子递增命令:
- 给每个前缀创建独立计数器:比如PR前缀对应Redis键
seq:PR,EC前缀对应seq:EC,用来存储该前缀编码的当前最大序号。 - 原子递增获取新序号:调用
INCR命令操作对应键——这个命令是原子性的,并发场景下绝对不会出现重复序号。如果键不存在,INCR会自动把它初始化为1,刚好对应第一个编码的序号。 - 格式化拼接编码:把返回的数字格式化为固定长度的补零字符串(比如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
相关产品推荐
相关产品推荐

