gpt4 book ai didi

redis - redis返回值是副本还是引用

转载 作者:IT王子 更新时间:2023-10-29 06:12:59 30 4
gpt4 key购买 nike

我听说过 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是否可以返回一个对象或列表,如果可以,该值是一个副本或引用?

最佳答案

首先,Redis 一点都不重。安装和使用非常简单。您几乎可以毫不费力地启动并运行它。我强烈建议您尽可能尝试一下。用StackExchange.Redis您有一个简单、设计良好且广泛使用的 C# 库来访问您的 Redis 服务器。

Redis 是一种键值存储,其中值可以是五种不同数据类型之一。在您的情况下,您可以将序列化的 Specifiction 存储为 String 并将 id 作为键,例如规范:1

您必须在调用 GET 后反序列化您的 Specification。此 Specification-object 不会设置对象引用,因此它是一个副本。

SET 中,您可以存储所有 ID。您可以使用 SMEMBERS 获取 ID,并通过 MGET 检索所有项目并将它们反序列化,再次生成新对象。

关于redis - redis返回值是副本还是引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50562582/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com