【问题标题】:Comment System using Redis Database System使用 Redis 数据库系统的评论系统
【发布时间】:2011-10-02 22:44:48
【问题描述】:

我正在尝试使用 Redis 数据库构建评论系统,我目前正在使用哈希来存储评论数据,但我面临的问题是在 10 或 12 cmets 之后,cmets 失去了顺序并开始随机出现,任何人知道应该使用什么数据类型来使用 Redis 构建评论系统,目前我的哈希是这种形式。

postid:cmets commentid:userid "Testcomment"

谢谢,我们将不胜感激。

【问题讨论】:

    标签: comments redis


    【解决方案1】:

    设置哈希是为了通过键快速访问而不是按顺序检索。如果您需要按特定顺序排列的项目,请尝试使用列表或排序集。

    它最初似乎起作用的原因是对小型集合的优化 - 当您只有少量项目时,列表是最有效的结构,所以这就是 redis 内部使用的结构。当您获得更多项目时,需要一个实际的 hashmap 来进行高效查询,并且 redis 会重新排列数据,以便按 hash 排序而不是按插入顺序。

    【讨论】:

    • 排序列表对我很有帮助
    • 你说哈希是为了快速访问而设置的,所以如果我使用排序列表,我应该预期速度会降低吗?
    • 这是通过密钥快速访问 - 如果您知道密钥,您可以非常快速地检索任何单个项目,但您不知道第一个项目是什么。使用列表,您可以在恒定时间内获取第一个或最后一个项目,但是从一百万个项目列表中间的某个位置获取一个项目将非常慢。
    • 因此,如果我创建了一个系统,将 cmets 存储在排序列表中的帖子中,并通过存储在 mysql 中的帖子 id 检索它,我仍然会遇到性能下降的情况吗?因为我从开始、结束或中间检索整个列表而不是一个项目?
    • 不,在这种情况下性能将相同 - 不同之处在于它实际上会给出您正在寻找的结果。无论如何,如果你只是使用 redis 来获取一个 SQL 查询的 ID,那么 redis 绝对不会成为瓶颈。
    【解决方案2】:

    在我的网络应用中,我使用的是这样的格式。

    (appname):(postid):(comment id) - The hash of the posts
    (appname):(postid):count - The latest comment id
    

    然后我查询 (appname):(postid):count 键以获取我应该运行一个循环以获取 (appname):(postid):(comment id) 哈希的内容的次数。

    示例代码

    $c = $redis->get('(appname):(postid):count');
    for($i = 0; $i<$c; $i++) {
        var_dump($redis->hgetall('(appname):(postid):'.$i));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      • 2018-05-24
      • 2022-11-13
      • 2016-05-02
      • 1970-01-01
      • 2011-08-06
      相关资源
      最近更新 更多