redis事务--lua脚本

Lua 简介

Lua语言是在1993年由巴西一个大学研究小组发明,其设计目标是作为 嵌入式程序移植到其他应用程序,它是由C语言实现的,虽然简单小巧但是 功能强大,所以许多应用都选用它作为脚本语言,尤其是在游戏领域,例如 大名鼎鼎的暴雪公司将Lua语言引入到“魔兽世界”这款游戏中,Rovio公司将 Lua语言作为“愤怒的小鸟”这款火爆游戏的关卡升级引擎,Web服务器Nginx 将Lua语言作为扩展,增强自身功能。Redis将Lua作为脚本语言可帮助开发 者定制自己的Redis命令,在这之前,必须修改源码。在介绍如何在Redis中 使用Lua脚本之前,有必要对Lua语言的使用做一个基本的介绍。

redis执行Lua

1.在Redis中使用Lua 在Redis中执行Lua脚本有两种方法: eval和evalsha。
(1)eval

eval 脚本内容 key个数 key列表 参数列表
eval 'return "hello " .. KEYS[1] .. ARGV[1]' 1 redis world

此时KEYS[1]="redis",ARGV[1]="world",所以最终的返回结果 是"hello redisworld"。
如果Lua脚本较长,还可以使用redis-cli--eval直接执行文件。
eval命令和--eval参数本质是一样的,客户端如果想执行Lua脚本,首先 在客户端编写好Lua脚本代码,然后把脚本作为字符串发送给服务端,服务 端会将执行结果返回给客户端,整个过程如图所示。

截屏2020-01-3008.17.00.png

(2)evalsha
图 eval命令执行Lua脚本过程
除了使用eval,Redis还提供了evalsha命令来执行Lua脚本。如图所示,首先要将Lua脚本加载到Redis服务端,得到该脚本的SHA1校验和, evalsha命令使用SHA1作为参数可以直接执行对应Lua脚本,避免每次发送 Lua脚本的开销。这样客户端就不需要每次执行脚本内容,而脚本也会常驻 在服务端,脚本功能得到了复用。

截屏2020-01-3008.16.23.png
  • 加载脚本
    script load命令可以将脚本内容加载到Redis内存中,例如下 面将lua_get.lua加载到Redis中,得到SHA1 为:"7413dc2440db1fea7c0a0bde841fa68eefaf149c"
# redis-cli script load "$(cat lua_get.lua)"
"7413dc2440db1fea7c0a0bde841fa68eefaf149c"
  • 执行脚本
    evalsha的使用方法如下,参数使用SHA1值,执行逻辑和 eval一致。
    evalsha 脚本SHA1值 key个数 key列表 参数列表
    所以只需要执行如下操作,就可以调用lua_get.lua脚本:
127.0.0.1:6379> evalsha 7413dc2440db1fea7c0a0bde841fa68eefaf149c 1
redis world "hello redisworld"

调用redis的api

Lua可以使用redis.call和redis.pcall函数实现对Redis的调用,redis.call和 redis.pcall的不同在于,如果redis.call执行失败,那么脚本执行结束会直接返 回错误,而redis.pcall会忽略错误继续执行脚本,所以在实际开发中要根据 具体的应用场景进行函数的选择。

应用场景

  • 自定义redis命令
  • 基于redis的分布式锁

你可能感兴趣的:(redis事务--lua脚本)