zoukankan      html  css  js  c++  java
  • redis eval

    参考文档:
    http://redisdoc.com/script/script_kill.html

    一、EVAL命令
    1、
    从 Redis 2.6.0 版本开始,通过内置的 Lua 解释器,可以使用 EVAL 命令对 Lua 脚本进行求值。
    示例:

    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"

    eval:执行lua脚本的命令
    "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}":lua脚本内容,KEYS[x]是键盘参数,ARGV[x]是附加参数
    2:指定KEYS键的数量
    key1 key2:参数值
    first second:附加参数值

    注意:指定KEY键数量之后的都是附加参数值,ARGV[1]指第一个附加参数值,ARGV[2]指第二个附加参数值。

    例:

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

    指定KEYS占位符3个,则key1 key2 first分别对应着KEYS[1] KEYS[2] KEYS[3]
    secondary 是第一个附加参数值
    所以只能打印出key1 key2 second


    2、
    在 Lua 脚本中,可以使用两个不同函数来执行 Redis 命令,它们分别是:
    redis.call()
    redis.pcall()
    示例:

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

    唯一的区别是
    当 redis.call() 在执行命令的过程中发生错误时,脚本会停止执行,并返回一个脚本错误,错误的输出信息会说明错误造成的原因。
    redis.pcall() 出错时并不引发(raise)错误,而是返回一个带 err 域的 Lua 表(table),用于表示错误。

    3、
    在redis-cli命令中行直接执行lua脚本

    root@ip-172-31-30-45:~# cat test.lua
    local name=KEYS[1]
    return "hello "..name.."!"
    root@ip-172-31-30-45:~# redis-cli --eval test.lua nihao
    "hello nihao!"

    4、更多示例:

    127.0.0.1:6379> eval 'local name=KEYS[1] return "hello "..name.."!"' 1 nihao
    "hello nihao!"

    二、EVALSHA命令:
    根据给定的 sha1 校验码,对缓存在服务器中的脚本进行求值,将脚本缓存到服务器的操作可以通过 SCRIPT LOAD script 命令进行。
    sha1 校验码在使用【SCRIPT LOAD script】命令加载脚本时会得到。
    示例:

    127.0.0.1:6379> SCRIPT LOAD "return 'hello moto'"
    "232fd51614574cf0867b83d384a5e898cfd24e5a"
    127.0.0.1:6379> EVALSHA "232fd51614574cf0867b83d384a5e898cfd24e5a" 0
    "hello moto"

    三、SCRIPT LOAD
    1、直接在redis命令行中加载脚本
    示例:

    127.0.0.1:6379> script load "return {KEYS[1]}"
    "8e5266f6a4373624739bd44187744618bc810de3"
    127.0.0.1:6379> evalsha 8e5266f6a4373624739bd44187744618bc810de3 1 abc
    1) "abc"


    四、SCRIPT EXISTS
    根据sha1值,检测lua脚本是否被缓存到了内存中,
    如果在内存中则返回1,如果不在则返回0

    127.0.0.1:6379> SCRIPT LOAD "return 'hello moto'"
    "232fd51614574cf0867b83d384a5e898cfd24e5a"
    127.0.0.1:6379> SCRIPT EXISTS 232fd51614574cf0867b83d384a5e898cfd24e5a
    1) (integer) 1
    127.0.0.1:6379> SCRIPT FLUSH
    OK
    127.0.0.1:6379> SCRIPT EXISTS 232fd51614574cf0867b83d384a5e898cfd24e5a
    1) (integer) 0

    五、SCRIPT FLUSH
    清空所有lua脚本缓存

    127.0.0.1:6379> SCRIPT FLUSH
    OK

    六、SCRIPT KILL
    杀死当前正在运行的 Lua 脚本,当且仅当这个脚本没有执行过任何写操作时,这个命令才生效。

    session1:
    EVAL "while true do end" 0
    
    session2:
    redis> SCRIPT KILL
    OK
    redis> SCRIPT KILL
    (error) ERR Sorry the script already executed write commands against the dataset. You can either wait the script termination or kill the server in an hard way using the SHUTDOWN NOSAVE command.
  • 相关阅读:
    Qt Creator pro 文件 导入vs2013碰到的问题
    扫描助手技术支持
    测试下载
    pod安装(可安装任意版本)和卸载 (转载做记录自留备用)
    阿拉德下载
    Mac 上传项目到码云
    iOS中Realm数据库的基本用法
    集成微信支付流程整理
    tableViewCell左划显示多个按钮(系统原生)
    快速排序法从小到大排序
  • 原文地址:https://www.cnblogs.com/nanxiang/p/15331833.html
Copyright © 2011-2022 走看看