redis实现事务有两种方式:1、通过Redis自带的命令multi和exec来实现;2、通过lua脚本,因为redis服务器实现了对lua脚本的解析,本文主要对第二种方式进行学习总结。
先简单学习一下lua脚本语言
lua脚本支持字符串strings,数值numbers,布尔booleans和数组tables这几种数据类型,相比其他语言比较单一。
如定义一个整数变量 local number = 0,这里local表示该变量是局部变量,如果没有local则为全局变量。
如定义一个数组变量 local arrays = {"this", "is", "lua", "script", 12}
那如何遍历数组中的值呢?可以使用for或者while循环
for i = 0, #arrays
do
print(arrays[i])
end
或者
for index, value in ipairs(arrays)
do
print(arrays[index])
end
if语句的使用
if i == 0
then
print("true")
else
print("false")
end
lua也提供了一些内置函数,如将字符串转换成数值tonumber()等
Redis Lua使用
redis提供eval和evalsha两个工具来运行lua脚本,lua脚本执行过程中是原子行动,但是他不会在发生错误后回滚已经执行的命令。
redis提供script load "$(cat filename)"来将lua脚本加载到redis服务器中,然后使用evalsha命令调用
local arrays = {}
local length = tonumber(ARGV[1])
for i = 1, length
do
arrays[i] = redis.call("hget", KEYS[i], ARGV[2])
end
return arrays
上面是一个简单的脚本,查询hash类型key中某一field的数据。
EVALSHA d3f7e84c1423cba2a93836f21b020b1330388960 4 zhuocongbin zhangsan lisi wangmazi 4 pid
上面的意思是,查询zhuocongbin zhangsan lisi wangmaz这四个key中pid的值。