redis return 值是副本还是引用
Is redis's return value a copy or referance
我听说过 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();
}
没错,我要获取的是指定的'Specification'对象或者整个列表。所以我的编码方法如下:
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是否可以return一个对象或列表,如果可以,该值是一个副本或引用?
首先,Redis 一点也不重。安装和使用非常简单。您将得到它并且 运行 几乎不费吹灰之力。我强烈建议您尽可能尝试一下。使用 StackExchange.Redis,您将拥有一个简单、设计良好且广泛使用的 C# 库来访问您的 Redis 服务器。
Redis 是一种键值存储,其中值可以是五种不同数据类型之一。在您的情况下,您可以将序列化的 Specifiction
存储为 String
,并将 id 作为键,例如spec:1
.
您必须在调用 GET
后反序列化您的 Specification
。此 Specification
-对象不会设置对象引用或从中设置对象引用,因此它是一个副本。
在 SET
中,您可以存储所有 ID。
您可以使用 SMEMBERS
获取 ID,并通过 MGET
检索所有项目并将它们反序列化,再次生成新对象。
我听说过 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();
}
没错,我要获取的是指定的'Specification'对象或者整个列表。所以我的编码方法如下:
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是否可以return一个对象或列表,如果可以,该值是一个副本或引用?
首先,Redis 一点也不重。安装和使用非常简单。您将得到它并且 运行 几乎不费吹灰之力。我强烈建议您尽可能尝试一下。使用 StackExchange.Redis,您将拥有一个简单、设计良好且广泛使用的 C# 库来访问您的 Redis 服务器。
Redis 是一种键值存储,其中值可以是五种不同数据类型之一。在您的情况下,您可以将序列化的 Specifiction
存储为 String
,并将 id 作为键,例如spec:1
.
您必须在调用 GET
后反序列化您的 Specification
。此 Specification
-对象不会设置对象引用或从中设置对象引用,因此它是一个副本。
在 SET
中,您可以存储所有 ID。
您可以使用 SMEMBERS
获取 ID,并通过 MGET
检索所有项目并将它们反序列化,再次生成新对象。