我听说过redis,但对我的项目来说太重了。我决定自己编写一些对象缓存,如下所示:
private List<Specification> _lsSpecification...// the object need cache, I will use R/W lock to protect it
由于读取时间远远超过写入,我不希望每次需要读取对象时都使用try-catch-finally块代码,如下所示:
try
{
RWLock.EnterReadLock();
// do anything about _lsSpecification
}
catch (Exception ex)
{
}
finally
{
RWLock.ExitReadLock();
}
确切地说,我想得到的是指定的“规范”对象或整个列表。所以我的编码方法如下:
public Specifiction getSpecification(int id)
{
RWLock.EnterReadLock();
Specification specification = _lsSpecification.Find(c => c.ID == id).Clone;// assume a clone method is exist
RWLock.ExitReadLock();
return specification;
}
public List<Specification> getSpecifications()
{
RWLock.EnterReadLock();
List<Specification> lsAll = _lsSpecification.ToList();
RWLock.ExitReadLock();
return lsAll ;
}
如上所示,我调用这些方法获取对象,然后使用其复制值,它必须是安全的。但我仍觉得复制是浪费。我想知道redis是否可以返回一个对象或列表,如果可以,该值是副本还是引用?
答案 0 :(得分:1)
首先,Redis并不沉重。它的安装和使用非常简单。您几乎不费力地完成并运行它。我强烈建议你尽可能地尝试一下。使用StackExchange.Redis,您可以使用简单,设计良好且广泛使用的C#-library来访问Redis服务器。
Redis是一个键值存储,其值可以是五种不同数据类型之一。在您的情况下,您可以将序列化的Specifiction
存储为String
,并将ID作为密钥,例如spec:1
。
调用Specification
后,您必须反序列化GET
。 <{1}} - 对象不会将对象引用设置为或从中设置,因此它是副本。
在Specification
中,您可以存储所有ID。
您可以使用SET
获取ID并通过SMEMBERS
检索所有项目并将其反序列化为新对象。