我想原子地设置列表的所有值,就像常规的SET
命令一样。
我需要它,因为列表是数据库查询的缓存表示。我想使用LRANGE
以“分页”模式访问该高速缓存。
我曾考虑使用RPUSH,但如果出现争用条件,我的缓存将接连包含多组重复的结果,我不喜欢这样。
使用RPUSH
和LTRIM的已知列表长度应该在大多数情况下都能工作,但是如果数据源返回不同的结果集,并且我们在LTRIM
上有一个竞争条件,它可能会失败。当然,发生这种情况的可能性要小得多,但仍然。
以索引作为权重的SORTED SET
也存在类似的问题。
使用redis的transactions看起来有点大材小用:据我所知,它们会暂停所有其他传入命令,直到transactions结束缓存的结果集可能很大。
然而,DEL
和RPUSH
在事务中似乎是目前唯一的选择,真的吗?
3条答案
按热度按时间oprakyz71#
简短的回答是,听起来交易通常是处理这个问题的最简单方法:
字符串
然而,如果你的列表很大,并且你担心在填充列表时会阻塞Redis服务器,你的另一个选择是使用一个分布式锁定模式,比如redlock,在填充列表时锁定键的读/写。
ma8fv8wu2#
是的,我想我弄明白了。它应该是一个LUA脚本,因为它们是原子的:
字符串
我还没有测试过它,但应该工作。首先我们删除数组,然后我们设置它的所有值。
tpxzln5u3#
LPUSH和RPUSH是可变的,所以你可以用你想要添加的所有值来调用它们中的任何一个。
字符串
这将以原子的方式发生。