redis的返回值是副本还是referance

时间:2018-05-28 08:57:26

标签: redis c#-3.0

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

1 个答案:

答案 0 :(得分:1)

首先,Redis并不沉重。它的安装和使用非常简单。您几乎不费力地完成并运行它。我强烈建议你尽可能地尝试一下。使用StackExchange.Redis,您可以使用简单,设计良好且广泛使用的C#-library来访问Redis服务器。

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

调用Specification后,您必须反序列化GET。 <{1}} - 对象不会将对象引用设置为或从中设置,因此它是副本。

Specification中,您可以存储所有ID。 您可以使用SET获取ID并通过SMEMBERS检索所有项目并将其反序列化为新对象。