如何原子地设置redis列表值?

问题描述 投票:0回答:1

我想以原子方式设置列表的所有值,就像常规的

SET
命令一样。

我需要它,因为该列表是数据库查询的缓存表示。我想使用

LRANGE
以“分页”模式访问缓存。

我想过使用RPUSH,但是如果发生竞争条件,我的缓存将包含一组又一组的重复结果,我不喜欢这样。

RPUSH
LTRIM 结合使用到已知的列表长度应该在大多数情况下都有效,但在数据源返回不同结果集并且我们在
LTRIM
上存在竞争条件的情况下,它可能会失败。当然,这种情况发生的可能性要小得多,但仍然存在。

以指数为权重的

SORTED SET
也面临着类似的问题。

使用 Redis 的事务似乎是一种矫枉过正:就我而言,它们会停止所有其他传入命令,直到事务结束 - 并且缓存的结果集可能是一个大块的结果集。

然而,交易中的

DEL
RPUSH
似乎是迄今为止唯一的选择。真的吗?

list caching redis pagination atomic
1个回答
0
投票

是的,我想我明白了。它应该是一个 LUA 脚本,因为它们是原子的:

redis.call('DEL', KEYS[1])
local res = redis.call('LPUSH', KEYS[1], unpack(ARGV))
return res

我还没有测试过,但应该可以。首先我们删除数组,然后设置它的所有值。

© www.soinside.com 2019 - 2024. All rights reserved.