欢迎来到天天文库
浏览记录
ID:37900849
大小:35.37 KB
页数:22页
时间:2019-06-02
《Redis+命令参考(中文版)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Redis命令参考(中文版)——Script(脚本)目录Script(脚本)1EVAL1SCRIPTFLUSH17SCRIPTLOAD17SCRIPTEXISTS18SCRIPTKILL20Script(脚本)EVALEVALscriptnumkeyskey[key...]arg[arg...]从Redis2.6.0版本开始,通过内置的Lua解释器,可以使用EVAL命令对Lua脚本进行求值。script参数是一段Lua5.1脚本程序,它会被运行在Redis服务器上下文中,这段脚本不必(也不应该)定义为一个
2、Lua函数。numkeys参数用于指定键名参数的个数。键名参数key[key...]从EVAL的第三个参数开始算起,表示在脚本中所用到的那些Redis键(key),这些键名参数可以在Lua中通过全局变量KEYS数组,用1为基址的形式访问(KEYS[1],KEYS[2],以此类推)。在命令的最后,那些不是键名参数的附加参数arg[arg...],可以在Lua中通过全局变量ARGV数组访问,访问的形式和KEYS变量类似(ARGV[1]、ARGV[2],诸如此类)。上面这几段长长的说明可以用一个简单的例子来概括
3、:>eval"return{KEYS[1],KEYS[2],ARGV[1],ARGV[2]}"2key1key2firstsecond1)"key1"2)"key2"3)"first"4)"second"其中"return{KEYS[1],KEYS[2],ARGV[1],ARGV[2]}"是被求值的Lua脚本,数字2指定了键名参数的数量,key1和key2是键名参数,分别使用KEYS[1]和KEYS[2]访问,而最后的first和second则是附加参数,可以通过ARGV[1]和ARGV[2]访问它们。在
4、Lua脚本中,可以使用两个不同函数来执行Redis命令,它们分别是:redis.call()redis.pcall()这两个函数的唯一区别在于它们使用不同的方式处理执行命令所产生的错误,在后面的『错误处理』部分会讲到这一点。redis.call()和redis.pcall()两个函数的参数可以是任何格式良好(wellformed)的Redis命令:>eval"returnredis.call('set','foo','bar')"0OK需要注意的是,上面这段脚本的确实现了将键foo的值设为bar的目的,但
5、是,它违反了EVAL命令的语义,因为脚本里使用的所有键都应该由KEYS数组来传递,就像这样:>eval"returnredis.call('set',KEYS[1],'bar')"1fooOK要求使用正确的形式来传递键(key)是有原因的,因为不仅仅是EVAL这个命令,所有的Redis命令,在执行之前都会被分析,籍此来确定命令会对哪些键进行操作。因此,对于EVAL命令来说,必须使用正确的形式来传递键,才能确保分析工作正确地执行。除此之外,使用正确的形式来传递键还有很多其他好处,它的一个特别重要的用途就是确
6、保Redis集群可以将你的请求发送到正确的集群节点。(对Redis集群的工作还在进行当中,但是脚本功能被设计成可以与集群功能保持兼容。)不过,这条规矩并不是强制性的,从而使得用户有机会滥用(abuse)Redis单实例配置(singleinstanceconfiguration),代价是这样写出的脚本不能被Redis集群所兼容。在Lua数据类型和Redis数据类型之间转换¶当Lua通过call()或pcall()函数执行Redis命令的时候,命令的返回值会被转换成Lua数据结构。同样地,当Lua脚本在Re
7、dis内置的解释器里运行时,Lua脚本的返回值也会被转换成Redis协议(protocol),然后由EVAL将值返回给客户端。数据类型之间的转换遵循这样一个设计原则:如果将一个Redis值转换成Lua值,之后再将转换所得的Lua值转换回Redis值,那么这个转换所得的Redis值应该和最初时的Redis值一样。换句话说,Lua类型和Redis类型之间存在着一一对应的转换关系。以下列出的是详细的转换规则:从Redis转换到Lua:Redisintegerreply->Luanumber/Redis整数转换成
8、Lua数字Redisbulkreply->Luastring/Redisbulk回复转换成Lua字符串Redismultibulkreply->Luatable(mayhaveotherRedisdatatypesnested)/Redis多条bulk回复转换成Lua表,表内可能有其他别的Redis数据类型Redisstatusreply->Luatablewithasingleokfieldcontainingthestat
此文档下载收益归作者所有