我需要在缓存中存储数据列表。
有时我需要完整列表,有时我只需要查询结果并从列表中返回一项。
一项的当前逻辑是这样的:
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/