QUEUED
redis> HGET map “csc”
QUEUED
redis> EXEC
-
OK
-
“lwl”
复制代码
lua 实现 redis 事务
除了 MULTI、WATCH、EXEC 命令,还有其他的方式可做到 redis 原子性和隔离性吗?有的,lua 脚本;redis 内置了lua的执行环境,并自带了一些 lua 函数库。redis 执行 lua 时,会启动一个伪客户端去执行脚本里的 redis 命令
-
一致性,原子性,持久性 和 MULTI,EXEC 过程相似:如果 lua 存在错误的命令名称,事务会执行失败。如果在执行 redis 命令过程出现异常,之前正常执行的命令也不会回滚
-
lua 脚本被当做一命令集合一起被执行,且 redis 是单线处理机制,因此不需要 WATCH 保证隔离性,天然具备隔离性
-
Lua调用Redis指令:
redis.call("命令名称",参数1,参数2)
优点
-
减少网络开销:可以将多个请求通过脚本的形式一次发送,减少网络时延
-
原子操作:Redis会将整个脚本作为一个整体执行,中间不会被其他请求插入。在脚本运行过程中无需担心会出现竞态条件
-
可重复使用:客户端发送的脚本会永久存在 redis 中,这样其他客户端可以复用这一脚本,而不需要使用代码完成相同的逻辑
抢红包方案
-
问题关键点
-
一:用户是否参与过活动,不可重复参与
-
二:红包数量有限;而且一个可抢的红包,保证不能让多个人同时抢到
-
三:持久化存储红包与用户的关系
-
四:如何保证 步骤一到步骤三的原子性和隔离性
关键点一
-
<