Redis 脚本学习笔记

简介

Redis 脚本是一种基于 Lua 语言的脚本语言,它可以在 Redis 中运行。在 Redis 中使用脚本有以下优点:

  • 执行效率高:整个脚本一次性发送给 Redis 服务器执行,避免了网络开销。
  • 原子性操作:脚本执行期间,Redis 的其他操作会被阻塞,确保了操作的原子性。
  • 可读性好:脚本使用 Lua 语言编写,具有良好的可读性。

脚本执行

Redis 脚本的执行可以使用 EVAL、EVALSHA 和 SCRIPT LOAD 等命令。其中,EVAL 命令执行脚本,EVALSHA 命令执行已经缓存的脚本,SCRIPT LOAD 命令将脚本缓存到 Redis 服务器中。

以下是一个简单的 Redis 脚本示例:

luaCopy Code
local 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 Code
EVAL "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 Code
local 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 Code
for i,v in ipairs(KEYS) do redis.call("DEL",v) end return true

这个脚本接受一个参数,为 Redis 键值数组。它遍历所有的键值,依次删除它们,并返回成功标识 true

总结

Redis 脚本是一种非常有用的工具,它可以提高 Redis 的执行效率和操作的原子性,同时也具有良好的可读性。在实际应用中,可以根据实际需要编写不同的脚本,以提高 Redis 的使用效率。