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 检索所有项目并将它们反序列化,再次生成新对象。