用Redis咋搞自动递增,原理和简单实现说说
- 问答
- 2026-01-13 20:02:01
- 5
用Redis实现自动递增,说白了就是利用Redis本身提供的几个特别适合干这个命令,这活儿对Redis来说是小菜一碟,因为它是一个单线程的内存数据库,能保证操作的原子性,原子性这个词听起来专业,但意思很简单:一个命令执行的时候,不会被其他命令打断,这就好比只有一个窗口的银行,大家必须排队办业务,绝对不会出现两个人同时拿到同一个号码的情况,用Redis生成递增ID,天然就能保证不会重复。
核心原理
实现自动递增,最核心、最常用的Redis命令是 INCR 和 INCRBY。

INCR命令:这是最简单的,你给它一个键(key),比如叫user_id,它就会检查这个键当前的值,如果这个键不存在,Redis会先把它当成0来处理,然后执行加1的操作,最后把结果(也就是1)存回去,并返回给你,下一次你再对同一个键执行INCR,它就会在1的基础上再加1,返回2,以此类推,每次调用都会得到一个比上一次大1的整数。INCRBY命令:这个命令是INCR的增强版,它允许你指定一次增加多少。INCRBY order_id 10,意思是对order_id这个键的值增加10,如果你第一次执行,order_id会从0变成10;第二次执行,就从10变成20,这在需要按批次分配ID或者设置更大步长时很有用。
因为这两个命令都是原子操作,所以无论有多少个客户端同时向Redis发送 INCR 请求,Redis都会让它们排好队,一个一个执行,绝对不会返回相同的值,这就是它能用来做高并发下唯一ID生成器的根本原因。
简单实现
下面用一些伪代码和思路来说明怎么简单实现。

生成简单的用户ID
假设你要给新注册的用户一个唯一的数字ID。
- 初始化:刚开始,你的应用里还没有用户,你不需要在Redis里预先设置
user_id这个键,因为INCR命令会自动处理不存在的键。 - 注册逻辑:当有新用户注册时,你的应用程序(比如用Python、Java等写的)会执行一段类似下面的代码:
new_id = redis_client.incr("user_id")- 这行代码会连接Redis,并执行
INCR user_id命令。
- 获取结果:Redis会返回一个全新的、比上一个ID大1的数字,假设这是第一个用户,返回的就是1,你的应用就可以把这个
new_id(也就是1)分配给这个新用户,并存入数据库。 - 后续流程:第二个用户注册时,同样的代码会返回2,第三个返回3,完全自动,无需操心。
生成每天清零的订单号

有时候我们需要ID按天划分,比如订单号格式是“202405300001”,表示2024年5月30日的第1个订单,第二天要从“202405310001”重新开始。
- 设计键名:关键在于键(key)要包含日期信息,键名可以设计成
order_id:20240530。 - 生成逻辑:每天有新的订单时,你的应用先获取当天的日期,然后拼出键名。
today = "20240530"key = "order_id:" + todaynew_serial_number = redis_client.incr(key)
- 处理结果:
new_serial_number就是从1开始递增的序列号,你把它和日期组合起来,就形成了完整的订单号“202405300001”。 - 自动过期:为了避免Redis里堆积无数个过去的日期键,可以给这个键设置一个过期时间(TTL),比如在执行完
INCR后,马上设置这个键在第二天凌晨过期。redis_client.expire(key, 86400)// 86400秒就是24小时- 这样,
order_id:20240530这个键在5月31号就会自动被Redis删除,节省空间。
一些需要注意的地方
虽然Redis做这个很简单,但也有一些点要留意:
- 持久化问题:Redis的数据默认是在内存里的,如果Redis服务器重启或崩溃,内存里的数据可能会丢失,这意味着你可能会丢失当前最大的ID值,重启后
INCR可能会从一个小得多的数字重新开始,导致ID重复,为了解决这个问题,你必须配置Redis的持久化机制(RDB快照或AOF日志),确保增量数据能定期保存到硬盘上,根据一篇名为《Redis实战》的书籍中的建议,需要根据业务对数据丢失的容忍度来选择合适的持久化策略。 - 不是严格连续:
INCR生成的ID是连续的,但只是在正常情况下,如果你的应用在获取一个ID(比如100)后,在将其存入数据库前崩溃了,那么这个ID100实际上就被“跳过去”了,所以它通常是“趋势递增”且“总体唯一”的,但中间可能会有一些空洞,对于绝大多数需要唯一ID的场景,这完全没问题。 - 键的设计:如订单号的例子所示,键的设计非常灵活,你可以根据业务需求(按用户、按业务类型、按时间)设计不同的键,来管理多个独立的递增序列。
总结一下
用Redis搞自动递增是一个非常经典和高效的方案,它的原理就是靠 INCR/INCRBY 这两个原子命令来保证并发下的唯一性,实现起来也特别简单,几行代码就能搞定一个高并发的ID生成器,你主要需要关注的就是Redis的持久化配置,防止服务器重启导致ID回溯,对于需要分布式ID生成的场景,比如你的应用部署在多台服务器上,它们都连接同一个Redis实例,那么这个方案依然完美适用,因为所有服务器都在向同一个“发号中心”申请号码,自然不会重复。
本文由度秀梅于2026-01-13发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://haoid.cn/wenda/80125.html
