caching - Redis 缓存新闻文章

标签 caching hash redis set memcached

我有一堆新闻文章(目前约为 100k)。每一篇文章都可以与多个类别相关联。所以我有两个键 article URLcategory。我需要将这些文章存储在 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/

相关文章:

php - PHP框架缓存与Redis缓存之间的区别

caching - 从 Ruby on Rails 4 上的磁盘缓存中清除过期的缓存条目

drupal - 允许非站点管理员通过管理员菜单访问清除缓存,Drupal 6

c - C 中哈希码的递归

c# - C# 和 Java 之间始终相等的简单哈希

node.js - 架构:有效地计算和维护类似 Reddit 的网站中用户提交的分数

javascript - JavaScript 中的简单缓存

caching - 为什么 Plone 3 在 CSS 和 JS 注册表文件中设置语言 cookie 以及如何摆脱它?

ruby - 如果键存在,向散列值添加一些东西?

python - 如何打印键redis的所有值