Redis:实现固定大小集/列表以检查重复项

时间:2016-11-21 19:39:42

标签: redis stackexchange.redis

我想使用Redis实现以下功能:

  1. 我们有来电活动。每项活动都有唯一的身份证明
  2. 我们想使用它的Id
  3. 检查传入的活动是否重复
  4. 我们只想保留最后X个活动ID。 X号码不是硬编码要求。含有几个额外ID的含义不是问题。
  5. 每个传入的活动也都有时间戳。
  6. 不确定如何实施。

    1. 我可以使用List - 使用LPUSHLTRIM - 我可以保持固定大小 - 但是,我无法轻易检查重复。
    2. 我可以使用SET - 这可以让我在处理传入的活动之前非常轻松地检查副本 - 但是,我不确定如何限制SET的大小。
    3. 我应该使用哪种数据结构 - 这样我就可以轻松检查重复数据并保持修复大小。

      我正在使用StackExchange.Redis库。

1 个答案:

答案 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