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博客 ” ,链接:http://blog.itpub.net/29096438/viewspace-1793640/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29096438/viewspace-1793640/
本文深入解析Redis脚本命令的使用,包括脚本加载、校验、执行及错误处理,通过具体示例展示了EVAL和SCRIPT命令的功能,并探讨了它们在实际应用中的区别与优势。
2万+

被折叠的 条评论
为什么被折叠?



