Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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
C# ServiceStack.Net Redis:存储相关对象与相关对象ID_C#_.net_Redis_<img Src="//i.stack.imgur.com/WM7S8.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">servicestack - Fatal编程技术网 servicestack,C#,.net,Redis,servicestack" /> servicestack,C#,.net,Redis,servicestack" />

C# ServiceStack.Net Redis:存储相关对象与相关对象ID

C# ServiceStack.Net Redis:存储相关对象与相关对象ID,c#,.net,redis,servicestack,C#,.net,Redis,servicestack,我的团队决定通过ServiceStack.net Redis客户端与Redis合作,作为我们正在开发的一个新的高容量网站的基础存储库。我真的不确定在哪里可以找到这个问题的文档(无论是一般的Redis文档还是特定的ServiceStack.Net文档,或者两者兼而有之)——关于如何通过ServiceStack.Net实现Redis的文档是否有明确的来源,其中包括您需要了解的关于Redis概念和ServiceStack.Net概念的所有信息,还是我们需要分别从这两个方面整合文档以获得完整的信息 我只

我的团队决定通过ServiceStack.net Redis客户端与Redis合作,作为我们正在开发的一个新的高容量网站的基础存储库。我真的不确定在哪里可以找到这个问题的文档(无论是一般的Redis文档还是特定的ServiceStack.Net文档,或者两者兼而有之)——关于如何通过ServiceStack.Net实现Redis的文档是否有明确的来源,其中包括您需要了解的关于Redis概念和ServiceStack.Net概念的所有信息,还是我们需要分别从这两个方面整合文档以获得完整的信息

我只是想弄清楚如何在模型的对象图中准确地存储相关对象。下面是一个我想处理的简单场景:

系统中有两个对象:
User
Feed
。在RDBMS术语中,这两个对象具有一对多关系,即
用户
具有
提要
对象的集合,提要只能属于一个
用户
。提要将始终通过其用户从Redis访问,但偶尔我们希望通过提要实例访问该用户

所以我的问题是,我们是应该将相关对象存储为属性,还是应该存储相关对象的
Id
值?举例说明:

接近A

public class User
{
    public User()
    {
        Feeds = new List<Feed>();
    }

    public int Id { get; set; }

    public List<Feed> Feeds { get; set; }

    // Other properties
}

public class Feed
{
    public long Id { get; set; }

    public User User { get; set; }
}
public class User
{
    public User()
    {
        FeedIds = new List<long>();
    }

    public long Id { get; set; }

    public List<long> FeedIds { get; set; } 

    public List<Feed> GetFeeds()
    {
        return repository.GetFeeds( FeedIds );
    }
}

public class Feed
{
    public long Id { get; set; }

    public long UserId { get; set; }

    public User GetUser()
    {
        return repository.GetUser( UserId );
    }
}
公共类用户
{
公共用户()
{
feed=新列表();
}
公共int Id{get;set;}
公共列表提要{get;set;}
//其他属性
}
公共类提要
{
公共长Id{get;set;}
公共用户{get;set;}
}
方法B

public class User
{
    public User()
    {
        Feeds = new List<Feed>();
    }

    public int Id { get; set; }

    public List<Feed> Feeds { get; set; }

    // Other properties
}

public class Feed
{
    public long Id { get; set; }

    public User User { get; set; }
}
public class User
{
    public User()
    {
        FeedIds = new List<long>();
    }

    public long Id { get; set; }

    public List<long> FeedIds { get; set; } 

    public List<Feed> GetFeeds()
    {
        return repository.GetFeeds( FeedIds );
    }
}

public class Feed
{
    public long Id { get; set; }

    public long UserId { get; set; }

    public User GetUser()
    {
        return repository.GetUser( UserId );
    }
}
公共类用户
{
公共用户()
{
FeedIds=新列表();
}
公共长Id{get;set;}
公共列表feedId{get;set;}
公共列表GetFeeds()
{
返回repository.GetFeeds(feedid);
}
}
公共类提要
{
公共长Id{get;set;}
公共长用户标识{get;set;}
公共用户GetUser()
{
返回repository.GetUser(UserId);
}
}
以上哪种方法最有效?我在不同的例子中看到了这两种方法,但我得到的印象是,我看到的一些例子可能不是最佳实践

几个简单的相关问题:

  • 如果我对某个对象进行更改,它会自动反映在Redis中还是需要保存?我假设是后者,但需要绝对清楚
  • 如果我(可以)使用方法A,对用户对象X的更新是否会反映在整个对象图中,无论它在何处被引用,还是有必要在整个对象图中保存更改
  • 通过对象的接口存储对象是否有问题(即使用
    IList
    而不是
    List

抱歉,如果这些问题有点基本的话——直到两周前,我还没有听说过Redis——更不用说ServiceStack了(我的团队中也没有任何人)因此,我们真的从零开始…

与其重新散列大量其他野外文档,我将列出一些关于Redis+ServiceStack的Redis客户端的背景信息:

没有魔法——Redis是一块空白画布 首先我想指出,使用Redis作为数据存储只是提供了一个空白画布,它本身没有任何相关实体的概念。也就是说,它只提供对分布式comp sci数据结构的访问。关系的存储方式最终取决于客户机驱动程序(即ServiceStack C#Redis client)或者应用开发者,使用Redis的原始数据结构操作。由于所有主要的数据结构都是在Redis中实现的,您基本上可以完全自由地选择如何构造和存储数据

思考如何在代码中构建关系 因此,考虑如何在Redis中存储数据的最佳方式是完全忽略数据如何存储在RDBMS表中,而考虑数据如何存储在代码中,即使用内存中内置的C#collection类——Redis通过其服务器端数据结构反映了这些类的行为

尽管没有相关实体的概念,但Redis内置的集合SortedSet数据结构提供了存储索引的理想方式。例如,Redis的集合最多只存储元素的一次出现。这意味着您可以安全地向其中添加项/键/ID,而不必关心该项是否存在xists已经作为最终结果将是相同的,如果您调用它1或100次,即它是幂等的,并且最终只有1个元素保留在集合中。因此,在存储对象图(聚合根)时,一个常见的用例是在每次保存模型时将子实体ID(也称外键)存储到集合中

可视化数据 为了更好地可视化实体在Redis中的存储方式,我建议安装与ServiceStack的C#Redis客户端配合良好的,因为它使用下面的键命名约定来提供一个良好的分层视图,将键入的实体分组在一起(尽管所有键都存在于同一全局键空间中)

要查看和编辑实体,请单击“编辑”链接查看并修改所选实体的内部JSON表示。希望您能够在看到模型的存储方式后,对如何设计模型做出更好的决策

POCO/实体的存储方式 C#Redis客户端与任何具有单个主键的POCO一起工作,默认情况下,主键应为
Id
(尽管有此约定)。 基本上,POCOs以序列化JSON的形式存储在Redis中,其中包含
typeof(Poco).Name
Id
,用于为该实例形成唯一密钥。例如:

urn:Poco:{Id} => '{"Id":1,"Foo":"Bar"}'
POCOs在th