Redis 脚本学习笔记
简介
Redis 脚本是一种基于 Lua 语言的脚本语言,它可以在 Redis 中运行。在 Redis 中使用脚本有以下优点:
- 执行效率高:整个脚本一次性发送给 Redis 服务器执行,避免了网络开销。
- 原子性操作:脚本执行期间,Redis 的其他操作会被阻塞,确保了操作的原子性。
- 可读性好:脚本使用 Lua 语言编写,具有良好的可读性。
脚本执行
Redis 脚本的执行可以使用 EVAL、EVALSHA 和 SCRIPT LOAD 等命令。其中,EVAL 命令执行脚本,EVALSHA 命令执行已经缓存的脚本,SCRIPT LOAD 命令将脚本缓存到 Redis 服务器中。
以下是一个简单的 Redis 脚本示例:
luaCopy Codelocal current = tonumber(redis.call("GET", KEYS[1]))
if current and tonumber(ARGV[1]) < current then
return redis.error_reply("ERR new value is smaller than the current value")
end
return redis.call("SET", KEYS[1], ARGV[1])
这个脚本接受两个参数,第一个参数为 Redis 键值,第二个参数为新值。它首先从 Redis 中读取当前值,然后判断新值是否比当前值小。如果是,返回错误信息;否则,将新值写入 Redis 中。
在执行脚本时,需要传入键名和参数值:
Copy CodeEVAL "local current = tonumber(redis.call(\"GET\", KEYS[1]))\nif current and tonumber(ARGV[1]) < current then\n return redis.error_reply(\"ERR new value is smaller than the current value\")\nend\nreturn redis.call(\"SET\", KEYS[1], ARGV[1])" 1 mykey 10
上述命令将 mykey
的值设置为 10
,如果 mykey
的值比 10
小,则返回错误信息。
实例
统计个数
luaCopy Codelocal count = 0
for i, v in ipairs(KEYS) do
if tonumber(redis.call("GET", v)) > tonumber(ARGV[1]) then
count = count + 1
end
end
return count
这个脚本接受两个参数,第一个参数为 Redis 键值数组,第二个参数为一个阈值。它遍历所有的键值,统计大于阈值的键值的个数,并返回结果。
批量删除
luaCopy Codefor i,v in ipairs(KEYS) do
redis.call("DEL",v)
end
return true
这个脚本接受一个参数,为 Redis 键值数组。它遍历所有的键值,依次删除它们,并返回成功标识 true
。
总结
Redis 脚本是一种非常有用的工具,它可以提高 Redis 的执行效率和操作的原子性,同时也具有良好的可读性。在实际应用中,可以根据实际需要编写不同的脚本,以提高 Redis 的使用效率。