1

我有以下班级女巫在论坛中存储消息

using System;
using System.Collections.Generic;

public partial class ForumMessage
{
    public ForumMessage()
    {
        this.Votes = new HashSet<ForumMessageVote>();
        OnCreated();
    }

    partial void OnCreated();

    public long id { get; set; }
    public int forumId { get; set; }
    public Nullable<long> parentId { get; set; }
    public int memberId { get; set; }
    public int lastModifiedMemberId { get; set; }
    public Nullable<long> lastReplyId { get; set; }
    public string title { get; set; }
    public string body { get; set; }
    public string imagePath { get; set; }
    public Nullable<bool> isSticky { get; set; }
    public Nullable<bool> allowPosts { get; set; }
    public Nullable<bool> allowImages { get; set; }
    public Nullable<bool> allowYoutube { get; set; }
    public Nullable<bool> allowBbCode { get; set; }
    public Nullable<long> totalMessages { get; set; }
    public Nullable<long> totalViews { get; set; }
    public Nullable<long> totalDailyViews { get; set; }
    public Nullable<int> totalVotes { get; set; }
    public Nullable<long> totalScore { get; set; }
    public bool published { get; set; }
    public Nullable<System.DateTime> publishedDate { get; set; }
    public Nullable<System.DateTime> lastModifiedDate { get; set; }
    public Nullable<bool> isTemporary { get; set; }
    public Nullable<System.DateTime> lastReplyDate { get; set; }
    public Nullable<int> lastReplyMemberId { get; set; }
    public Nullable<long> sortByLastReplyId { get; set; }
    public Nullable<bool> containsImage { get; set; }
    public Nullable<bool> containsVideo { get; set; }
    public Nullable<bool> @private { get; set; }

    public virtual Forum Forum { get; set; }
    public virtual ICollection<ForumMessageVote> Votes { get; set; }
    public virtual Member Member { get; set; }
}

目前,我正在使用 Booksleeve 缓存这些对象,方法是使用以下代码(简化版本)将它们与 Json 序列化存储在字符串键中(如果在 Redis 中):

            using (var conn = conn.CreateTransaction())
            {
                return conn.Store<ForumMessage>(db, message.id, message);
            }

在我的论坛应用程序视图中,我使用了上述大部分字段,因为我显示了属于论坛线程的上述消息的列表。

为了获取 ForumMessage 类的列表,我使用了mget命令。

当用户发布新消息或为消息投票时,我需要更新上述某些字段。当我更新时,我通过 redis get获取消息,更新所需的字段/字段(主要是一个或两个字段),然后我通过conn.store booksleeve 方法存储更新。

目前论坛高峰时段收到约12条消息/分钟和20票/分钟(总票数不是每条消息)

如果上述问题的更优解决方案是将消息存储在 redis 哈希中,我会徘徊,因为这样更新会更快。但是为了使用哈希,在 redis 上进行初始存储的代码会更复杂(慢),并且此代码将在 Web 服务器而不是 redis 服务器上运行。

您是否认为值得通过使用哈希来重新实现消息存储/检索过程,或者当消息插入率以 30 条消息/分钟增加时,比我现在使用的解决方案能够很好地扩展?

本质上,您能否就stackoverflow如何处理这种情况提供一些指导?

4

1 回答 1

1

哈希在这里很自然,主要是因为该数据结构针对共享整体身份(包括到期等)的多个命名值。如果您当前使用-对于哈希MGET,您只需使用HMGET,HGETALLHMSET.

我认为这不会改变任何事情,使其变得更复杂:您只需将预期的更改填充到 aDictionary<string,byte[]>和 use.Hashes.Set(...)中。.Strings.Set一次而不是多次调用。同样,使用可变参数形式 of.Strings.Get(...)与 call.Hashes.GetAll(...)或可变参数形式 的差别不大.Hashes.Get(...)

我也不接受这段代码会更慢 - 事实上,它基本上是相同的。实际上,在实现级别,单个调用.Hashes.Set在 etc 方面涉及较少的开销Task,因为它是单个可等待/可等待操作。

目前论坛高峰时段收到约12条消息/分钟和20票/分钟(总票数不是每条消息)

该吞吐量不应该成为问题。Redis 以每秒10 秒(或 100 秒)数千条消息的速度运行良好。

您是否认为值得通过使用哈希来重新实现消息存储/检索过程,或者当消息插入率以 30 条消息/分钟增加时,比我现在使用的解决方案能够很好地扩展?

该消息率应该没有问题。如果您看到问题,请详细说明。然而,最简单和最合适的下一步是模拟一些更高的负载 - 看看什么有效。

本质上,您能否就stackoverflow如何处理这种情况提供一些指导?

我们通常使用 SQL 数据库作为我们的主要数据存储(尽管有些东西只保存在 redis 中)。我们广泛使用 redis 将处理过的项目存储为缓存,但由于它们不会更改,因此我们不会逐字段存储它们:相反,我们使用 protobuf-net 针对 DTO 类型并存储数据块(使用字符串类型,即GET/SET)。此外,如果大小超过阈值(并且只要它不进入集合/排序集合),我们会进行快速“gzip”测试,看看如果我们压缩它是否会变小(不是所有确实):如果是,我们将其存储-因此我们拥有绝对最小的带宽和存储开销,并且在存储/获取时处理速度非常快。为清楚起见,我们不在集合/排序集合中压缩的原因是 gzip 不能保证每次输出完全相同,这会扰乱散列。

于 2014-03-18T08:29:54.057 回答