Redis之Lua学习

前言

Redis提供了对Lua脚本的支持。总的来说Lua脚本功能为Redis开发和运维人员带来了如下3个好处:
1.Lua脚本在Redis中是原子执行的,执行过程中不会插入其他命令。
2.Lua脚本可以帮助开发和运维创造出自己定制的命令,并可以将命令发送到
Redis内存中,实现复用的效果。
3.Lua脚本可以将多条命令一次性打包,有效的减少网络开销。

使用

在Redis中执行Lua脚本有两种方法,eval和evalsha。本章节我们重点介绍eval相关命令。

eval

eval命令如下:

   eval script numkeys key [key ...] arg [arg ...]

其中script是一段Lua的脚本程序,它会被运行在Redis的上下文中。 numkeys指定了键名参数的个数。
用一个简单的例子来概括:

127.0.0.1:6379> EVAL 'return {KEYS[1], KEYS[2], ARGV[1], ARGV[2]}' 2 key1 key2 first second
1) "key1"
2) "key2"
3) "first"
4) "second"

在Lua脚本中,可以使用两个不同的函数来执行Redis的命令,分别是:

redis.call() 
redis.pcall()

这两个函数唯一的区别是它们使用不同的方式处理执行命令产生的错误。
redis.call()redis.pcall()两个函数的参数可以是任何格式良好的Redis命令,如下:

127.0.0.1:6379> Eval "return redis.call('set',KEYS[1],ARGV[1], 'ex', ARGV[2], 'xx')" 1 wang hui 15
OK
127.0.0.1:6379> get wang
"hui"

这个命令的意思是当key为wang存在的时候设置值为hui,并且15秒之后过期。

脚本的原子性

Redis使用单个Lua解释器去执行所有的脚本,并且Redis也保证脚本以原子性(atomic)的方式执行:当脚本正在运行的时候不会有其他的脚本或Redis命令被执行。这和使用multi/exec包围的事务很相似。在别的客户端看来,脚本的效果要么是不可见的,要么是已经完成的。
另一方面,这也意味着执行一个缓慢的脚本并不好,当这些脚本在慢吞吞的执行的时候,其他客户端会因为服务器正忙而无法执行命令。

下一篇我们来学习evalsha相关的命令。

你可能感兴趣的:(Redis之Lua学习)