RedisLua脚本开发
来源:互联网 发布:生物医学数据库 编辑:程序博客网 时间:2024/06/05 06:02
- 脚本键传值操作
脚本中的所有的键均应该都应该由keys数组来传递 - 脚本的原子性
Redis 使用单个 Lua 解释器去运行所有脚本,并且, Redis 也保证脚本会以原子性(atomic)的方式执行:当某个脚本正在运行的时候,不会有其他脚本或 Redis 命令被执行。这和使用 MULTI / EXEC 包围的事务很类似。在其他别的客户端看来,脚本的效果(effect)要么是不可见的(not visible),要么就是已完成的(already completed)。
另一方面,这也意味着,执行一个运行缓慢的脚本并不是一个好主意。写一个跑得很快很顺溜的脚本并不难,因为脚本的运行开销(overhead)非常少,但是当你不得不使用一些跑得比较慢的脚本时,请小心,因为当这些蜗牛脚本在慢吞吞地运行的时候,其他客户端会因为服务器正忙而无法执行命令。
- 脚本缓存
EVAL 命令要求你在每次执行脚本的时候都发送一次脚本主体(script body)。Redis 有一个内部的缓存机制,因此它不会每次都重新编译脚本,不过在很多场合,付出无谓的带宽来传送脚本主体并不是最佳选择。
为了减少带宽的消耗, Redis 实现了 EVALSHA 命令,它的作用和 EVAL 一样,都用于对脚本求值,但它接受的第一个参数不是脚本,而是脚本的 SHA1 校验和(sum)。
EVALSHA 命令的表现如下:
如果服务器还记得给定的 SHA1 校验和所指定的脚本,那么执行这个脚本
如果服务器不记得给定的 SHA1 校验和所指定的脚本,那么它返回一个特殊的错误,提醒用户使用 EVAL 代替 EVALSHA
以下是示例:
set foo bar
OKeval “return redis.call(‘get’,’foo’)” 0
“bar”evalsha 6b1bf486c81ceb7edf3c093f4c48582e38c0e791 0
“bar”evalsha ffffffffffffffffffffffffffffffffffffffff 0
(error)NOSCRIPT
No matching script. Please use EVAL.
客户端库的底层实现可以一直乐观地使用 EVALSHA 来代替 EVAL ,并期望着要使用的脚本已经保存在服务器上了,只有当 NOSCRIPT 错误发生时,才使用 EVAL 命令重新发送脚本,这样就可以最大限度地节省带宽。
这也说明了执行 EVAL 命令时,使用正确的格式来传递键名参数和附加参数的重要性:因为如果将参数硬写在脚本中,那么每次当参数改变的时候,都要重新发送脚本,即使脚本的主体并没有改变,相反,通过使用正确的格式来传递键名参数和附加参数,就可以在脚本主体不变的情况下,直接使用 EVALSHA 命令对脚本进行复用,免去了无谓的带宽消耗
- RedisLua脚本开发
- 脚本开发
- shell脚本开发
- LoadRunner脚本开发流程
- oracle 开发常用脚本
- LR脚本开发
- loadrunner脚本开发
- webservice脚本开发实战
- Linux Shell脚本开发
- 脚本开发Android程序
- 游戏脚本开发
- 开发Java Vuser脚本
- 最牛脚本开发
- Lua 脚本开发学习
- loadruuner 脚本开发
- shell脚本开发规范
- wireshark lua脚本开发
- badboy脚本开发事件
- 设计模式的简单描述
- 大一上学期寒假 1993最值
- PSO
- Spring处理跨域请求(含有SpringBoot方式)
- Java 中 String 类的常用方法 I
- RedisLua脚本开发
- 【Unity&UnityWebPlayer】UnityWebPlayer在哪里下载
- Socket http和https的使用区别
- iOS 截取当前视图
- Too many arguments error in bash
- 数字(int型范围内正整数)和中文的相互转换
- 最大子数组问题的三种方法:分治法、暴力法和非递归方法
- 485. Max Consecutive Ones leetcode array
- 项目管理学习总结(1)——产品文档的规划化管理总结