我想使用Redis实现以下功能:
不确定如何实施。
LPUSH
和LTRIM
- 我可以保持固定大小 - 但是,我无法轻易检查重复。SET
- 这可以让我在处理传入的活动之前非常轻松地检查副本 - 但是,我不确定如何限制SET
的大小。我应该使用哪种数据结构 - 这样我就可以轻松检查重复数据并保持修复大小。
我正在使用StackExchange.Redis
库。
答案 0 :(得分:2)
TL; DR both - 使用Sorted Set代替并将元素'(activity ids)得分设置为时间戳(即Unix纪元)。
正如您所指出的,列表是检测重复项的不错选择,因为您将以O(N)复杂度执行此操作。集合非常适合精确重复检测(实际上,也可以使用哈希),只要集合的基数({{3),您就可以使用 Y 的count
来调用SPOP
}})超出 X 或伪代码:
y = SCARD key - x
if y > 0 then
SPOP key y
end
但是,SPOP
是随机的,您已经提到过您有时间戳。在许多情况下,通过仅保留最新元素而不是不确定性来限制集合的大小更为实际。为此,使用排序集,SCARD
可以通过丢弃最旧的活动,将集合的基数(ZREMRANGEBYRANK
)保持在任意 X 值。请注意,排名是从最低到最高,因此您需要使用从0开始的排名范围(第一个,得分最低的元素) -X (从最后一个开始的第X + 1个元素,最高 - 得分元素),即只有这个:
ZREMRANGEBYRANK key 0 -x