我有一堆新闻文章(目前约为 100k)。每一篇文章都可以与多个类别相关联。所以我有两个键 article URL
和 category
。我需要将这些文章存储在 Redis 中,并需要按类别对它们进行分组。我需要快速获取任何类别的所有文章,并通过其 URL 获取一篇文章。我还需要所有文章的过期时间。
我决定使用哈希集,但后来了解到哈希集项目没有过期日期。
简而言之,我不确定从这里到哪里最好。我在这个领域还是个新手。我想知道是否有一些最佳实践。
最佳答案
您可以使用排序集来存储特定类别的文章列表。您使用 score
作为过期时间,使用 id
作为值。我不建议您将整篇文章(全文)存储为值,因为您的内存使用量可能会急剧增加,因为多个类别将具有相同的文章,并且您需要将同一篇文章存储在不同的多个排序集(类别 a,b ,c 可能都有第 1,2,3) 条。
设置文章时;
SET
文章(id 作为键),带有EX
选项。 (文本将在此处)SET
文章 url 作为键,文本作为值,并使用EX
选项。 (我跳过这一部分,你已经很清楚了)- 对于文章的每个类别,运行
ZREMRANGEBYSCORE
(从 -inf 到当前时间戳)以删除已过期的文章。 - 使用
ZADD
将文章的id推送到类别排序集(过期时间将是score,值为文章id) - 使用
ZRANGE
分页获取文章 ID。 - 或者,您也可以在使用
ZRANGE
之前使用 ZREMRANGEBYSCORE。 - 它会给您文章 ID,然后您可以使用
GET
获取文章的文本。
为了简单起见,我使用了较小的过期时间。
127.0.0.1:6379> SET article:1 very-long-article-text EX 120
OK
127.0.0.1:6379> ZREMRANGEBYSCORE category:1 -inf 20
(integer) 0
127.0.0.1:6379> ZADD category:1 3 article:1
(integer) 1
127.0.0.1:6379> SET article:2 article-details EX 120
OK
127.0.0.1:6379> ZREMRANGEBYSCORE category:1 -inf 20
(integer) 1
127.0.0.1:6379> ZADD category:1 3 article:2
(integer) 1
127.0.0.1:6379> ZRANGE category:1 0 9
1) "article:2"
127.0.0.1:6379> ZADD category:2 3 article:2
(integer) 1
如果您不想在排序集中使用文章 ID,您可以设置文本而不是 id
,并在获取所有 id 后删除 GET
的使用.
关于caching - Redis 缓存新闻文章,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63417373/