Redis结合LUA的使用

前文:

redis事务的实现原理是把事务中的命令先放入队列中,当client提交了exec命令后,redis会把队列中的每一条命令按序执行一遍。如果在执行exec之前事务中断了,那么所有的命令都不会执行;如果执行了exec命令之后,那么所有的命令都会按序执行。但如果在事务执行期间redis被强制关闭,那么则需要使用redis-check-aof 工具对redis进行修复,删除那些部分执行的命令。Redis确保正一条script脚本执行期间,其它任何脚本或者命令都无法执行。正是由于这种原子性,script才可以替代MULTI/EXEC作为事务使用

一:Redis 中使用 LUA 的好处

1:减少网络开销,在 Lua 脚本中可以把多个命令放在同一个脚本中运行。

2:原子操作,Redis 会将整个脚本作为一个整体执行,中间不会被其他命令插入。换句话说,编写脚本的过程中无需担心会出现竞态条件。

3:复用性,客户端发送的脚本会永远存储在 Redis 中,这意味着其他客户端可以复用这一脚本来完成同样的逻辑。

二:Redis + LUA 整合使用

EVAL 命令为输入脚本定义一个 Lua 函数,然后通过执行这个函数来执行脚本。

EVALSHA 通过构建函数名,直接调用 Lua 中已定义的函数,从而执行相应的脚本。

EVAL 命令:EVAL script numkeys key [key ...] arg [arg ...]

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

(2)numkeys 参数:用于指定键名参数的个数。

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

(4)arg [arg ...]参数:可以在 Lua 中通过全局变量 ARGV 数组访问,访问的形式和 KEYS 变量类似(ARGV[1],ARGV[2]···)。

EVALSHA 命令

1)EVAL 命令要求你在每次执行脚本的时候都发送一次脚本主体(script body)。

2)Redis 有一个内部的缓存机制,因此它不会每次都重新编译脚本,不过在很多场合,付出无谓的带宽来传送脚本主体并不是最佳选择。

3)为了减少带宽的消耗, Redis 实现了EVALSHA 命令,它的作用和 EVAL 一样,都用于对脚本求值,但它接受的第一个参数不是脚本,而是脚本的 SHA1 摘要。

4)EVALSHA 命令的表现如下

(1)如果服务器还记得给定的 SHA1 校验和所指定的脚本,那么执行这个脚本

(2)如果服务器不记得给定的 SHA1 校验和所指定的脚本,那么它返回一个特殊的错误,提醒用户使用 EVAL 代替 EVALSHA

5)那么,我们怎么来获取脚本的 SHA1 摘要呢?下面我们来看一下 SCRIPT 命令:

(1)SCRIPT FLUSH :清除所有脚本缓存。

(2)SCRIPT EXISTS :根据给定的脚本校验,检查指定的脚本是否存在于脚本缓存。

(3)SCRIPT LOAD :将一个脚本装入脚本缓存,返回SHA1摘要,但并不立即运行它。

(4)SCRIPT KILL :杀死当前正在运行的脚本。

发布了50 篇原创文章 · 获赞 2 · 访问量 2287

猜你喜欢

转载自blog.csdn.net/eafun_888/article/details/104714595