ITPub博客

首页 > 数据库 > NoSQL > redis命令之-script脚本学习

redis命令之-script脚本学习

原创 NoSQL 作者:小亮520cl 时间:2015-09-07 18:46:33 0 删除 编辑
127.0.0.1:6379> script load "return 'hello world'"      -----将脚本 script 添加到脚本缓存中,但并不立即执行这个脚本
"5332031c6b470dc5a0dd9b4bf2030dea6d65de91"    ----SHA1 校验和

127.0.0.1:6379> script exists "5332031c6b470dc5a0dd9b4bf2030dea6d65de91"   ---检查有没有被缓存
1) (integer) 1

127.0.0.1:6379> evalsha 5332031c6b470dc5a0dd9b4bf2030dea6d65de91 0     ----EVALSHA 命令,可以使用脚本的 SHA1 校验和来调用这个脚本
"hello world"

127.0.0.1:6379> script flush     ---清空缓存
OK
127.0.0.1:6379> script exists "5332031c6b470dc5a0dd9b4bf2030dea6d65de91"
1) (integer) 0


EVAL script numkeys key [key ...] arg [arg ...]   ---EVAL 命令也会将脚本添加到脚本缓存中,但是它会立即对输入的脚本进行求值。

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

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] ,诸如此类)。



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"
其中 "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 是被求值的 Lua 脚本,数字 2 指定了键名参数的数量, key1 和 key2 是键名参数,分别使用 KEYS[1] 和 KEYS[2] 访问,而最后的 first 和 second 则是附加参数,可以通过 ARGV[1] 和 ARGV[2] 访问它们。

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

  • redis.call()
  • redis.pcall()    -----用来调用redis命令

这两个函数的唯一区别在于它们使用不同的方式处理执行命令所产生的错误,在后面的『错误处理』部分会讲到这一点。

redis.call() 和 redis.pcall() 两个函数的参数可以是任何格式良好(well formed)的 Redis 命令:

> eval "return redis.call('set','foo','bar')" 0
OK
> eval "return redis.call('set',KEYS[1],'bar')" 1 foo              ---与上面的等价,只不过是参数模式
OK
127.0.0.1:6379> eval "return redis.call('get','foo')" 0
"barbarbarbar"
127.0.0.1:6379> eval "return redis.call('get',KEYS[1])" 1 foo    ---等价,参数模式
"barbarbarbar"

127.0.0.1:6379> eval "return redis.call('append','foo','ONLYU')" 0    ---调用redis的append命令,,,其他什么的命令都可以
(integer) 17
127.0.0.1:6379> eval "return redis.call('get','foo')" 0
"barbarbarbarONLYU"

如:127.0.0.1:6379> eval "return redis.call('expire','foo','200')" 0   ----如:expire,其它命令跟着套
(integer) 1
127.0.0.1:6379> eval "return redis.call('persist','foo')" 0
(integer) 1


还可以通过scipt load来加载
127.0.0.1:6379> script load "return redis.call('get','foo')" --将脚本 script 添加到脚本缓存中,但并不立即执行这个脚本
"6b1bf486c81ceb7edf3c093f4c48582e38c0e791"    ----SHA1 校验

127.0.0.1:6379> evalsha 6b1bf486c81ceb7edf3c093f4c48582e38c0e791 0   ---EVALSHA 命令,可以使用脚本的 SHA1 校验和来调用这个脚本
"barbarbarbarONLYU"

===================eval与script load的区别:eval是立刻执行脚本进行求值,而load需要再调用evalsha来求值===============

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29096438/viewspace-1793640/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: redis持久化
请登录后发表评论 登录
全部评论
毕业以后专业任职数据库工程师职位,itpub一直作为自己的笔记记录的地方,blog写的不详细,草书笔记,仅供参考!

注册时间:2013-09-12

  • 博文量
    529
  • 访问量
    1126931