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-cli | EVAL | "$(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 !!!!!!!!!!!!!!!!!!!
相关文章推荐
- redis学习及实践5---redis相关资料参考文献
- redis学习及实践4---redis集群及相关性能分析
- redis命令
- redis学习及实践3---Jedis、JedisPool、Jedis分布式实例介绍 推荐
- redis安装步骤
- Redis实现分布式锁
- redis基本数据类型操作之 list
- 【Redis】向优秀代码学习:Redis 源码概览
- Redis主从同步—笔记
- 重新想象 Windows 8 Store Apps (48) - 多线程之其他辅助类: SpinWait, SpinLock, Volatile, SynchronizationContext, CoreDispatcher, ThreadLocal, ThreadStaticAttribute
- 深入剖析 redis 事件驱动
- Redis配置文件redis.conf 详解
- 【redis】mysql数据复制至redis的一种应用场景
- Redis C客户端Hiredis的安装
- 转载-redis全操作
- java操作redis
- redis存储对象的方法
- redis.conf配置说明
- Ubuntu 安装 Redis,并配置开机启动
- Redis的安装配置