本文介绍: 为了解决问题redis提供了evalsha命令允许开发者通过脚本内容的SHA1摘要执行脚本,该命令用法eval一样,不过是将脚本内容替换脚本内容的SHA1摘要redis执行eval命令时会计算脚本的SHA1摘要记录脚本缓存中,执行evalsha命令redis会根据提供的摘要脚本缓存查找对应脚本内容,如果找到了则执行脚本,否则返回错误。SCRIPT FLUSH命令,redis脚本的SHA1摘要加入到脚本缓存后会永久保留,不会删除可以使用该命令清空脚本缓存

Lua脚本

redis可以支持lua脚本,可以使用lua脚本来将几个命令整合一个整体执行,这样可以使得多个命令原子操作,且可以减少网络开销

Lua数据类型

Lua一个动态类型语言一个变量可以存储任何类型的值,类型有:

eval命令

redis内有内置lua解释器,可以使用eval命令对lua脚本进行求值

# script是lua脚本
# numkeys指定键名参数个数
# key [key ...]  在脚本中使用的redis键,个数numkeys指定个数,可以在lua中通过全局变量KEYS数组,从1开始,KEYS[1],KEYS[2]等
# arg [arg ...]  参数,可以在lua中通过全局变量ARGV数组访问,ARGV[1],ARGV[2]等
evascript numkeys key [key ...] arg [arg ...]

#
示例
eval "return {KEYS[1],KEYS[2],ARGV[1]}" 2 keykeyfirst

还可以在lua脚本中调用redis命令,使用redis.call

eval "return redis.call('set',KEYS[1],'bar')" 1 foo

需要注意的是,redis执行lua脚本和普通命令一样,都是会写入AOF文件发布主从复制连接上的,有两种方式

evalsha命令

考虑到脚本比较长的情况,如果每次调用脚本都需要将整个脚本传给redis占用较多的带宽。为了解决问题redis提供了evalsha命令允许开发者通过脚本内容的SHA1摘要来执行脚本,该命令的用法的eval一样,不过是将脚本内容替换为脚本内容的SHA1摘要

redis在执行eval命令时会计算脚本的SHA1摘要并记录在脚本缓存中,执行evalsha命令时redis会根据提供的摘要从脚本缓存查找对应的脚本内容,如果找到了则执行脚本,否则返回错误

使用流程

  • 先计算脚本的SHA1摘要,并使用evalsha命令执行脚本
  • 获的返回值,如果返回“NoScript错误则使用eval命令重新执行脚本

其他不常用的命令

这些命令不是不常用,而是经常被工具类封装起来,开发者如果不深入源码查看,很少会用到

将脚本加入缓存

SCRIPT LOAD命令,作用是每次执行eval命令时redis都会将脚本的SHA1摘要加入到脚本缓存中,以便下次客户端可以使用evalsha命令调用该脚本。如果只是希望将脚本加入缓存而不执行,则使用SCRIPT LOAD命令,返回值是脚本的SHA1摘要

判断脚本是否缓存

SCRIPT EXISTS命令,可以同时查找多个脚本的SHA1摘要是否被缓存

清空脚本缓存

SCRIPT FLUSH命令,redis将脚本的SHA1摘要加入到脚本缓存后会永久保留,不会删除,可以使用该命令清空脚本缓存

强制终止当前脚本的执行

SCRIPT KILL命令,如果想终止当前正在执行的脚本可以使用该命令

https://zhhll.icu/2021/数据库/非关系型数据库/redis/基础/14.lua脚本/

本文 mdnice 平台发布

原文地址:https://blog.csdn.net/Lxn2zh/article/details/134801520

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_47468.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注