zoukankan      html  css  js  c++  java
  • Redis 的 Lua 脚本支持

    Redis 2.6.0 内置的Lua Script支持,可以在Redis的Server端一次运行大量逻辑。

    • 整个Script默认是在一个事务里的。
    • Script里涉及的所有Key尽量用变量,从外面传入,使Redis一开始就知道你要改变哪些key。
    • EVAL每次传输一整段Script比较费带宽,可以先用SCRIPT LOAD载入script,返回哈希值。然后用EVALHASH执行。
    • 内置的LUA库里还很贴心的带了CJSON,可以处理JSON字符串。

    参考:http://www.searchdatabase.com.cn/showcontent_70423.htm

    redis中执行lua的命令用eval、evalsha、 script load

    http://redis.readthedocs.org/en/latest/script/index.html

    Redis 的 EVAL 命令 参数说明如下:


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

    script 参数是一段 Lua 5.1 脚本程序,它会被运行在 Redis 服务器上下文中,这段脚本不必(也不应该)定义为一个 Lua 函数。

    numkeys 参数用于指定键名参数的个数。

    键名参数 key [key ...] 从 EVAL 的第三个参数开始算起,表示在脚本中所用到的那些 Redis 键(key),这些键名参数可以在 Lua 中通过全局变量 KEYS 数组,用 1 为基址的形式访问( KEYS[1] , KEYS[2] ,以此类推)。

    在命令的最后,那些不是键名参数的附加参数 arg [arg ...] ,可以在 Lua 中通过全局变量 ARGV 数组访问,访问的形式和 KEYS 变量类似( ARGV[1] 、 ARGV[2] ,诸如此类)。

    上面这几段长长的说明可以用一个简单的例子来概括:

    > eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
    1) "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] 访问它们。

    参考:http://redis.readthedocs.org/en/latest/script/eval.html

    SCRIPT LOAD script

    将脚本 script 添加到脚本缓存中,但并不立即执行这个脚本。

    EVAL 命令也会将脚本添加到脚本缓存中,但是它会立即对输入的脚本进行求值。

    如果给定的脚本已经在缓存里面了,那么不做动作。

    在脚本被加入到缓存之后,通过 EVALSHA 命令,可以使用脚本的 SHA1 校验和来调用这个脚本。

    脚本可以在缓存中保留无限长的时间,直到执行 SCRIPT FLUSH 为止。

    redis> SCRIPT LOAD "return 'hello moto'"
    "232fd51614574cf0867b83d384a5e898cfd24e5a"
    
    redis> EVALSHA 232fd51614574cf0867b83d384a5e898cfd24e5a 0
    "hello moto"

     

    EVALSHA sha1 numkeys key [key ...] arg [arg ...]

    根据给定的 sha1 校验码,对缓存在服务器中的脚本进行求值。

    将脚本缓存到服务器的操作可以通过 SCRIPT LOAD 命令进行。

    这个命令的其他地方,比如参数的传入方式,都和 EVAL 命令一样。

  • 相关阅读:
    771. Jewels and Stones
    706. Design HashMap
    811. Subdomain Visit Count
    733. Flood Fill
    117. Populating Next Right Pointers in Each Node II
    250. Count Univalue Subtrees
    94. Binary Tree Inorder Traversal
    116. Populating Next Right Pointers in Each Node
    285. Inorder Successor in BST
    292. Nim Game Java Solutin
  • 原文地址:https://www.cnblogs.com/ghj1976/p/4298206.html
Copyright © 2011-2022 走看看