Redis 脚本应用

一段 Lua 脚本,用来实现访问频率限制

local times= redis.call('incr',KEYS[1])

if times==1 
then redis.call('expire',KEYS[1],ARGV[1])
end

if times>tonumber(ARGV[2]) then
    return 0
end

return 1

如何调用这个脚本呢?

redis-cli --eval /Users/root/ratelimit.lua ip , 10 3
第一个参数 --eval 代表运行后面的 lua 脚本
后面跟着的是脚本中参数 "," 前后要有空格 "," 前代表 KEYS[.] 后代表 ARGV[.]

脚本中调用 Redis 命令

如 redis.call('set','foo','bar')

程序中执行脚本

eval ”脚本内容” i value value...
i 代表前几个存入 KEYS[] 中 后面的存入 ARGV[] 中 不需要时设为 0
如 eval "return redis.call('set',KEYS[1],ARGV[1])" 1 tt bb
脚本内容过多可使用 evalsha 后跟 摘要信息 (许多客户端会默认先进行 evalsha 请求 失败在执行 sha)

Redis 执行脚本有如下特点
取消随机性
沙盒
原子性

脚本相关命令

script load “脚本内容” 返回 sha1 摘要 顾名思义将脚本加入缓存以便客户端可以使用 evalsha
script exists “脚本 sha1 摘要” “脚本 sha1 摘要” 可查找一个或多个脚本是否加入了缓存
script flush 清空脚本缓存
script kill 终止当前执行的脚本 如果脚本中对数据进行了修改 则只能使用 shutdown 来关闭

redis��ʹ��java�ű�ʵ�ֲַ�ʽ��