Redis 多次调用 vs lua 脚本

Posted

技术标签:

【中文标题】Redis 多次调用 vs lua 脚本【英文标题】:Redis multiple calls vs lua script 【发布时间】:2021-10-27 02:00:14 【问题描述】:

我有以下用例。

用值设置键 如果密钥已经退出,则获取密钥,否则将其设置为过期。

基本上,我正在尝试用 nx 做一组并得到。这是我想出的lua脚本

local v = redis.call('GET', KEYS[1])
if v then
     return v
end
redis.call('SETEX', KEYS[1], ARGV[1], ARGV[2])"

与执行两个不同的单独命令先获取然后设置相比,我是否应该使用上述 Lua 脚本有点困惑。

使用 lua 脚本的任何优点或缺点。或者应该两个单独的命令更好。

【问题讨论】:

【参考方案1】:

是的,你应该使用脚本。

如果您使用两个单独的 Redis 命令,那么您最终会遇到竞争条件:另一个进程可能会在您的 GET 和您的 SETEX 之前设置值,从而导致您覆盖它。您的逻辑要求这个命令序列是原子的,而在 Redis 中做到这一点的最佳方法是使用 Lua 脚本。

可以通过使用MULTIWATCH 在不使用脚本的情况下实现此目的,但Lua 脚本要简单得多。

【讨论】:

还有 Lua 脚本,可以节省往返时间。 Lua 目前为 +1,因为它必须是一个原子过程。寻找 Redis 7,它将通过使用 NXGET args 的单个 SET 命令解决它。

以上是关于Redis 多次调用 vs lua 脚本的主要内容,如果未能解决你的问题,请参考以下文章

Redis进阶应用:Redis+Lua脚本实现复合操作

redis使用lua

redis lua脚本有啥用

Redis脚本全解

Redis Lua脚本的详细介绍以及使用入门

Redis+Lua实现限流