【发布时间】:2015-07-25 16:40:19
【问题描述】:
我正在使用 ConcurrentDictionary 来缓存并行访问的数据,有时新项目可以存储在 db 中并且它们不会加载到缓存中。这就是我使用 GetOrAdd 的原因
public User GetUser(int userId)
{
return _user.GetOrAdd(userId, GetUserFromDb);
}
private User GetUserFromDb(int userId)
{
var user = _unitOfWork.UserRepository.GetById(userId);
// if user is null, it is stored to dictionary
return user;
}
但是我如何才能检查用户是否是从数据库中获取的,并且只有当用户不为空时才将用户存储到字典中?
可能我可以在 GetOrAdd 之后立即从 ConcurrentDictionary 中删除 null,但它看起来不是线程安全的,也不是非常优雅的解决方案。从字典中插入和删除无用。你知道怎么做吗?
【问题讨论】:
-
如果
GetOrAdd返回null,你可以TryRemove添加值。虽然不是一个非常漂亮的解决方案。 -
如果从数据库中查找返回null,用户以后能不能出现在数据库中,是你要处理的吗?如果没有,如果找不到用户ID,为什么将用户ID存储在字典中,下次请求该用户ID时,字典已缓存它不存在,因此不需要询问数据库。
-
@y0io 你最后用了什么?
-
@Nikolai Samteladze 我稍后会回到这个问题,但可能你的锁定扩展方法的解决方案会赢;)非常感谢