1.Redis使用Lua的方式
- SCRIPT LOAD: 将脚本载入Redis,这个命令接受一个字符串格式的Lua脚本为参数,它会把脚本存储起来等待之后使用,然后返回被存储脚本的SHA1的校验和
- EVALSHA :输入命令
SCRIPT LOAD
返回的SHA1校验和,以及脚本所需的全部参数就可以调用之前存储的脚本
附:在调用SCRIPT LOAD
和EVALSHA
时需要捕获异常:如果传入的某个脚本的校验和Redis服务器并没有存储,异常就会抛出。这个异常出现的场景如下:服务器重启、用户执行了SCRIPT FLUSH
命令清空脚本缓存、调用Redis服务器时使用了不同的Redis连接等情况下都会抛出这个异常。 - EVAL: 当检测到脚本并没有存储在Redis服务器而抛出异常时,可以执行
EVAL
命令,这个命令除了会执行脚本之外,还会将被执行的脚本缓存到Redis服务器中。
传入Redis服务器中的Lua脚本之外,还会传入键和参数:
-键 :keys记录是脚本可能会读取或者写入的所有键,在脚本中对于未记录在keys中的键进行写入时,如果是在单服务器场景下不会发生任何问题,但是如果是在集群环境下的话,会抛出异常,因此在集群环境下我们需要把所有脚本中可能涉及到的键都传入keys中,否则会引起脚本执行失败。
- 参数: Lua脚本内存的参数使用
附:Lua脚本中的列表下标是从1
开始,而不是大部分编程语言中的0
开始
2.Lua脚本中断
Lua脚本在Redis内部是以一个原子命令进行执行的,它与MULTI/EXEC
一样,都是原子操作。因此Lua脚本的执行不会受到其他结构命令的干扰。
已经对结构进行了修改的Lua脚本无法被中断,对于已经在执行中的lua脚本分两种情况进行终止:
- 对于不执行任何写入操作的Lua脚本,用户可以在脚本的运行时间超过了
lua-time-limit
(配置文件中配置)选项指定的时间之后,执行SCRIPT KILL
命令杀死正在运行的脚本。 - 如果Lua脚本已经对Redis存储的数据进行了写入,那么杀死脚本将会使Redis存储数据进入一种不一致的状态。这种情况下,用户唯一能够恢复的手段就是使用
SHUTDOWN NOSAVE
命令杀死Redis服务器,这将导致Redis服务其丢失最近一次快照之后的数据或者最近一次将命令写入AOF文件之后数据发生的所有变化。
因此Lua脚本一定要在进行了充分的测试之后再进行使用。