新闻文章的redis缓存

vuv7lop3  于 2021-06-09  发布在  Redis
关注(0)|答案(2)|浏览(519)

我有一堆新闻文章(目前大约10万篇)。每一篇文章都可以与多个类别相关联。所以我有两把钥匙 article URL 以及 category . 我需要将这些文章存储在redis中,并需要按类别对它们进行分组。我需要得到任何类别的所有文章在快速和一篇文章的网址。我还需要为所有的文章到期时间。
我决定使用哈希集,但后来明白哈希集项没有过期日期。
简言之,我不知道从现在开始该往哪里走。我在这方面还是个新手。我想知道是否有一些最佳做法。

vh0rcniy

vh0rcniy1#

您可以使用排序集来存储特定类别的项目列表。你用 score 过期时间和 id 作为值。我不建议您将整篇文章(整篇文本)存储为值,因为您的内存使用量可能会急剧增加,因为多个类别将具有相同的文章,并且您需要将相同的文章存储在不同的多个排序集上(类别a、b、c可能都具有文章1、2、3)。
设置文章时; SET 带有 EX 选项(文本将在这里) SET 文章url作为键,文本作为值 EX 选项(我跳过了这部分,你这边已经很清楚了)
对于文章的每个类别,运行 ZREMRANGEBYSCORE (从-inf到当前时间戳)删除已过期的项目。
将文章的id推送到分类集合中 ZADD (过期时间为分数,值为物品id)
通过分页获取文章id ZRANGE .
或者,您可以在使用之前使用zremrangebyscore ZRANGE .
它会给你文章的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 并删除 GET 在你拿到所有的身份证之后。

0h4hbjxa

0h4hbjxa2#

@ersoy的回答是一个很好的解决方案,我认为有一些改进:
我建议不要直接使用url作为redis键,因为url可能很长并且包含一些特殊字符(比如“/”)。使用md5或base64编码将是一种增强。
在执行多个redis命令进行更新时,如果逐个执行这些命令,要考虑并发情况。或者可以使用事务或锁使其原子化。

相关问题