redis中使用lua脚本
2018-06-12 02:13:00
(304)
### redis中使用lua脚本 ###
---
- 前言
redis自身是单进程模型,在处理lua脚本的时候能够保证不存在任何其他执行的命令或脚本,因此能够保证业务的原子性,同时,处理性能比使用事务和管道也更高
- redis命令
- `eval`
- 格式: eval script_content key_arg_len key_args extra_args
- 说明: 键参数通过KEYS内置变量调用, 位移跟lua惯例一样,从1开始; 额外参数通过ARGV内置变量获取, 位移跟lua惯例一样,从1开始.
- `evalsha`
- 格式: evalsha script_content_hash key_arg_len key_args extra_args
- 说明: redis在执行成功lua脚本后默认会缓存lua脚本内容, 缓存命中依据为lua脚本内容hash, 在脚本内容复杂的情况下, 使用脚本缓存能够节省一定的网络开销.
- `script exists`
- 格式: script exists script_content_hash
- 说明: 查询脚本缓存是否存在
- `script load`
- 格式: script load script_content
- 说明: 载入lua脚本, 返回脚本hash
- lua api
- `redis.call`
- 说明: 按照标准redis命令执行; 该方法不会抑制命令错误
- `redis.pcall`
- 说明: 按照标准redis命令执行; 该方法会抑制命令错误,返回错误提示
- `redis.log`
- 格式: redis.log(log_level, log_message)
- 说明: log_level包括`redis.LOG_DEBUG`, `redis.LOG_VERBOSE`, `redis.LOG_NOTICE`, `redis.LOG_WARNING`.
- `table`库
- `string`库
- `math`库
- `debug`库
- `cjson`库
- 备注
1. 由于lua脚本执行会阻塞其他客户端命令,因此lua脚本不宜执行过长,默认`lua-time-limit`参数为5秒.
2. lua脚本缓存会在redis关机或者重启后失效.