我正在创建一个移动应用程序,它需要一个API服务后端来获取/放置每个用户的信息.我将在ServiceStack上开发Web服务,但对存储感到疑惑.我喜欢像Redis这样快速内存缓存系统的想法,但我有几个问题:
我创建了一个我的数据存储应该是什么样子的示例模式.这似乎是使用Redis而不是MySQL DB或类似的东西的好例子吗?
schema http://www.miles3.com/uploads/redis.png
将Redis存储持久化到磁盘的设置有多难,或者在您对商店进行写入时是否内置?(我是这个NoSQL东西的新手)
我目前在AWS上使用Linux微实例进行设置(因为它可以免费使用一年).我知道这个答案有很多因素,但总的来说这对我的网络服务和Redis来说已经足够了吗?因为Redis在内存中就够了吗?我想如果我的移动应用程序飙升(嘿,我们可以做梦吧?)那么我将开始触及实例的天花板.
mythz.. 29
1)要在Redis中正确开发,您应该更多地思考如何在C#程序中构建关系,即使用C#集合类而不是用于RDBMS的关系模型.更好的思维方式是更多地考虑数据存储,如文档数据库而不是RDBMS表.基本上所有东西都通过密钥(索引)在Redis中被破坏,因此您只需要弄清楚您的主要实体(即聚合根)将保留在其自己的"密钥命名空间"中,或者它是否是非主要实体,即简单应该只与其父实体持久化的元数据.
这是一篇很好的文章,介绍如何使用Redis创建一个简单的博客应用程序:
http://www.servicestack.net/docs/redis-client/designing-nosql-database
您还可以使用Redis 查看RedisStackOverflow的源代码,以获取另一个真实示例.
基本上,您需要分别存储和获取每种类型的项目.
var redisUsers = redis.As(); var user = redisUsers.GetById(1); var userIsWatching = redisUsers.GetRelatedEntities (user.Id);
存储实体之间关系的方式是使用Redis的集合,例如:您可以在概念上存储用户/观察者关系:
SET["ids:User>Watcher:{UserId}"] = [{watcherId1},{watcherId2},...]
将id存储到redis集中是幂等的,即你可以多次将watcherId1添加到同一个集合中,并且它只会出现一次.这很好,因为这意味着你不需要检查关系的存在,并且可以自由地添加相关的id,就像它们从未存在过一样.
相关:写入或读取不存在的Redis集合(例如List)与写入空集合相同,即当您在访问非列表时将项目添加到列表时,即时创建列表现有列表只会返回0结果.这是一个无摩擦和生产力的胜利,因为您不必预先定义您的模式以便使用它们.虽然您需要Redis提供EXISTS操作来确定密钥是否存在或TYPE操作,以便您可以确定其类型.
要记住的一件事是因为Redis中没有隐式索引,您通常需要设置在写入期间自己阅读所需的索引/关系.基本上,您需要预先考虑所有查询要求,并确保在写入时设置必要的关系.上面的RedisStackOverflow源代码就是一个很好的例子.
注意:ServiceStack.Redis C#提供程序假定您有一个名为Id的唯一字段作为其主键.您可以将其配置为使用ModelConfig.Id()配置映射的其他字段.
2)Redis支持2种类型的持久性模式,即开箱即用的RDB和仅附加文件(AOF).RDB写程序的快照,同时追加唯一的文件就像一个事务日志记录所有的变化之间的快照行为-我建议什么做每一个都增加,直到你的舒适和你的应用需求.您可以在http://redis.io/topics/persistence上阅读所有Redis持久性.
注意Redis还支持简单复制,您可以在http://redis.io/topics/replication上阅读更多信息
3)由于Redis主要在内存中运行,因此最重要的资源是你有足够的RAM来保存内存中的整个数据集+一个用于快照到磁盘的缓冲区.Redis非常高效,因此即使是一个小型AWS实例也能够处理大量负载 - 您想要寻找的是拥有足够的RAM.
最后,如果您使用的是ServiceStack C#Redis客户端,我建议您安装Redis Admin UI,它可以提供实体的视觉效果.您可以在以下网址看到它的现场演示:http: //servicestack.net/RedisAdminUI/AjaxClient/
1)要在Redis中正确开发,您应该更多地思考如何在C#程序中构建关系,即使用C#集合类而不是用于RDBMS的关系模型.更好的思维方式是更多地考虑数据存储,如文档数据库而不是RDBMS表.基本上所有东西都通过密钥(索引)在Redis中被破坏,因此您只需要弄清楚您的主要实体(即聚合根)将保留在其自己的"密钥命名空间"中,或者它是否是非主要实体,即简单应该只与其父实体持久化的元数据.
这是一篇很好的文章,介绍如何使用Redis创建一个简单的博客应用程序:
http://www.servicestack.net/docs/redis-client/designing-nosql-database
您还可以使用Redis 查看RedisStackOverflow的源代码,以获取另一个真实示例.
基本上,您需要分别存储和获取每种类型的项目.
var redisUsers = redis.As(); var user = redisUsers.GetById(1); var userIsWatching = redisUsers.GetRelatedEntities (user.Id);
存储实体之间关系的方式是使用Redis的集合,例如:您可以在概念上存储用户/观察者关系:
SET["ids:User>Watcher:{UserId}"] = [{watcherId1},{watcherId2},...]
将id存储到redis集中是幂等的,即你可以多次将watcherId1添加到同一个集合中,并且它只会出现一次.这很好,因为这意味着你不需要检查关系的存在,并且可以自由地添加相关的id,就像它们从未存在过一样.
相关:写入或读取不存在的Redis集合(例如List)与写入空集合相同,即当您在访问非列表时将项目添加到列表时,即时创建列表现有列表只会返回0结果.这是一个无摩擦和生产力的胜利,因为您不必预先定义您的模式以便使用它们.虽然您需要Redis提供EXISTS操作来确定密钥是否存在或TYPE操作,以便您可以确定其类型.
要记住的一件事是因为Redis中没有隐式索引,您通常需要设置在写入期间自己阅读所需的索引/关系.基本上,您需要预先考虑所有查询要求,并确保在写入时设置必要的关系.上面的RedisStackOverflow源代码就是一个很好的例子.
注意:ServiceStack.Redis C#提供程序假定您有一个名为Id的唯一字段作为其主键.您可以将其配置为使用ModelConfig.Id()配置映射的其他字段.
2)Redis支持2种类型的持久性模式,即开箱即用的RDB和仅附加文件(AOF).RDB写程序的快照,同时追加唯一的文件就像一个事务日志记录所有的变化之间的快照行为-我建议什么做每一个都增加,直到你的舒适和你的应用需求.您可以在http://redis.io/topics/persistence上阅读所有Redis持久性.
注意Redis还支持简单复制,您可以在http://redis.io/topics/replication上阅读更多信息
3)由于Redis主要在内存中运行,因此最重要的资源是你有足够的RAM来保存内存中的整个数据集+一个用于快照到磁盘的缓冲区.Redis非常高效,因此即使是一个小型AWS实例也能够处理大量负载 - 您想要寻找的是拥有足够的RAM.
最后,如果您使用的是ServiceStack C#Redis客户端,我建议您安装Redis Admin UI,它可以提供实体的视觉效果.您可以在以下网址看到它的现场演示:http: //servicestack.net/RedisAdminUI/AjaxClient/