Redis中每条命令都是原子性的,即执行结果要么全部成功要么全部失败。在某些业务场景下,需要执行多条命令,并且要保证多条命令的原子性。这时,如果命令逐条执行,显然是不能保证原子性的。有同学可能会想到使用Redis的事务功能,事务是可以保证原子性,但是受限于命令的功能,有些场景下并不能实现想要的功能。
创新互联公司专注于企业营销型网站建设、网站重做改版、大丰网站定制设计、自适应品牌网站建设、H5响应式网站、购物商城网站建设、集团公司官网建设、外贸网站制作、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为大丰等各大城市提供网站开发制作服务。
使用执行Lua脚本的方式可以解决以上问题,Lua脚本整体上在Redis中是原子性的。
在Redis中通过EVAL命令来执行Lua脚本,基本语法如下:
redis 127.0.0.1:6379> EVAL script numkeys key [key ...] arg [arg ...]
参数说明:
获取指定key的值,相当于于 GET somekey
EVAL "return redis.call('GET', KEYS[1])" 1 somekey
再看一个LPUSH的例子,相当于 LPUSH somelist 1 2 3
EVAL "return redis.call('LPUSH',KEYS[1], ARGV[1], ARGV[2], ARGV[3])" 1 somelist 1 2 3
简单说下Redis执行lua脚本相关的其他几个命令:
调用Redis命令,当执行出错时,该方法会直接返回错误,并退出。
redis.call(redisCommand, key, argv...)
调用Redis命令,当执行出错时,记录错误信息,并继续执行。
redis.pcall(redisCommand, key, argv...)
记录日志,写入到Redis配置的日志文件中,日志级别有四种,分别是redis.LOG_DEBUG、redis.LOG_VERBOS、redis.LOG_NOTICE和redis.LOG_WARNING。
redis.log(logLevel, message)
计算输入字符串的sha1哈希值。
redis.sha1hex(arvg)
Redis调用Lua脚本,脚本执行完成后将结果返回给Redis,Redis再将结果返回给客户端。这个过程中会出现Redis执行结果类型到Lua数据类型的转换,然后Lua类型到Redis类型的转换。Redis类型到Lua类型转换关系如下:
Redis返回的数据类型 |
Lua数据类型 |
integer(整数回复) |
number(数字类型) |
bulk replay(字符串) |
string(字符串类型) |
多行字符串 |
table(数组形式) |
status(状态回复) |
table(只有一个ok字段的数组) |
error(错误回复) |
table(只有一个err字段的数组) |
Lua类型到Redis类型转换关系如下:
Lua数据类型 |
Redis返回数据类型 |
number(数字类型) |
integer(整数回复) |
string(字符串类型) |
bulk replay(字符串) |
table(数组形式) |
多行字符串 |
table(只有一个ok字段的数组) |
status(状态回复) |
table(只有一个err字段的数组) |
error(错误回复) |
本文标题:如何在Redis中执行Lua脚本?
当前链接:http://www.mswzjz.cn/qtweb/news20/66370.html
攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能