redis lua

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

Lua是一种轻量级脚本语言,Redis内置了Lua解释器,可以使用Lua脚本来执行Redis命令,提高Redis的性能和灵活性。下面是Redis Lua的基础教程。 1. Redis Lua脚本的结构 Redis Lua脚本的结构以函数为单位,每个函数由三部分组成:输入参数、脚本逻辑和返回值。例如: ``` local key = KEYS[1] local value = ARGV[1] redis.call('SET', key, value) return value ``` 其中,KEYS和ARGV是Redis Lua的两个全局表,用于接收Redis命令的键和值。redis.call()用于执行Redis命令,return语句用于返回脚本执行结果。 2. Redis Lua脚本的执行 Redis Lua脚本执行有两种方式:EVAL和EVALSHA。EVAL用于执行Redis Lua脚本,EVALSHA用于执行缓存在Redis中的Lua脚本。例如: ``` redis> EVAL "return 1 + 1" (integer) 2 redis> EVALSHA "sha1" 1 key1 value1 ``` 其中,sha1是Redis Lua脚本的SHA1校验和,1是输入参数的数量,后面是输入参数的列表。 3. Redis Lua脚本的优势 Redis Lua脚本有以下优势: - 原子性:Redis Lua脚本是原子性的,一个脚本会在执行期间被其他客户端请求阻塞,直到该脚本执行完毕。 - 复用性:Redis Lua脚本可以在多个客户端之间共享,减少了网络传输和脚本解析的开销。 - 安全性:Redis Lua脚本不允许执行除Redis命令之外的任何操作,保障了Redis数据库的安全性。 以上是Redis Lua的基础教程,希望能帮助你快速上手Redis Lua脚本。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值