Redis:实现固定大小 Set/List 以检查重复项
Redis: Implementing fixed Size Set/List to check duplicates
我想使用 Redis 实现以下功能:
- 我们有即将到来的活动。每个 activity 都有唯一的 Id
- 我们想使用它的 Id
检查传入的 activity 是否重复
- 我们只想维护最后 X 个 activity ID。 X 编号不是硬编码要求。意味着有几个额外的 ID 不是问题。
- 每个传入 activity 也有时间戳。
不确定如何实施。
- 我可以使用列表 - 使用
LPUSH
和 LTRIM
- 我可以保持固定大小 - 但是,我无法轻松检查重复项。
- 我可以使用
SET
- 它允许我在处理传入 activity 之前非常容易地检查重复项 - 但是,我不确定如何限制 SET
的大小.
我应该使用哪种数据结构 - 这将使我能够轻松检查重复项并保持修复大小。
我正在使用 StackExchange.Redis
库。
TL;DR 两者都不是 - 使用排序集并将元素的(activity ids)分数设置为时间戳(即 Unix 纪元)。
正如您所指出的,列表对于检测重复项来说是一个糟糕的选择,因为您将以 O(N) 的复杂度来执行此操作。 Sets 非常适合精确的重复检测(实际上,也可以使用 Hashes),你可以调用 SPOP
with count
of Y whenever the set's cardinality (SCARD
)超过你的 X,或者在伪代码中:
y = SCARD key - x
if y > 0 then
SPOP key y
end
但是,SPOP
是随机的,您提到过您有一个时间戳。在许多情况下,通过仅保留最新的元素而不是不确定的元素来限制集合的大小更为实用。为此,通过丢弃最旧的活动,以任意 X 值使用 Sorted Set 和 ZREMRANGEBYRANK
will let you keep the set's cardinality (ZCARD
)。请注意,排名是从最低到最高,因此您需要使用从 0(第一个得分最低的元素)到 -X(最后一个元素的第 X+1 个元素)的排名范围,得分最高的元素),即只有这个:
ZREMRANGEBYRANK key 0 -x
我想使用 Redis 实现以下功能:
- 我们有即将到来的活动。每个 activity 都有唯一的 Id
- 我们想使用它的 Id 检查传入的 activity 是否重复
- 我们只想维护最后 X 个 activity ID。 X 编号不是硬编码要求。意味着有几个额外的 ID 不是问题。
- 每个传入 activity 也有时间戳。
不确定如何实施。
- 我可以使用列表 - 使用
LPUSH
和LTRIM
- 我可以保持固定大小 - 但是,我无法轻松检查重复项。 - 我可以使用
SET
- 它允许我在处理传入 activity 之前非常容易地检查重复项 - 但是,我不确定如何限制SET
的大小.
我应该使用哪种数据结构 - 这将使我能够轻松检查重复项并保持修复大小。
我正在使用 StackExchange.Redis
库。
TL;DR 两者都不是 - 使用排序集并将元素的(activity ids)分数设置为时间戳(即 Unix 纪元)。
正如您所指出的,列表对于检测重复项来说是一个糟糕的选择,因为您将以 O(N) 的复杂度来执行此操作。 Sets 非常适合精确的重复检测(实际上,也可以使用 Hashes),你可以调用 SPOP
with count
of Y whenever the set's cardinality (SCARD
)超过你的 X,或者在伪代码中:
y = SCARD key - x
if y > 0 then
SPOP key y
end
但是,SPOP
是随机的,您提到过您有一个时间戳。在许多情况下,通过仅保留最新的元素而不是不确定的元素来限制集合的大小更为实用。为此,通过丢弃最旧的活动,以任意 X 值使用 Sorted Set 和 ZREMRANGEBYRANK
will let you keep the set's cardinality (ZCARD
)。请注意,排名是从最低到最高,因此您需要使用从 0(第一个得分最低的元素)到 -X(最后一个元素的第 X+1 个元素)的排名范围,得分最高的元素),即只有这个:
ZREMRANGEBYRANK key 0 -x