Redis
从2.6
版本开始支持Lua
脚本,通过在服务器端嵌入Lua
环境,客户端可以使用Lua
脚本在服务器端原子的执行多个命令。
Redis
服务器会单线程原子性执行Lua
脚本,保证Lua
脚本在处理的过程中不会被任意其它请求打断。
创建并修改Lua环境
为了在Redis
服务器中执行Lua
脚本,需要在Redis
服务器内嵌一个Lua
环境。因为Redis
在任何时间最多只有一个脚本被放进Lua
环境中执行,所以一个Redis
服务器只需要创建一个Lua
环境。
- 调用
lua_open
函数创建一个基本的Lua
环境;—— 接下来的步骤都是针对这个Lua
环境操作 - 载入多个函数库到
Lua
环境;—— Lua脚本基于这些函数库进行数据操作 - 在Lua
Lua
中创建一个redis
表格全局变量table
;—— 包含对Redis
进行操作的函数 - 使用
Redis
自制的随机函数替换Lua
原有的随机函数; - 创建排序函数;—— 对
Redis
命令的结果进行排序,消除不确定性
- 什么是不确定性?—— 集合是无序的,即使两个集合包含的元素完全相同,输出的结果也可能不同。
- 不确定性的命令:
sinter
、sunion
、sdif
f、smembers
、hkeys
、hvals
、keys
; - 如何消除不确定性:当
Lua
脚本执行完一个带有不确定的命令后,会调用table.sort
函数对命令的