事务
Redis支持简单的事务:
命令 | 说明 |
---|---|
mutli | 代表事物开始 |
exec | 代表事物结束 |
discard | 命令表示停止事物。 |
watch | 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。 |
- 当客户端处于非事务状态下时, 所有发送给服务器端的命令都会立即被服务器执行
- 当客户端进入事务状态之后,服务器在收到来自客户端的命令时, 不会立即执行命令, 而是将这些命令全部放进一个事务队列里, 然后返回 QUEUED , 表示命令已入队
- WATCH 命令用于在事务开始之前监视任意数量的键: 当调用 EXEC 命令执行事务时, 如果任意一个被监视的键已经被其他客户端修改了, 那么整个事务不再执行, 直接返回失败
如果事务中的命令出现错误,Redis的处理也不尽相同
- 语法错误则整个事物无法执行
- 非语法错误则会部分执行,并且不支持回滚, 只会将错误包含在事务的结果中, 这不会引起事务中断或整个失败,不会影响已执行事务命令的结果,也不会影响后面要执行的事务命令
Lua脚本
Lua脚本在Redis中的执行是原子性执行的,执行过程中不会插入其他命令
Redis 就可以通过 EVAL 命令或 EVALSHA 命令执行 Lua 脚本了
- eval
eval 脚本内容 key个数 key列表 参数列表
例如:
eval 'return "hello"..KEYS[1]..ARGV[1]' 1 redis world
此时 KEYS[1] = reids , ARGV[1] = world,
结果:"hello redisworld"
如果脚本过长可以使用 redis-cli --eval 直接执行文件
- evalsha
evalsha 脚本SHA1值 key个数 key列表 参数列表
首先将Lua脚本加载到Redis服务端得到该脚本的SHA1校验,evalsha
命令使用SHA1做为参数直接执行lua脚本,避免每次都发送Lua脚本的开销。- 首先将Lua脚本加载到Redis服务端得到该脚本的SHA1校验,evalsha
命令使用SHA1做为参数直接执行lua脚本,避免每次都发送Lua脚本的开销。
脚本会常驻服务端- 脚本会常驻服务端
Lua的Redis API
redis.call("set", "hello", "world")
如果运行失败则脚本执行结束并返回redis.pcall("set", "hello", "world")
如果运行失败会忽略失败继续执行
Redis中管理Lua脚本
script load
script 将Lua脚本加载到Redis内存中script exists
sh1 [sha1 …] 判断sha1脚本是否在内存中script flush
清空Redis内存中所有的Lua脚本script kill
杀死正在执行的Lua脚本。(如果此时Lua脚本正在执行写操作,那么script kill
将不会生效)
Redis提供了一个lua-time-limit参数,默认5秒,它是Lua脚本的超时时间,如果Lua脚本超时,其他执行正常命令的客户端会收到“Busy Redis is busy running a script”错误,但是不会停止脚本运行,此时可以使用script kill
杀死正在执行的Lua脚本。