【1】zadd+ expire + ZREMRANGEBYRANK,保留最近maxSize条数据(按rank倒排)
redis.call('ZADD', KEYS[1], unpack(ARGV, 3));
redis.call('EXPIRE', KEYS[1], ARGV[1]);
local maxSize = tonumber(ARGV[2]);
redis.call('ZREMRANGEBYRANK', KEYS[1], 0, -maxSize-1);
return 1
注:ZREMRANGEBYRANK key start end命令说明:
0,代码score最小的元素位置;-代表score最大的元素位置;
正数:score从小往大数
负数:score从大往小数
【2】DEL + zadd + expire
redis.call('DEL',KEYS[1]);
if #ARGV>=2 then redis.call('ZADD',KEYS[1],unpack(ARGV,2)) end;
redis.call('EXPIRE',KEYS[1],ARGV[1]);
return 1
【3】次数频控
local key = KEYS[1]
local leftNum = ARGV[1]
if redis.call('setnx', key, leftNum) == 1 then
redis.call('expire', key, ARGV[2])
else
leftNum = redis.call('get', key)
end
if tonumber(leftNum) > 0 then
redis.call('decr', key)
return 1
else
return 0
end
注:
script load "lua脚本" ==》 返回hash值
evalsha <hash值> <key的个数> <keys...> <values...>