redis运行lua脚本

使用lua 脚本操作redis可减少与redis数据的连接次数,减少网络传输带来的时间浪费。在某些情景下,当我们需要对redis进行一系列的操作时我们可以使用lua。下面给出简单的示例。

redis-cli 运行lua 脚本

redis-cli -h host -p port -a password -n db –eval demo.lua k1 k2 , a1 a2

连接远程redis 并运行当前文件夹下的test.lua脚本。其中,-n 后接的参数为选择的redis db。 后面“k1 k2 , a1 a2” 的在lua 脚本中获取的方式是使用全局变量 KEYS 和 ARGV。

如果连接本地的redis运行脚本则可省略几个参数

redis-cli -n db –eval demo.lua k1 k2 , a1 a2

redis客户端命令行模式下运行lua脚本,使用eval 命令。如:

 121.8.164.91:6383> eval “return {KEYS[1], KEYS[2], ARGV[1], ARGV[2]}”

注意需要获取返回数据必须使用 return

PHP 连接redis运行lua
$lua = 'return KEYS[1]';
// 也可以使用 file_get_contents() 读取lua脚本内容
// $lua = file_get_contents('/tmp/demo.lua');
$data = new \Redis()->connect('192.168.0.1', '6383')->auth('123456')->select(2)->eval($lua ,['k1', 'k2','a1', 'a2'], 2);

lua 操作redis

lua 操作redis比较简单,使用 redis.call( order, o r d e r , argv1, $argv2…);
将redis使用命令行时的参数依次作为参数传入,即可。
如:
- 使用获取指定key的值

redis.call(‘GET’,’key_demo’);

  • 求多个zSet的并集,并存储为union_set。的

    redis.call(‘ZUNIONSTORE’, ‘union_set’, ‘zSet_1’, ‘zSet_2’, ‘zSet_3’);

  • 统计一个zSet中的元素个数

    redis.call(‘ZCARD’,’union_set’);

lua脚本示例

  • 统计union_set中元素个数
-- 注释,统计union_set中元素个数。如果大于10,则给zSetCountDes赋值'more then 10 ', 如果小于10,则给zSetCountDes赋值'less then 10'
local zSetCount = '';
local zSetCountDes = '';
zSetCount = redis.call('ZCARD','union_set');
if (zSetCount>10)
then
    zSetCountDes = 'more then 10';
else 
    zSetCountDes = 'less then 10';
end;
return zSetCountDes;
  • 遍历zSet中元素
local value = '';
local score = '';
local responseJson = '';
local zSetElement = redis.call('ZRANGE', 'zSet_1',0, 1, 'WITHSCORES');

for key,val in pairs(zSetElement) do
    paidCountKey = gameId .. '_' .. 'activation_paid_count';
    moneyCountKey = gameId .. '_' .. 'activation_paid_money_count';

    -- 奇数key 对应val是 value
    -- 偶数key 对应val是 score
    if (key%2==1)
    then
        value = val;
    else
        score = val;

    end;
    responseJson = responseJson .. value .. ':' .. score .. ',';

end;

-- 拼接成json字符串
responseJson = '{' .. string.sub(responseJson, 1, -2) .. '}';

return responseJson;

如果zSet_1中数据为:

1) "value_a"
2) "score_a"
3) "value_b"
4) "score_b"

则脚本返回的字符串为:”{\”value_a\”:\”score_a\”, \”value_b\”:\”score_b\”}

注意使用 redis.call(‘ZRANGE’, ‘zSet_1’,0, 1, ‘WITHSCORES’);获取zSet中数据时是table类型。此时奇数key 对应val 才是zSet中value 而紧接着的一个偶数key对应的 val 才是value对应的score值。
如使用命令:

121.8.164.91:6383> zrange zSet_1 0 1 withscores

可看到如下数据:

1) "value_a"
2) "score_a"
3) "value_b"
4) "score_b"

则在lua中使用for key,val in pairs(zSetElement) do … end; 遍历时key和val 会是这样:

key    val

1      "value_a"
2      "score_a"
3      "value_b"
4      "score_b"
RedisLua脚本是一种在Redis中执行操作的脚本语言。它允许用户通过Lua脚本执行一系列的Redis操作,包括读取、写入和删除数据等。RedisLua脚本具有以下特点: 1. 原子性:RedisLua脚本在执行过程中是原子的,它们要么全部执行成功,要么全部不执行。 2. 可重用性:Lua脚本可以被缓存和重复使用,提高执行效率。 3. 灵活性:Lua脚本支持逻辑控制语句、循环和函数等高级特性,可以实现复杂的业务逻辑。 4. 安全性:Lua脚本可以通过Redis的安全机制进行权限控制,确保脚本的执行安全。 5. 扩展性:RedisLua脚本可以通过调用Redis提供的API扩展其功能。 RedisLua脚本执行流程包括加载脚本、编译脚本和执行脚本三个步骤。在加载脚本阶段,Redis会将脚本加载到内存中,并对其进行缓存,以提高执行效率。在编译脚本阶段,Redis会对脚本进行语法检查和编译。在执行脚本阶段,Redis会按照预定的执行流程执行脚本中的命令,并返回执行结果。 RedisLua脚本在实际应用中有许多场景,包括但不限于: 1. 原子性操作:通过Lua脚本可以实现多个Redis操作的原子性,例如加锁、解锁、事务操作等。 2. 复杂数据处理:通过Lua脚本可以对Redis中的数据进行复杂的处理和计算,例如排序、过滤、聚合等。 3. 分布式锁:通过Lua脚本可以实现分布式锁,保证多个客户端之间的数据的一致性和原子性。 4. 实时计算:通过Lua脚本可以进行实时计算,例如统计、推荐算法等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值