事务
MULTI
使用 MULTI
+ EXEC
命令可以将一批命令一起执行。如:
> MULTI // 开启事务
> SET foo "foo"
QUEUED
> INCR foo // 提一个错误命令:对字符串自增
QUEUED
> EXEC // 提交事务
1) OK
2) (error) ERR value is not an integer or out of range
但坑的是,执行期间如果有命令报错了,是不会回滚的。比如上面给字符串自增,提交后会报错,但之前的 foo
命令会正常执行。
所以 MULTI
其实不算事务,从名字上看也是,不过是批量执行。
WATCH
使用 WACTH
命令可以监视一个 key
。结合 MULTI
使用可以达到,在 MULTI
期间,如果 key
的值发生变化,不进行提交的效果,有点类似 CAS
的概念
不过由于还是用了 MULTI
的命令,所以并不能避免上面 MULTI
本身的问题(报错时无法回滚。
使用例子:
> WATCH a // 监控a
> SET a 0 // 修改a
> MULTI
> SET a 1 // 在 MULTI 里修改a。由于监控后a已经被修改了,因此这里会修改失败
> EXEC
(nil) // 修改失败
LUA
redis
还提供了eval
/ evalsha
命令来执行 Lua
脚本。 首先要将 Lua
脚本加载到 redis
服务端, 得到该脚本的 SHA1
校验和,evalsha
命令使用 SHA1
作为参数可以直接执行对应 Lua
脚本, 避免每次发送 Lua
脚本的开销。 这样客户端就不需要每次执行脚本内容, 而脚本也会常驻在服务端, 脚本功能得到了复用。
Lua
脚本功能为 redis
开发和运维人员带来如下三个好处:
Lua
脚本在redis
中是原子执行的, 执行过程中间不会插入其他命令。Lua
脚本可以帮助开发和运维人员创造出自己定制的命令, 并可以将这些命令常驻在redis
内存中, 实现复用的效果。Lua
脚本可以将多条命令一次性打包, 有效地减少网络开销。
Last updated