c# - 使用 memcached 缓存和检索数据列表

标签 c# caching memcached

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

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

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

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;

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

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

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

最佳答案

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

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

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

对于自定义序列化,我们使用 Protobuf-net并将生成的 byte[] 手动存储到缓存中 - 例如,缓存获取并给出一个 byte[],然后我们手动进行序列化。

关于c# - 使用 memcached 缓存和检索数据列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12176106/

相关文章:

c# - 在 UI 构造函数中使用 Task.Run() 时处理异常

c# - Dictionary.Values.ToArray() 的顺序是什么?

grails - 如何覆盖 grails 动态查找器?

c - 编写一个测量缓存 block 大小的 C 程序

php - Memcached/XCache 缓存 SQL 结果?

python - 如何缓存分页的 Django 查询集

c#: BaseClass 虚方法使用在子类中定义的对象

c# - 在选择查询中使用参数

jquery - Google Chrome 中不缓存动态加载的图像

php - 内存缓存安装错误