您可以使用排序集来存储特定类别的项目列表。你用 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 在你拿到所有的身份证之后。
2条答案
按热度按时间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
获取文章的文本。为了简单起见,我使用了小过期时间。
如果不想在排序集中使用项目id,可以设置文本而不是
id
并删除GET
在你拿到所有的身份证之后。0h4hbjxa2#
@ersoy的回答是一个很好的解决方案,我认为有一些改进:
我建议不要直接使用url作为redis键,因为url可能很长并且包含一些特殊字符(比如“/”)。使用md5或base64编码将是一种增强。
在执行多个redis命令进行更新时,如果逐个执行这些命令,要考虑并发情况。或者可以使用事务或锁使其原子化。