1.事务与Lua
为了保证多条命令组合的原子性,redis提供了简单的事务功能以及集成Lua
脚本来解决这个问题。
2.事务
redis提供了简单的事务功能,将一组执行的命令放到multi 和exec 两个命令
之间。multi命令代表事务开始,exec命令代表事务结束。
multi
sadd user:a:follow user:b
sadd user:b:fans user:a
exec
192.168.1.7:6380> multi
OK
192.168.1.7:6380> sadd user:a:follow user:b
QUEUED
192.168.1.7:6380> sadd user:b:fans user:a
QUEUED
192.168.1.7:6380> exec
1
1
--只有执行完exec ,整个命令才会真正执行。
--redis事务回滚:discard
192.168.1.7:6380> smembers user:b:fans
user:a
192.168.1.7:6380> smembers user:a:follow
user:b
192.168.1.7:6380> multi
OK
192.168.1.7:6380> sadd user:a:follow user:a user:c user:b user:d user:e
QUEUED
192.168.1.7:6380> sadd user:b:fans user:a user:c user:b user:d user:e
QUEUED
192.168.1.7:6380> discard
OK
192.168.1.7:6380> smembers user:b:fans
user:a
192.168.1.7:6380> smembers user:a:follow
user:b
--由此可见discard确实回滚了事务。
--即丢弃了事务。
--由于redis无法真正回滚事务,需要使用watch命令来解决这个问题。
在执行multi ..exec命令之前先执行watch;
这样当同一时刻有别的会话正在更新当前会话中的key时,当前会话中的事务将
被回滚。无法更新成功。而另外的事务可以更新成功。
3.Lua用法简述
Lua语言是在1993年由巴西一个大学研究小组发明,其设计目标是作为嵌入式程序
移植到其他应用程序。
lua提供了几种数据类型:booleans(布尔),numbers(数值),
strings(字符串),tables(表格)。
(1)字符串
--定义局部变量,没有local就是全局变量。
local strings val="world"
print(val)
[root@oracle1 data]# which lua
/usr/bin/lua
[root@oracle1 data]# lua
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio
>
>
> local strings val="world"
> print(val)
world
--通过脚本执行lua;
[root@oracle1 data]# cat 1.lua
local strings val="world"
print(val)
[root@oracle1 data]# lua -i 1.lua
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio
world
(2)数组
local tables myArray = {"redis","jedis","true",88.0 }
print(myArray[3])
[root@oracle1 data]# cat 1.lua
local strings val="world"
print(val)
local tables myArray = {"redis","jedis","true",88.0 }
print(myArray[3])
[root@oracle1 data]# lua 1.lua
world
true
(3)for
local int sum=0
for i=1,100
do
sum=sum+i
end
print(sum)
[root@oracle1 data]# cat 1.lua
local strings val="world"
print(val)
local tables myArray = {"redis","jedis","true",88.0 }
print(myArray[3])
local int sum=0
for i=1,100
do
sum=sum+i
end
print(sum)
[root@oracle1 data]# lua 1.lua
world
true
5050
--遍历myArray ;
for i=1,#myArray
do
print(myArray[i])
end
[root@oracle1 data]# cat 1.lua
local strings val="world"
print(val)
local tables myArray = {"redis","jedis","true",88.0 }
print(myArray[3])
--计算1到100的和
local int sum=0
for i=1,100
do
sum=sum+i
end
print(sum)
--遍历myArray ;
for i=1,#myArray
do
print(myArray[i])
end
[root@oracle1 data]# lua 1.lua
world
true
5050
redis
jedis
true
88
--lua提供了ipairs内置函数,遍历出索引下标和值。
for index,value in ipairs(myArray)
do
print(index)
print(value)
end
[root@oracle1 data]# cat 1.lua
local strings val="world"
print(val)
local tables myArray = {"redis","jedis","true",88.0 }
print(myArray[3])
--计算1到100的和
local int sum=0
for i=1,100
do
sum=sum+i
end
print(sum)
--遍历myArray ;
for i=1,#myArray
do
print(myArray[i])
end
--lua提供了ipairs内置函数,遍历出索引下标和值。
for index,value in ipairs(myArray)
do
print(index)
print(value)
end
[root@oracle1 data]# lua 1.lua
world
true
5050
redis
jedis
true
88
1
redis
2
jedis
3
true
4
88
--while用法:求0到100的和
local int sum=0
local int i =0
while i<=100
do
sum=sum+i
i=i+1
end
print(sum)
[root@oracle1 data]# cat 1.lua
local strings val="world"
print(val)
local tables myArray = {"redis","jedis","true",88.0 }
print(myArray[3])
--计算1到100的和
local int sum=0
for i=1,100
do
sum=sum+i
end
print(sum)
--遍历myArray ;
for i=1,#myArray
do
print(myArray[i])
end
--lua提供了ipairs内置函数,遍历出索引下标和值。
for index,value in ipairs(myArray)
do
print(index)
print(value)
end
--while用法:求0到100的和
local int sum=0
local int i =0
while i<=100
do
sum=sum+i
i=i+1
end
print(sum)
[root@oracle1 data]# lua 1.lua
world
true
5050
redis
jedis
true
88
1
redis
2
jedis
3
true
4
88
5050
--lua脚本if else用法。
--要确定数组中是否包含了jedis,有则打印true,注意if以end结尾,if后紧跟then
local tables myArray ={"redis","jedis",true,88}
for i=1,#myArray
do
if myArray[i]=="jedis"
then
print("true")
break
else
end
end
[root@oracle1 data]# cat 1.lua
local strings val="world"
print(val)
local tables myArray = {"redis","jedis","true",88.0 }
print(myArray[3])
--计算1到100的和
local int sum=0
for i=1,100
do
sum=sum+i
end
print(sum)
--遍历myArray ;
for i=1,#myArray
do
print(myArray[i])
end
--lua提供了ipairs内置函数,遍历出索引下标和值。
for index,value in ipairs(myArray)
do
print(index)
print(value)
end
--while用法:求0到100的和
local int sum=0
local int i =0
while i<=100
do
sum=sum+i
i=i+1
end
print(sum)
--lua脚本if else用法。
--要确定数组中是否包含了jedis,有则打印true,注意if以end结尾,if后紧跟then
local tables myArray ={"redis","jedis",true,88}
for i=1,#myArray
do
if myArray[i]=="jedis"
then
print("true")
break
else
end
end
[root@oracle1 data]# lua 1.lua
world
true
5050
redis
jedis
true
88
1
redis
2
jedis
3
true
4
88
5050
true
[root@oracle1 data]#
--hash用法。必须有两个点:表示连接。
local tables user_1={age=28,name="tome"}
print("user_1 age is ".. user_1["age"])
print("user_1 name is ".. user_1["name"])
user_1 age is 28
user_1 name is tome