【问题标题】:How to store protobuf object in memcached?如何将 protobuf 对象存储在 memcached 中?
【发布时间】:2016-02-15 10:51:33
【问题描述】:

以下是我用来创建从数据库/memcached 获取数据的 GRPC 系统的 proto 文件。

message CMSContent
{
    repeated ArticleSummary Articles = 1;
    uint32 RecordCount = 2;
}

service Article
{
    rpc ListByCategory(ArticleByCatURI) returns (CMSContent){}
}

message ArticleByCatURI
{
    uint32 ApplicationId = 1;        
}

message ArticleSummary
{
    uint32 ArticleId = 1;
    string ArticleName   = 2;
}

我创建了 GRPC Getting Started 中详述的相应 C# 类。我在服务器上使用这些类来存储数据库查询的结果并尝试将这些对象保存到 memcached。不幸的是,protobuf 对象没有被添加到 memcached 中。以下是我将它添加到 memcached 的方式,当我尝试添加它时,isKeyFirstTimeCreated 的值是 false。

 isKeyFirstTimeCreated = mc.Store(StoreMode.Add, key, t, DateTime.Now.Add(cacheDuration));

根据 memcached 的要求,所有必须存储在 memcached 中的对象都必须是可序列化的。但是自动生成的 protobuf 类不可序列化(至少对于 c# 使用的二进制格式化程序)。现在,由于这些类是部分实现,我使它们可序列化,但这并没有帮助,因为 RepeatedField 不是可序列化的。

IMO,应该有更好的方法或某种机制可以让我将 protobuf 对象直接保存到 memcached 中,但不幸的是,谷歌搜索在这方面对我没有多大帮助。

我可以通过两种方式实现这一目标

  • 通过将数据从 protobuf 对象复制到可序列化对象,然后将其保存到 memcached 中以供将来参考

  • 将数据复制到可序列化对象中,并使用该对象填充 protobuf 对象。

但是这两个接近需要额外的工作。有没有更好的方法来实现这一目标?

[PS:我使用的是proto3,因此它支持c#]

【问题讨论】:

    标签: c# memcached protocol-buffers protobuf-csharp-port


    【解决方案1】:

    几乎所有缓存存储都支持byte[]。像 protobuf 这样的工具可以直接存储在 byte[] 中,所以这里最常用的二进制序列化器方法基本上是:

    byte[] raw;
    using(var ms = new MemoryStream(ms)) {
        YourChosenSerializer.Serialize(ms, obj);
        raw = ms.ToArray();
    }
    // now store raw
    

    如果您的存储工具不支持byte[],那么string 通常是一个不错的替代品,但二进制序列化器 应该使用base-64 编码之类的方式存储(通过Convert.ToBase64StringConvert.FromBase64String)。

    至于直接支持这一点的 memcached 库(或类似库):出于关注点分离的原因,我建议不要这样做。但是,扩展方法通常可以很容易地在您自己的代码中的帮助方法中通过几行来提供此功能。

    【讨论】:

    • 是的,这对我有用,而且比我之前的两种方法要好得多。但我想知道我们是否也可以做一些比这更好的事情。您如何在 protobuf-net 中获得相同的结果?这种方法仍然需要我将我的 Object 转换为 byte[] 数组,然后存储该数组。我在想 protobuf 类可以以 protobuf 格式序列化,可能有一种方法可以直接存储这些对象,而不是通过调整一些属性或像使用 protobuf-net 一样设置转码器来将它们转换为字节数组。跨度>
    猜你喜欢
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 2014-03-26
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多