redis lua

来源:互联网 发布:c语言标准库 编辑:程序博客网 时间:2024/06/06 17:50

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 0end

[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 !!!!!!!!!!!!!!!!!!!

0 0
原创粉丝点击