Redis解放高并发下的单号生成(redis高并发生成单号)

随着网络的普及,基于网络的业务在日常中越来越普遍,但是在高并发的状态下,为每位用户生成唯一单号变得很困难,传统的数据库存储方式会带来很多性能问题,比如说读写锁,此时 Redis 的设计就体现出其重要性。

Redis 是一个开源的内存数据库,最大的特点是非常快,绝大多数操作都是几毫秒级别完成,即便是像集合求交集,差集,并集操作也能在很短的时间完成,而且还拥有超高的可扩展性,能支持非常大量的客户端连接,这就让它变成了高并发环境下单号生成的首选。

使用 Redis 来生成唯一单号,常用的方式有两种,一是使用自增长 KEY,存储全局单号值,可以使用它来自动累加,然后在前端对此做格式化处理,就可以得到唯一的编号了,比如使用 INCR 命令来递增 key :

redis 127.0.0.1:6379> INCR order_num
(integer) 1

redis 127.0.0.1:6379> INCR order_num
(integer) 2

redis 127.0.0.1:6379> INCR order_num
(integer) 3

另一种方式是使用 Lua 脚本,可以在脚本中使用多个命令,实现相同的目的,即返回一个唯一的单号,同时可以保证在高并发下也能够得到唯一值,比如使用 setnx 命令:

-- 脚本
local order_num = redis.call('INCR', KEYS[1])
if order_num == 1 then
return redis.call('setnx', 'order_num', tostring(order_num))
else
return order_num
end

-- 运行脚本,只可以运行一次
redis 127.0.0.1:6379> EVAL "local order_num = redis.call('INCR', KEYS[1]) if order_num == 1 then return redis.call('setnx', 'order_num', tostring(order_num)) else return order_num end" 1 order_num
(integer) 1

以上两种方案,都可以在高并发情况下较好实现单号生成,能够保证获取到的结果是唯一的,Redis 在极高并发下的单号生成上能够起到非常大的作用。


数据运维技术 » Redis解放高并发下的单号生成(redis高并发生成单号)