您的位置:首页 > 数据库 > Redis

redis lua

2014-03-10 17:37 239 查看

redis

支持复杂数据类型 : key-value, string, list, set, hash table, sorted set,

其他有用特性: TRANSACTION, SCRIPT

TRANSACTION

WATCH 监视key; 若在事务开始之前key发生改变, 则不进行事务。

UNWATCH 解除监视

MULTI 开始事务

redis command; 注意, 这里只能是一组redis command, 不能夹杂任何数据逻辑。。。 类似于SQL事务中的一组SQL命令

EXEC 执行事务 / DISCARD 放弃事务

那么,类似需求如何满足呢? transaction是满足不了这种需求【CAS, check and save】;且这种需求是业务逻辑中非常常见的。。。

if ( db.key > 10) { ++db.key; saveTOdb(db.key); }

SCRIPT(lua)

script也能保证原子性。 为了保证原子性(同时也保证主从一致), 内嵌的lua做了修改、去掉随机函数等。

[root@mobile_dev2 src]# cat test2.lua

if redis.call("EXISTS", KEYS[1]) == 1 then
local cur = redis.call("GET", KEYS[1])
if cur >= ARGV[1] then
return redis.call("INCR", KEYS[1])
end

return cur
else
return 0
end


[root@mobile_dev2 src]# ./redis-cli SET XX 5

OK

[root@mobile_dev2 src]# ./redis-cli GET XX

"5"

[root@mobile_dev2 src]# ./redis-cli EVAL "$(cat test.lua)" 1 "XX" 10 # 5>=10 failed,所以输出原值5.

"5"

[root@mobile_dev2 src]# ./redis-cli SET XX 10

OK

[root@mobile_dev2 src]# ./redis-cli GET XX

"10"

[root@mobile_dev2 src]# ./redis-cli EVAL "$(cat test.lua)" 1 "XX" 10

"11"

SCRIPT的键和参数

如上。 redis的lua函数,可以有两个表。 KEYS表 是redis中存的key; ARGV表是存放传入参数的。

命令lua 脚本KEYS表长度逐个的KEYS逐个的ARGV
./redis-cliEVAL"$(cat test2.lua)"1"XX"10

其他

多个客户端可以并发的发送数据请求, 但redis server在处理这些请求可以看做是单线程的。

redis保证SCRIPT的原子性,处理该脚本时不会有其他command或者SCRIPT在同时被处理;

因此可以保证业务逻辑的正确性。 避免各类数据库中常见的脏数据、旧数据等问题。

如上, 同时必须保证SCRIPT的简单高效; 否则会导致其后的处理请求统统延时。。。

./redis-cli SCRIPT LOAD "$(cat test.lua)" ###LOAD之后是lua脚本源码。。。
http://www.redisdoc.com/en/latest/ http://www.redisbook.com/en/latest/index.html !!!!!!!!!!!!!!!!!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: