【问题标题】:Caching and retrieving list of data using memcached使用 memcached 缓存和检索数据列表
【发布时间】:2012-08-29 21:28:37
【问题描述】:

我需要在缓存中存储一​​个数据列表。

有时我需要完整的列表,有时我只需要查询结果并从列表中返回一项。

一项的当前逻辑是这样的:

User result;
var cachedUsers = _cache.Get<List<User>>(Constants.Cache.UsersKey);
if( cachedUsers != null)
{
    result = cachedUsers.FirstOrDefault(u => u.UserID == userID);

    if (result != null)
        return result;
}

result = GetUserFromDb(userID);

if (cachedUsers != null)
{
    cachedUsers.Add(result);
    _cache.Store(StoreMode.Set, Constants.Cache.UsersKey, cachedUsers);
}

return result;

我可以直接从缓存中访问一个元素而不加载完整的用户列表吗?我还需要在不加载完整列表并覆盖它的情况下将用户添加到缓存中。

编辑:我可以选择将项目与列表分开存储,或者使用不同的方法从头开始写入缓存。

实现此逻辑的最佳方法是什么?

【问题讨论】:

标签: c# caching memcached


【解决方案1】:

您可以执行的最精细的操作是检索特定密钥。如果您在该键下存储项目列表,您将获得该列表。要准确获取一个项目,您需要为每个键存储一个项目。

对此有多种策略,但请注意,原子性处于键级别,因此跨多个键执行操作可能会导致竞争条件。

就个人而言,我会自定义序列化您的列表(而不是依赖默认的 .NET 序列化),因为这会相当快。但这取决于在谈论更新单个密钥或请求单个密钥时“有时”有多少次。常识“存储为你将使用它”将适用于此。

对于自定义序列化,我们使用Protobuf-net 并将生成的byte[] 手动存储到缓存中 - 就像缓存获取并提供byte[] 一样,我们手动进行序列化。

【讨论】:

  • 更新个人记录不会那么频繁,但必须有选项。请求将做很多。您能给我一些链接或示例,说明自定义序列化如何帮助我。谢谢。
【解决方案2】:

简短的回答是否定的。你缓存了整个列表,缓存是dumb,它不知道你缓存了什么,只是你缓存了一个数据块。你必须把它全部拉回来。

但是,我曾经通过使用设置的键模式单独缓存项目然后单独缓存列表索引来解决这个问题。然而,管理起来有点乏味,然后您就会拥有多个对象,它们都有自己的缓存寿命。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    相关资源
    最近更新 更多