我想以原子方式设置列表的所有值SET
,就像常规命令一样。
我需要它,因为该列表是数据库查询的缓存表示。我想通过使用“分页”模式访问缓存LRANGE
。
我想过使用RPUSH,但如果发生竞争条件,我的缓存将包含多组相继的重复结果,我不喜欢这样。
与已知列表长度的LTRIMRPUSH
结合使用在大多数情况下应该有效,但在数据源返回不同结果集并且我们在 上存在竞争条件的情况下,它可能会失败。当然,这种情况发生的可能性要小得多,但仍然存在。LTRIM
以索引作为权重的方法SORTED SET
也面临着类似的问题。
使用 redis 的事务似乎有点大材小用:就我而言,它们会停止所有其他传入命令,直到事务结束 - 并且缓存的结果集可能是一大块。
然而,DEL
到目前为止,RPUSH
交易似乎是唯一的选择。是不是真的?
简短的回答是,听起来交易通常是处理此问题的最简单方法:
但是,如果您的列表非常庞大,并且您担心在填充 Redis 服务器时阻塞 Redis 服务器,那么您的另一个选择是使用分布式锁定模式(如 redlock)来在填充列表时锁定密钥以防止读/写。
是的,我想我已经明白了。它应该是一个 LUA 脚本,因为它们是原子的:
我还没有测试过,但应该可以。首先我们删除数组,然后设置它的所有值。
LPUSH 和 RPUSH 是可变参数,因此您可以使用要添加的所有值来调用其中任何一个。
这将以原子方式发生。