Redis附加功能-Lua脚本

介绍

为了解决Redis其他附加功能的缺陷,从2.6版本在服务器内部嵌入了Lua解释器,使得用户可以在服务器端执行Lua脚本
功能好处:

  • 使用脚本可以直接在服务器端执行 Redis 命令,一般的数据处理操作可以直接使用Lua语言或者Lua 解释器提供的函数库来完成,不必再返回给客户端进行处理。
  • 所有脚本都是以事务的形式来执行的,脚本在执行过程中不会被其他工作打断,也不会引起任何 竞争条件,完全可以使用 Lua 脚本来代替事务和乐观锁。
  • 所有脚本都是可重用的,重复执行相同的操作时,只要调用储存在服务器内部的脚本缓存就可以了,不用重新发送整个脚本,从而尽可能地节约网络资源
命令
  • EVAL script numkeys key [key …] arg [arg …]
    执 行Lua脚本
    script: 要执行的Lua脚本
    numkeys: 脚本要处理的数据库键的数量,之后的 key [key …] 参数指定了脚本要处理的数据库键,被传入的键可以在脚本里面通过访问 KEYS 数组来取得,比如 KEYS[1] 就取出第一个输入的键,KEYS[2] 取出第二个输入的键等
    arg [arg …]: 指定脚本要用到的参数,在脚本里面可以通 过访问 ARGV 数组来获取这些参数。显式地指定脚本里面用到的键是为了配合 Redis 集群对键的检查,如果不这样做的话,在集群里面使用脚本可能会出错

    通过显式地指定脚本要用到的数据库键以及相关参数,而不是将数据库键和参数硬写在脚本里面,用户可以更方便地重用同一个脚本

Lua脚本中执行Redis命令
  • redis.call()

  • redis.pcall()

  • 样例:指定DBSIZE命令

    127.0.0.1:6379> dbsize
    (integer) 1
    127.0.0.1:6379> eval "return redis.call('dbsize')" 0
    (integer) 1
    
  • 样例:执行GET命令,取出键msg的值,并对值进行字符串拼接操作

    127.0.0.1:6379> eval "return 'msg is: ' .. redis.call('get', KEYS[1]) " 1 msg
    "msg is: hello"
    
  • redis.call() 和 redis.pcall() 的区别
    当被执行的脚本出错时,redis.call() 会返回出错脚本的名字以及 EVAL 命令的错误信息,而 redis.pcall() 只返回EVAL命令的错误信息

使用EVALSHA来减少网络资源损耗
  • 任何 Lua 脚本,只要被 EVAL 命令执行过一次,就会被储存到服务器的脚本缓存里面,用户只要通过EVALSHA 命令,指定被缓存脚本的 SHA1 值,就可以在不发送脚本的情况下,再次执行脚本
    127.0.0.1:6379> eval "return 'hello world'" 0
    "hello world"
    127.0.0.1:6379> evalsha 5332031c6b470dc5a0dd9b4bf2030dea6d65de91 0
    "hello world"
    127.0.0.1:6379> evalsha 5332031c6b470dc5a0dd9b4bf2030dea6d65de91 0
    "hello world"
    127.0.0.1:6379> evalsha 5332031c6b470dc5a0dd9b4bf2030dea6d65de92 0
    (error) NOSCRIPT No matching script. Please use EVAL.
    127.0.0.1:6379> evalsha 5332031c6b470dc5a0dd9b4bf2030dea6d65de91 0
    "hello world"
    
脚本管理命令
  • SCRIPT EXISTS sha1 [sha1 …]
    检查 sha1值所代表的脚本是否已经被加入到脚本缓存里面,是的话返回 1 ,不是的话返回 0

    127.0.0.1:6379> script exists 5332031c6b470dc5a0dd9b4bf2030dea6d65de91 
    1) (integer) 1
    127.0.0.1:6379> script exists 5332031c6b470dc5a0dd9b4bf2030dea6d65de912
    1) (integer) 0
    
  • SCRIPT LOAD script
    将脚本储存到脚本缓存里面,等待将来 EVALSHA 使用

  • SCRIPT FLUSH
    清除脚本缓存储存的所有脚本

  • SCRIPT KILL
    杀死运行超时的脚本
    如果脚本已经执行过写入操作,那么还需要使用 SHUTDOWN NOSAVE命令来强制服务器不保存数据,以免错误的数据被保存到数据库里面

函数库
标准库
  • base库 包含 Lua 的核心(core)函数,比如 assert、tostring、error、type 等
  • string库 包含用于处理字符串的函数,比如 find、format、len、reverse 等
  • table库 包含用于处理表格的函数,比如 concat、insert、remove、sort 等
  • math库 包含常用的数学计算函数,比如 abs、sqrt、log 等
  • debug库 包含调试程序所需的函数,比如 sethook、gethook 等
外部库
  • struct 库 在 C 语言的结构和 Lua 语言的值之间进行转换。
  • cjson 库 将 Lua 值转换为 JSON 对象,或者将 JSON 对象转换为 Lua 值。
  • cmsgpack库 将 Lua 值编码为 MessagePack 格式,或者从 MessagePack 格式里面解码出 Lua
计算sha1值外部函数
  • redis.sha1hex
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值