华夏棋牌

目录 搜索
Cluster cluster addslots(集群 槽位) cluster count failure reports(集群计数掉落败申报) cluster countkeysinslot cluster delslots cluster failover cluster forget cluster getkeysinslot cluster info cluster keyslot(集群键槽) cluster meet cluster nodes(集群节点) cluster replicate(集群复制) cluster reset(集群重置) cluster saveconfig cluster set config epoch cluster setslot cluster slaves cluster slots readonly readwrite Connection auth echo ping quit select swapdb Geo geoadd geodist geohash geopos georadius georadiusbymember Hashes hdel hexists hget hgetall hincrby hincrbyfloat hkeys hlen hmget hmset hscan hset hsetnx hstrlen hvals HyperLogLog pfadd pfcount pfmerge Keys del dump exists expire expireat keys migrate move object persist pexpire pexpireat pttl randomkey rename renamenx restore scan sort touch ttl type unlink wait Lists blpop brpop brpoplpush lindex linsert llen lpop lpush lpushx lrange lrem lset ltrim rpop rpoplpush rpush rpushx Pub/Sub psubscribe publish pubsub punsubscribe subscribe unsubscribe Scripting eval evalsha script debug script exists script flush script kill script load Server bgrewriteaof bgsave client getname client kill client list client pause client reply client setname command command count command getkeys command info config get config resetstat config rewrite config set dbsize debug object debug segfault flushall flushdb info lastsave monitor role save shutdown slaveof slowlog time Sets sadd scard sdiff sdiffstore sinter sinterstore sismember smembers smove spop srandmember srem sscan sunion sunionstore Sorted Sets zadd zcard zcount zincrby zinterstore zlexcount zrange zrangebylex zrangebyscore zrank zrem zremrangebylex zremrangebyrank zremrangebyscore zrevrange zrevrangebylex zrevrangebyscore zrevrank zscan zscore zunionstore Strings append bitcount bitfield bitop bitpos decr decrby get getbit getrange getset incr incrby incrbyfloat mget mset msetnx psetex set setbit setex setnx setrange strlen Transactions discard exec multi unwatch watch
文字

EVAL script numkeys key [key ...] arg [arg ...]

自2.6.0起可用。

时间严重年夜度:取决于推行的剧本。

EVAL简介

华夏棋牌EVAL 和 EVALSHA 用于从版本2.6.0泉源应用内置在 Redis 中的 Lua 说冥器来评价剧本。

EVAL 的第一个参数是一个 Lua 5.1 剧本。剧本不须要界说一个 Lua 函数(不应该)。这只是一个 Lua 法式模范模范,它将在 Redis 服务器的曲折文中运转。

EVAL 的第二个参数是剧本前面的参数个数(从第三个参数泉源)代表 Redis 键称谓。参数可以经由历程 Lua 中应用来会见KEYS全局变量在基于一个阵列(这样的形式KEYS[1]KEYS[2]...)。

一切其他参数不应该代表键称谓,可以经由历程 Lua 的应用来会见ARGV全局变量,异常类似与甚么发生了键(以是ARGV[1]ARGV[2]...)。

以下示例应当诠释上述内容:

> eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second1) "key1"2) "key2"3) "first"4) "second"

重视:正如你所看到的,Lua 数组是以 Redis 多重批量回复的形式前往的,这是一种 Redis 前往类型,客户端库能够会将其转换为编程语言中的 Array 类型。

可以应用两个不合的 Lua 函数从 Lua 剧本挪用 Redis 敕令:

  • redis.call()

  • redis.pcall()

redis.call()redis.pcall()类似,唯一的差异是,假定 Redis 敕令挪用会招致弱点,redis.call()将激起 Lua 弱点,反已往会强迫 EVAL 向敕令挪用方前往弱点,同时redis.pcall将圈套弱点并前往 Lua 表代表弱点。

函数redis.call()redis.pcall()函数的参数都是名堂优胜的 Redis 敕令的一切参数:

> eval "return redis.call('set','foo','bar')" 0OK

下面的剧本将键foo设置为字符串bar。可是,它背背了 EVAL 敕令的语义,由于剧本应用的一切键都应当应用KEYS数组转达:

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

华夏棋牌在推行之前,必须剖析一切 Redis 敕令,以确天敕令将在哪些键上运转。为了使 EVAL 成为真,密钥必须明确转达。这在许多方面都很有用,但特殊要确保 Redis 群集可以将您的请求转发到适当的群集节点。

请重视,此规则未实验,以便为用户供应滥用 Redis 单实例装备的时机,价值是编写与 Redis 群集不兼容的剧本。

Lua 剧本可以应用一组转换规则前往从 Lua 类型转换为 Redis 协定的值。

Lua 和 Redis 数据类型之间的转换

当 Lua 应用call()或挪用 Redis 敕令时,Redis 前往值将转换为 Lua 数据类型pcall()。异常,在挪用 Redis 敕令和 Lua 剧本前往值时,Lua 数据类型将转换为 Redis 协定,以便剧本可以控制 EVAL 前往给客户真个内容。

数据类型之间的这类转换的设计要领是,假定将 Redis 类型转换为 Lua 类型,然后将效果转换回 Redis 类型,则效果与初始值类似。

华夏棋牌换句话说,Lua 和 Redis 类型之间存在一对一的转换。下表显示了一切转换规则:

Redis 转换为 Lua 转换表。

  • 华夏棋牌Redis 整数回复 -> Lua 编号

  • 华夏棋牌Redis 批量回复 -> Lua 字符串

  • Redis 多批量回复 -> Lua 表(能够嵌套有其他 Redis 数据类型)

  • Redis 状态回复 -> ok网罗状态的单个字段的 Lua 表

  • Redis 弱点回复 -> err网罗弱点的单个字段的 Lua 表

  • 华夏棋牌Redis Nil 批量回复和 Nil 多批量回复 -> Lua false 布尔类型

Lua Redis 转换表。

  • Lua 数字 -> Redis 整数回复(将数字转换为整数)

  • 华夏棋牌Lua 字符串 -> Redis 批量回复

  • 华夏棋牌Lua 表(数组) -> Redis 多批量回复(假定有的话,截断到 Lua 数组中的第一个零)

  • 具有单个ok字段的 Lua 表- > Redis 状态回复

  • 具有单个err华夏棋牌字段的 Lua 表 -> Redis 弱点回复

  • 华夏棋牌Lua boolean 弱点  -> Redis 零批量回复

华夏棋牌尚有一个特殊的 Lua-to-Redis 转换规则没有对应的 Redis 到 Lua 转换规则:

  • Lua boolean true  -> 值为1的 Redis 整数回复。尚有两个主要的规则须要重视:

  • Lua 有一个数字类型,Lua 数字。整数和浮点数之间没有差异。以是我们总是将 Lua 数字转换为整数回复,假定有的话删除数字的小数部门。假定你想从 Lua 前往一个浮点数,你应当像字符串一样前往它,就像 Redis 自己一样(参见例如 ZSCORE 敕令)。

  • 华夏棋牌有没有质朴的措施有 lua 阵内尼尔斯,这是的 Lua 表语义的效果,以是当 Redis 的一个 Lua 阵列转换成 Redis 的协定假定遇到零的转换阻拦。

以下是几个转换示例:

> eval "return 10" 0(integer) 10> eval "return {1,2,{3,'Hello World!'}}" 01) (integer) 12) (integer) 23) 1) (integer) 3   2) "Hello World!"> eval "return redis.call('get','foo')" 0"bar"

最后一个例子展示它是若何能够取得着实着实切的前往值redis.call()或许redis.pcall()从 Lua,假定敕令直接挪用将被退回。

不才面的例子中,我们可以看到若那里置赏罚带有 nils 的浮点数组和数组:

> eval "return {1,2,3.3333,'foo',nil,'bar'}" 01) (integer) 12) (integer) 23) (integer) 34) "foo"

正如你可以看到3.333转化成3,永世不会前往的 bar 字符串,是由于之前是零。

Helper 函数前往 Redis 类型

有两个赞助函数可以从 Lua 前往 Redis 类型。

  • redis.error_reply(error_string)前往弱点回复。这个函数只前往一个字段表,其中err字段为你设置的字段。

  • redis.status_reply(status_string)前往状态回复。这个函数只前往一个字段表,其中ok字段为你设置的字段。

华夏棋牌应用赞助函数或直接以指命名堂前往表没有差异,以是以下两种形式是等价的:

return {err="My Error"}return redis.error_reply("My Error")

剧本的原子性

华夏棋牌Redis 应用类似的 Lua 说冥器来运转一切敕令。另外,Redis 保证以原子要领推行剧本:推行剧本时不会推行其他剧本或 Redis 敕令。这类语义与 MULTI / EXEC 类似。从一切其他客户端的角度来看,剧本的影响要么仍弗私见,要么曾经完成。

华夏棋牌可是这也意味着推行迟缓的剧本不是一个好主意。培植快速剧本着实不难,由于剧本开支异常低,但假定您要应用慢速剧本,您应当知道剧本运转时没有其他客户端可以推行敕令。

弱点处置赏罚赏罚

如前所述,redis.call()招致 Redis 敕令弱点的挪用将阻拦剧本的推行并前往一个弱点,这样就很显着弱点是由剧本天生的:

> del foo
(integer) 1
> lpush foo a
(integer) 1
> eval "return redis.call('get','foo')" 0
(error) ERR Error running script (call to f_6b1bf486c81ceb7edf3c093f4c48582e38c0e791): ERR Operation against a key holding the wrong kind of value

应用redis.pcall()不会激起弱点,但弱点工具是在上述划定的名堂前往(作为一个Lua表与err字段)。该剧本可以经由历程前往由前往的弱点工具将确切的弱点转达给用户redis.pcall()

带宽和EVALSHA

华夏棋牌EVAL敕令强迫您一次又一次发送剧本注释。Redis不须要每次重新编译剧本,由于它应用外部缓存机制,但是在许多情形下,支付特殊带宽的资源能够不是最好的。

此外一方面,应用特殊敕令或经由历程界说敕令redis.conf会是一个效果,启事以下:

  • 不合的实例能够有不合的敕令完成。

  • 假定我们必须确保一着实例都网罗给天敕令,特殊是在漫衍式情形中,则部署异常艰辛。

  • 华夏棋牌浏览应用法式模范模范代码,完全的语义能够不清晰,由于应用法式模范模范挪用敕令界说的服务器端。

为防止这些效果,同时防止带宽损掉落,Redis实验了EVALSHA敕令。

华夏棋牌EVALSHA的使命要领与EVAL完全类似,但不是将剧本作为第一个参数,而是应用剧本的SHA1摘要。行动以下:

  • 华夏棋牌If the server still remembers a script with a matching SHA1 digest, the script is executed.

  • 华夏棋牌假定服务器不记得具有此SHA1摘要的剧本,则会前往一个特殊弱点,告诉客户端应用EVAL。

例:

> set foo bar
OK> eval "return redis.call('get','foo')" 0"bar"> evalsha 6b1bf486c81ceb7edf3c093f4c48582e38c0e791 0"bar"> evalsha ffffffffffffffffffffffffffffffffffffffff 0(error) `NOSCRIPT` No matching script. Please use [EVAL](/commands/eval).

纵然客户端现实挪用EVAL,客户端库完成一直可以乐不雅不雅地发送EVALSHA,欲望剧本已被服务器看到。假定NOSCRIPT弱点前往,则将应用EVAL。

华夏棋牌将键和参数作为附加EVAL参数转达在此曲折文中也异常有用,由于剧本字符串保持稳固而且可以由Redis高效缓存。

剧本缓存语义

推行的剧本保证永世在Redis实例的给定推行的剧本缓存中。这意味着假定对Redis实例推行EVAL,一切后续的EVALSHA挪用都将告成。

剧本可以长时间缓存的启事是编写优胜的应用法式模范模范弗成能有足够的不合脚原来惹起内存效果。每个剧本在看法上都像是推行一个新的敕令,以致一个年夜型的应用法式模范模范能够只需几百个。纵然应用法式模范模范被一再再三修改而且剧本会改变,所应用的内存也能够或许忽视不计。

刷新剧本缓存的唯一措施是明确挪用SCRIPT FLUSH敕令,该敕令将完全刷新剧本缓存,删除到现在为止推行的一切剧本。

华夏棋牌这通常仅在实例将要为云情形中的此外一个客户或应用法式模范模范实例化时才须要。

华夏棋牌另外,如前所述,重新启动Redis实例会刷新剧本缓存,这不是耐久性的。但是从客户端的角度来看,只需两种措施可以确保Redis实例在两个不合的敕令之间没有重新启动。

  • 我们与服务器的毗连是耐久的,而且从未关闭。

  • 客户端显式检查runid华夏棋牌INFO敕令中的字段,以确保服务器未重新启动而且依然是类似的历程。

华夏棋牌现实上,关于客户端来讲,质朴地假定在给定毗连的曲折文中,保证缓存剧本在那里,除非治理员显式挪用SCRIPT FLUSH敕令。

华夏棋牌用户可以希冀Redis不删除剧本的现着实流水线曲折文中在语义上很有用。

例如,与Redis耐久毗连的应用法式模范模范可以确保,假定剧本一旦仍在内存中就被发送,那么EVALSHA可以用于管道中的这些剧本,而不会由于未知剧本而发生弱点(我们稍后会详细看到这个效果)。

华夏棋牌一种有数的形式是挪用SCRIPT LOAD加载将涌现在管道中的一切剧本,然后直接在管道外部应用EVALSHA,而不须要检查由于未识别剧本哈希而招致的弱点。

SCRIPT敕令

Redis供应了一个可用于控制脚簿子系统的SCRIPT敕令。SCRIPT现在吸收三种不合的敕令:

  • 华夏棋牌SCRIPT FLUSH此敕令是强迫Redis刷新剧本缓存的唯一措施。在统一个实例可以重新分配给不适用户的云情形中,它异常有用。测试客户端库的剧本功效完成也很有用。

  • SCRIPT EXISTS sha1 sha2 ... shaN

给定一个SHA1摘要列表作为参数,这个敕令前往一个1或0的数组,其中1体现特定的SHA1被辨以为已存在于剧本缓存中的剧本,而0体现具有该SHA1的剧本之前从未见过或许在最新的SCRIPT FLUSH敕令以后至少从未见过)。

  • SCRIPT LOAD script华夏棋牌 该敕令将指定的剧本注册到Redis剧本缓存中。该敕令在我们欲望确保EVALSHA不会掉落败的一切曲折文中很有用(例如在管道或MULTI / EXEC操作时代),而无需现实推行剧本。

  • 剧本杀手

此敕令是中止长时间运转的剧本的唯一措施,该剧本可到达装备的剧本最年夜推行时间。SCRIPT KILL敕令只能用于在推行时代不修改数据集的剧本(由于阻拦只读剧本不会背背剧本引擎的保证原子性)。有关长时间运转的剧本的更多信息,请参阅下一节。

剧本作为纯粹的功效

剧本的一个异常主要的部门是编写纯函数的剧本。默许情形下,在Redis实例中推行的剧本经由历程发送剧本自己而不是效果敕令在正本上复制到AOF文件中。

启事是将剧本发送到此外一个 Redis 实例通常比发送剧本天生的多个敕令快许多,是以假定客户端将年夜量剧本发送给主装备,则将剧本转换为 slave / AOF 的单个敕令会招致复制链接或仅追加文件的带宽太多(而且由于调剂经由历程群集吸收到的敕令,是以与分配由 Lua 剧本挪用的敕令相比,Redis 须要更多的使命)。

通常情形下复制剧本而不是剧本的效果是公正的,但不是所无情形都是云云。是以,从 Redis 3.2 泉源,剧本引擎能够复制剧本推行发生的写入敕令序列,而不是复制剧本自己。有关更多信息,请参阅下一节。在本节中,我们假定经由历程发送一切脚原来复制剧本。我们称这类复制形式为一切剧本复制

一切剧本复制措施的主要弱点是剧本须要具有以下属性:

  • 剧本必须一直应用给定类似输入数据集的类似参数来评价类似的 Redis 写入华夏棋牌敕令。剧本推行的操作不克不及依附任何隐藏的(非显式的)信息或状态,这些信息或状态能够随着剧本推行的阻拦或剧本的不合推行而改变,也不依附于来自 I / O 装备的任何外部输入。像应用系统时间,挪用 Redis 随机敕令(如 RANDOMKEY )或应用 Lua 随机数天生器,能够会招致剧本不会总是以类似的要领评价。为了在剧本中强迫推行此操作,Redis 将推行以下操作:

  • 华夏棋牌Lua 不会导出敕令来会见系统时间或其他外部状态。

  • 假定剧本挪用 Redis 敕令,Redis 敕令可以 Redis 随机敕令(如 RANDOMKEY ,SRANDMEMBER ,TIME )更改数据集则 Redis 将阻挡该剧本。这意味着假定剧本是只读的而且不修改数据集,则可以自在挪用这些敕令。请重视,随机敕令不用定意味着应用随机数的敕令:任何非一定性敕令都被视为随机敕令(这方面的最好示例是 TIME 敕令)。

  • 能够以随机序次前往元素的 Redis 敕令(如 SMEMBERS(由于 Redis 荟萃是无序的))在从 Lua 挪用时具有不合的行动,并在将数据前往到 Lua 剧本之前履历无声的词典排序过滤器。是以,redis.call("smembers",KEYS[1])华夏棋牌将一直以类似的序次前往 Set 元素,而从浅易客户端挪用的类似敕令能够会前往不合的效果,纵然该要害字网罗完全类似的元素。

  • Lua 伪随机数天生函数math.randommath.randomseed阻拦修改,以便每次推行新剧本时一直具有类似的种子。这意味着math.random假定math.randomseed不应用剧本,每次推行剧本时,挪用将始毕天生类似的数字序列。

但是,用户依然可以应用以下质朴的手艺编写具有随机行动的敕令。想象一下,我想写一个 Redis 剧本,它将用 N 个随机整数填充一个列表。

华夏棋牌我可以从这个小小的 Ruby 法式模范模范泉源:

require 'rubygems'require 'redis'r = Redis.newRandomPushScript = <<EOF
    local i = tonumber(ARGV[1])
    local res    while (i > 0) do
        res = redis.call('lpush',KEYS[1],math.random())
        i = i-1
    end    return res
EOF

r.del(:mylist)puts r.eval(RandomPushScript,[:mylist],[10,rand(2**32)])

每次推行该剧本时,效果列表都将具有以下元素:

> lrange mylist 0 -1 1) "0.74509509873814" 2) "0.87390407681181" 3) "0.36876626981831" 4) "0.6921941534114" 5) "0.7857992587545" 6) "0.57730350670279" 7) "0.87046522734243" 8) "0.09637165539729" 9) "0.74990198051087"10) "0.17082803611217"

华夏棋牌为了使它成为一个纯函数,但依然要确保每次挪用剧本都邑招致不合的随机元素,我们可以质朴地向剧本添加一个特殊的参数,这个参数将用于收获 Lua 伪随机数发电机。新剧本以下:

RandomPushScript = <<EOF
    local i = tonumber(ARGV[1])
    local res
    math.randomseed(tonumber(ARGV[2]))    while (i > 0) do
        res = redis.call('lpush',KEYS[1],math.random())
        i = i-1
    end    return res
EOF

r.del(:mylist)puts r.eval(RandomPushScript,1,:mylist,10,rand(2**32))

华夏棋牌我们在这里做的是发送 PRNG 的种子作为论据之一。这样,给定类似参数的剧本输入将是类似的,但是我们正在改变每个挪用中的一个参数,天生随机种子客户端。种子将作为复制链接和仅追加文件中的参数之一撒播,以保证在重新加载 AOF 或隶属历程处置赏罚赏罚剧本时将天生类似的更改。

重视:此行动的一个主要部门是 Redis 完成的 PRNG ,math.randommath.randomseed华夏棋牌保证具有类似的输入,而岂论运转 Redis 的系统的系统结构若何。32位,64位,年夜端和小端系统都邑发生类似的输入。

复制敕令而不是剧本

从 Redis 3.2 泉源,可以选择此外一种复制措施。我们可以复制剧本天生的单个写入敕令,而不是复制一切剧本。我们称之为剧本特效复制

在这类复制形式下,当推行 Lua 剧本时,Redis 将群集由 Lua 剧本引擎推行的一着实际修改数据集的敕令。剧本推行完成后,剧本天生的敕令序列将被包装到 MULTI / EXEC 事务中,并发送到隶属和 AOF 。

华夏棋牌凭证用例,这在几个方面很有用:

  • 当剧本盘算速率慢时,但是这些效果可以经由历程几条写入敕令阻拦汇总,但重新盘算隶属剧本或重新加载 AOF 时的剧本是很惋惜的。在这类情形下,复制剧本的效果要好许多。

  • 当启用剧本效果复制时,关于非一定性功效的控件被禁用。例如,您可以在随便任性职位随便应用剧本中的 TIME 或 SRANDMEMBER 敕令。

  • 在这类形式下的 Lua PRNG 在每次通话时随机收获。

为了启用剧本特效复制,您须要在剧本阻拦任何写操作之前收回以下 Lua 敕令:

redis.replicate_commands()

假定启用剧本效果复制,则该函数前往 true ;否则,假定在剧本曾经挪用某个写入敕令后挪用该函数,则前往 false ,并应用正常的一切剧本复制。

敕令的选择性复制

选择剧本特技复制后(请参阅上一节),可以更多地控制敕令复制到隶属和 AOF 的要领。这是一个异常先进的功效,由于滥用可以经由历程背背主控,隶属和 AOF 都必须网罗类似逻辑内容的条约来组成破损

可是,这是一个有用的功效,由于有时间我们只须要在主服务器上推行某些敕令来培植中央值。

在我们推行两套交集的 Lua 剧本中推敲一下。拔取五个随机元素,并用这五个随机元素培植一个新荟萃。最后,我们删除体现两个原始集之间交集的暂时密钥。我们想要复制的只是培植具有五个元素的新荟萃。复制培植暂时密钥的敕令也没有用。

是以,Redis 3.2 引入了一个新敕令,该敕令仅在剧本特效复制启用时才有用,而且能够控制剧本复制引擎。redis.set_repl()假定禁用剧本特技复制,则挪用该敕令并在挪用时掉落败。

华夏棋牌该敕令可以用四个不合的参数挪用:

redis.set_repl(redis.REPL_ALL) -- Replicate to AOF and slaves.redis.set_repl(redis.REPL_AOF) -- Replicate only to AOF.redis.set_repl(redis.REPL_SLAVE) -- Replicate only to slaves.redis.set_repl(redis.REPL_NONE) -- Don't replicate at all.

默许情形下,剧本引擎一直设置为REPL_ALL华夏棋牌。经由历程挪用此函数,用户可以掀开/关闭AOF和/或隶属复制,并稍后凭证自己的自愿将其恢复。

华夏棋牌一个质朴的例子以下:

redis.replicate_commands() -- Enable effects replication.redis.call('set','A','1')redis.set_repl(redis.REPL_NONE)redis.call('set','B','2')redis.set_repl(redis.REPL_ALL)redis.call('set','C','3')

华夏棋牌在运转下面的剧本以后,效果是只需A和C键将在隶属和AOF上培植。

全局变量掩护

Redis剧本禁绝可培植全局变量,以防止数据走漏到Lua状态。假定剧本须要在挪用之间保持状态(异常罕有),应当应用Redis键。

当考试考试全局变量会见时,剧本终止,EVAL前往弱点:

redis 127.0.0.1:6379> eval 'a=10' 0(error) ERR Error running script (call to f_933044db579a2f8fd45d8065f04a8d0249383e57): user_script:1: Script attempted to create global variable 'a'

会见一个不存在的华夏棋牌全局变量会发生类似的弱点。

应用Lua调试功效或其他措施(例如修改用于完玉成局掩护的元表来防止全局掩护着实不难)。可是,意外埠做到这一点很艰辛。假定用户应用Lua全局状态混淆,AOF和复制的不合性不克不及保证:不要这样做。

重视Lua内行:为了防止在剧本中应用全局变量,只需应用local要害字声明要应用的每个变量。

在剧本中应用SELECT

可以像应用浅易客户端一样在Lua剧本中挪用SELECT。然则,行动的一个纤细方面在Redis 2.8.11和Redis 2.8.12之间发生了变换。在2.8.12刊行版之前,由Lua剧本选择的数据库作为以后数据库传输到挪用剧本。从Redis 2.8.12泉源,由Lua剧本选择的数据库仅影响剧本自己的推行,但不会修改挪用剧本的客户端选择的数据库。

华夏棋牌修补法式模范模范级别版本之间的语义变换是必须的,由于旧的行动自己与Redis复制层不兼容,而且是弱点的启事。

可用的库

Redis Lua说冥器加载以下Lua库:

  • base lib.

  • table lib.

  • string lib.

  • math lib.

  • struct lib.

  • cjson lib.

  • cmsgpack lib.

  • bitop lib.

  • redis.sha1hex function.

  • redis.breakpoint and redis.debug在Redis Lua调试器的曲折文中起作用。

每个Redis实例都保证具有上述一切库,是以您可以确保Redis剧本的情形坚韧不拔。

华夏棋牌struct,CJSON和cmsgpack是外部库,一切其他库都是尺度的Lua库。

struct

华夏棋牌struct是一个用于在Lua中打包/解包结构的库。

Valid formats:> - big endian< - little endian![num] - alignment
x - pading
b/B - signed/unsigned byte
h/H - signed/unsigned short
l/L - signed/unsigned long
T   - size_t
i/In - signed/unsigned integer with size `n' (default is size of int)
cn - sequence of `n' chars (from/to a string); when packing, n==0 means
     the whole string; when unpacking, n==0 means use the previous
     read number as the string length
s - zero-terminated string
f - float
d - double' ' - ignored

例:

127.0.0.1:6379> eval 'return struct.pack("HH", 1, 2)' 
0"\x01\x00\x02\x00"
127.0.0.1:6379> eval 'return {struct.unpack("HH", ARGV[1])}' 0 "\x01\x00\x02\x00"
1) (integer) 1
2) (integer) 2
3) (integer) 5
127.0.0.1:6379> eval 'return struct.size("HH")' 0
(integer) 4

CJSON

CJSON库在Lua中供应极快的JSON操作。

例:

redis 127.0.0.1:6379> eval 'return cjson.encode({["foo"]= "bar"})' 0
"{\"foo\":\"bar\"}"
redis 127.0.0.1:6379> eval 'return cjson.decode(ARGV[1])["foo"]' 0 "{\"foo\":\"bar\"}"
"bar"

cmsgpack

华夏棋牌cmsgpack库在Lua中供应了质朴快速的MessagePack操作。

例:

127.0.0.1:6379> eval 'return cmsgpack.pack({"foo", "bar", "baz"})' 0
"\x93\xa3foo\xa3bar\xa3baz"
127.0.0.1:6379> eval 'return cmsgpack.unpack(ARGV[1])' 0 "\x93\xa3foo\xa3bar\xa3baz"
1) "foo"
2) "bar"
3) "baz"

bitop

Lua位操作模块在数字上添加按位操作。自2.8.18版以来,它可用于Redis中的剧本。

例:

127.0.0.1:6379> eval 'return bit.tobit(1)' 0
(integer) 1
127.0.0.1:6379> eval 'return bit.bor(1,2,4,8,16,32,64,128)' 0
(integer) 255
127.0.0.1:6379> eval 'return bit.tohex(422342)' 0
"000671c6"

它支持其他几个功效:bit.tobitbit.tohexbit.bnotbit.bandbit.borbit.bxorbit.lshiftbit.rshiftbit.arshiftbit.rolbit.rorbit.bswap。一切可用的功效都纪录在Lua BitOp文档中

redis.sha1hex

推行输入字符串的SHA1。

例:

127.0.0.1:6379> eval 'return redis.sha1hex(ARGV[1])' 0 "foo""0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33"

从剧本收回Redis日志

可以应用redis.log华夏棋牌函数从Lua剧本写入Redis日志文件。

redis.log(loglevel,message)

loglevel 是其中之一:

  • redis.LOG_DEBUG

  • redis.LOG_VERBOSE

  • redis.LOG_NOTICE

  • redis.LOG_WARNING

华夏棋牌它们直接对应于正常的Redis日志级别。只需应用即是或年夜于以后装备的Redis实例日志级别的日志级别经由历程剧本收回的日志才会被收回。

message华夏棋牌参数是一个质朴的字符串。例:

redis.log(redis.LOG_WARNING,"Something is wrong with this script.")

将天生以下内容:

[32343] 22 Mar 15:21:39 # Something is wrong with this script.

沙箱和最年夜推行时间

剧本不应考试考试会见外部系统,如文件系统或任何其他系统挪用。剧本只能在Redis数据上运转并转达参数。

华夏棋牌剧本也受最年夜推行时间(默许为5秒)的限制。这个默许的超不时间很长,由于剧本通常应当在毫秒以内运转。限制主要是为了处置赏罚赏罚在开发历程当中发生的意外无限循环。

可以经由历程redis.conf或应用CONFIG GET / CONFIG SET敕令修改以毫秒级精度推行剧本的最长时间。影响最年夜推行时间的装备参数被挪用lua-time-limit

当剧本到达超不时,它不会由Redis自动终止,由于这背背了Redis与剧本引擎之间的合约,以确保剧本是原子性的。中止剧本意味着能够会使数据集生涯半写数据。由于这个启事,当剧本推行逾越指准时间时,会发生以下情形:

  • Redis纪录剧本运转时间太长。

  • 它泉源从其他客户端再次吸收敕令,但会向发送正常敕令的一切客户端回复BUSY弱点。在这类状态下唯一被允许的敕令是SCRIPT KILL和SHUTDOWN NOSAVE

  • 可以应用SCRIPT KILL敕令终止一个只推行只读敕令的剧本。这不会背背剧本语义,由于剧本还未将数据写入数据集。

  • 假定剧本曾经挪用了写入敕令,则唯一允许的敕令酿成SHUTDOWN NOSAVE阻拦服务器而不生涯磁盘上的以后数据集(基本上服务器已中止)。

EVALSHA在流水线曲折文中

在流水线请求的曲折文中推行EVALSHA时应铛铛心,由于纵然在流水线中,敕令的推行序次也必须取得保证。假定EVALSHA将前往NOSCRIPT华夏棋牌弱点,则该敕令不克不及在以后重新宣布,否则背背了推行序次。

华夏棋牌客户端库完成应接纳以下措施之一:

  • 华夏棋牌在管道情形中一直应用质朴的EVAL。

  • 积累一切要发送到管道中的敕令,然后检查EVAL敕令并应用SCRIPT EXISTS敕令检查能否一切剧本都已界说。假定没有,请凭证须要在管道顶部添加SCRIPT LOAD敕令,并对一切EVAL召唤应用EVALSHA。

调试Lua剧本

从Redis 3.2泉源,Redis支持原生Lua调试。Redis Lua调试器是一个远程调试器,由一个服务器(Redis自己)和一个默许的客户端组成redis-cli

Lua调试器在Redis文档的Lua剧本调试部门中阻拦了形貌。

上一篇: 下一篇: