我想以原子方式设置列表的所有值,就像常规的
SET
命令一样。
我需要它,因为该列表是数据库查询的缓存表示。我想使用
LRANGE
以“分页”模式访问缓存。
我想过使用RPUSH,但是如果发生竞争条件,我的缓存将包含一组又一组的重复结果,我不喜欢这样。
将
RPUSH
与 LTRIM 结合使用到已知的列表长度应该在大多数情况下都有效,但在数据源返回不同结果集并且我们在 LTRIM
上存在竞争条件的情况下,它可能会失败。当然,这种情况发生的可能性要小得多,但仍然存在。
以指数为权重的
SORTED SET
也面临着类似的问题。
使用 Redis 的事务似乎是一种矫枉过正:就我而言,它们会停止所有其他传入命令,直到事务结束 - 并且缓存的结果集可能是一个大块的结果集。
然而,交易中的
DEL
和RPUSH
似乎是迄今为止唯一的选择。真的吗?
是的,我想我明白了。它应该是一个 LUA 脚本,因为它们是原子的:
redis.call('DEL', KEYS[1])
local res = redis.call('LPUSH', KEYS[1], unpack(ARGV))
return res
我还没有测试过,但应该可以。首先我们删除数组,然后设置它的所有值。