Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是redis';s返回一个副本或引用的值_Redis_C# 3.0 - Fatal编程技术网

是redis';s返回一个副本或引用的值

是redis';s返回一个副本或引用的值,redis,c#-3.0,Redis,C# 3.0,我听说过redis,但它对我的项目来说太重了。我决定自己写一些对象缓存,如下所示: private List<Specification> _lsSpecification...// the object need cache, I will use R/W lock to protect it try { RWLock.EnterReadLock(); // do anything about _ls

我听说过redis,但它对我的项目来说太重了。我决定自己写一些对象缓存,如下所示:

private List<Specification> _lsSpecification...// the object need cache, I will use R/W lock to protect it
        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 ;
    }
确切地说,我想要得到的是一个指定的“规范”对象或整个列表。因此,我将方法编码如下:

private List<Specification> _lsSpecification...// the object need cache, I will use R/W lock to protect it
        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 ;
    }
公共规范getSpecification(int-id)
{
RWLock.EnterReadLock();
Specification Specification=\lsSpecification.Find(c=>c.ID==ID).Clone;//假设存在克隆方法
RWLock.exitradlock();
退货规格;
}
公共列表getSpecifications()
{
RWLock.EnterReadLock();
List lsAll=lsuspecification.ToList();
RWLock.exitradlock();
返回lsAll;
}

如上所示,我调用这些方法来获取对象,然后使用其复制值,它必须是安全的。但我仍然觉得抄袭是一种浪费。我想知道redis是否可以返回一个对象或列表,如果可以的话,值就是一个副本或引用?

首先,redis一点也不重。它的安装和使用非常简单。您将毫不费力地启动并运行它。我强烈鼓励你尽可能尝试一下。有了它,您就有了一个简单、设计良好且广泛使用的C#库来访问您的Redis服务器

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

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

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