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

fjaof16o  于 12个月前  发布在  Redis
关注(0)|答案(3)|浏览(141)

我想原子地设置列表的所有值,就像常规的SET命令一样。
我需要它,因为列表是数据库查询的缓存表示。我想使用LRANGE以“分页”模式访问该高速缓存。
我曾考虑使用RPUSH,但如果出现争用条件,我的缓存将接连包含多组重复的结果,我不喜欢这样。
使用RPUSHLTRIM的已知列表长度应该在大多数情况下都能工作,但是如果数据源返回不同的结果集,并且我们在LTRIM上有一个竞争条件,它可能会失败。当然,发生这种情况的可能性要小得多,但仍然。
以索引作为权重的SORTED SET也存在类似的问题。
使用redis的transactions看起来有点大材小用:据我所知,它们会暂停所有其他传入命令,直到transactions结束缓存的结果集可能很大。
然而,DELRPUSH在事务中似乎是目前唯一的选择,真的吗?

oprakyz7

oprakyz71#

简短的回答是,听起来交易通常是处理这个问题的最简单方法:

MULTI
DEL list
RPUSH list item1 item2 item3...
EXEC

字符串
然而,如果你的列表很大,并且你担心在填充列表时会阻塞Redis服务器,你的另一个选择是使用一个分布式锁定模式,比如redlock,在填充列表时锁定键的读/写。

ma8fv8wu

ma8fv8wu2#

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

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

字符串
我还没有测试过它,但应该工作。首先我们删除数组,然后我们设置它的所有值。

tpxzln5u

tpxzln5u3#

LPUSH和RPUSH是可变的,所以你可以用你想要添加的所有值来调用它们中的任何一个。

> RPUSH foo alfa bravo charlie delta

字符串
这将以原子的方式发生。

相关问题