当前位置: 首页 > 面试题库 >

这是ServiceStack REST API上Redis的一个好用例吗?

祖奇
2023-03-14
问题内容

我正在创建一个移动应用程序,它需要一个API服务后端才能获取/输入每个用户的信息。我将在ServiceStack上开发Web服务,但想知道存储。我喜欢像Redis这样的快速内存缓存系统的想法,但是我有几个问题:

  1. 我创建了一个示例架构,说明了数据存储的外观。相对于MySQL DB或类似的东西,这似乎是使用Redis的一个好案例吗?

架构http://www.miles3.com/uploads/redis.png

  1. 将Redis存储持久保存到磁盘的设置有多困难,或者在写入存储时是内置的?(我是NoSQL方面的新手)

  2. 我目前使用Linux微型实例在AWS上进行设置(因为一年免费)。我知道这个答案有很多因素,但是总的来说,这足以满足我的Web服务和Redis的需求吗?由于Redis处于内存中,这就足够了吗?我想如果我的移动应用程序飞速发展(嘿,我们可以做梦吗?),那么我将开始达到实例的极限。


问题答案:

设计NoSQL Redis应用程序时的注意事项

1)为了在Redis中正确开发,您应该更多地考虑如何构造C#程序中的关系,即使用C#集合类,而不是用于RDBMS的关系模型。更好的思路是更多地考虑像文档数据库这样的数据存储,而不是RDBMS表。本质上,所有内容都通过键(索引)在Redis中泛滥,因此您只需要弄清楚将保留在其自己的“键名称空间”中的主要实体(即聚合根)是什么,或者它是否是非主要实体,即元数据应仅保留其父实体。

Redis作为主要数据存储的示例

这是一篇很好的文章,介绍了使用Redis创建一个简单的博客应用程序的过程:

http://www.servicestack.net/docs/redis-client/designing-nosql-
database

基本上,您需要分别存储和获取每种类型的项目。

var redisUsers = redis.As<User>();
var user = redisUsers.GetById(1);
var userIsWatching = redisUsers.GetRelatedEntities<Watching>(user.Id);

您存储实体之间关系的方式是利用Redis的集合,例如:您可以使用以下方式从概念上存储“用户/观察者”关系:

SET["ids:User>Watcher:{UserId}"] = [{watcherId1},{watcherId2},...]

Redis是无架构且幂等的

将id存储到redis集是幂等的,即,您可以多次将 watcherId1
添加到同一set中,并且只会出现一次。这很不错,因为它意味着您不需要检查关系的存在,并且可以自由地添加相关ID,就像它们从未存在过一样。

相关:写入或读取不存在的Redis集合(例如,列表)与写入空集合相同,即,当您在访问非Redis集合时将一个项目添加到列表时,即刻创建列表现有列表将仅返回0个结果。这是无摩擦且生产率高的胜利,因为您无需预先定义架构即可使用它们。尽管您需要Redis提供EXISTS操作来确定键是否存在或TYPE操作,所以您可以确定其类型。

在您的文章上创建您的关系/索引

要记住的一件事是,由于Redis中没有隐式索引,因此通常需要设置在写入过程中读取自己所需的索引/关系。基本上,您需要预先考虑所有查询要求,并确保在编写时设置必要的关系。上面的RedisStackOverflow源代码是一个很好的例子,展示了这一点。

注意:ServiceStack.Redis C#提供程序假定您有一个称为 Id 的唯一字段,它是其主键。您可以使用
ModelConfig.Id() 配置映射将其配置为使用其他字段。

Redis持久性

2)Redis支持开箱即用的RDB和仅附加文件(AOF)两种类型的持久性模式。RDB编写例行快照,而“仅追加文件”的作用就像一个事务日志,记录了快照之间的所有更改-
我建议同时添加这两个快照,直到您对每个快照的功能和应用程序的需求感到满意为止。您可以在http://redis.io/topics/persistence上阅读所有Redis持久性。

注意Redis还支持琐碎的复制,您可以在以下位置了解更多信息:http :
//redis.io/topics/replication

Redis喜欢RAM

3)由于Redis主要在内存中运行,因此最重要的资源是您有足够的RAM来将整个数据集保存在内存中,还有一个用于快照到磁盘的缓冲区。Redis的效率很高,因此即使是很小的AWS实例也可以处理很多负载-
您要查找的是拥有足够的RAM。

使用Redis Admin UI可视化数据

最后,如果您使用的是ServiceStack
C#Redis客户端,我建议您安装Redis
Admin
UI,该UI可以很好地显示您的实体。您可以在以下位置查看其实时演示:http
:
//servicestack.net/RedisAdminUI/AjaxClient/



 类似资料:
  • 2015年2月,当我最初问这个问题时,链接问题中报告的行为是违反直觉的,尽管规范允许(尽管文档中存在一些小的不一致)。 然而,塔吉尔·瓦列夫在2015年6月提出了一个新问题,我认为他清楚地证明了这个问题中报告的行为实际上是一个bug。Brain Goetz回答了他的问题,并承认,当由一个终端操作触发时,在上不停止

  • 我正在移动我的网站到另一个主机,因为它缺乏支持,从星期六起就不运作了。 在新的主机上,我的网站将一些字符显示为带有问号()的黑色菱形,而不是正确的符号(á,ç,è,等等) 它是使用phpadmin导入的,并且映射字符集被设置为UTF-8 null 谢谢

  • 问题内容: 我是Redis的新手(在托管服务中使用它),并希望将其用作列表的演示/沙箱数据存储。 我使用以下代码。这个对我有用。但是,对于具有几个(最多100个)并发用户(用于少量数据-最多1000个列表项)的小型网站,这是否有效(并非完全不作弊)? 我正在使用静态连接和像这样的静态redisclient类型列表: 这样做,我有一个非常容易使用的持久性数据列表,这正是我在构建/演示应用程序基本块时

  • 为了保存数据,我将使用一个SET操作,即: 然后,为了更新数据,我将使用两个操作(GET+SET),即: 选项2:单值多键 我对方案1的赞成/反对意见 备选方案1优点: 更好的数据库组织,因为每个用户只有一个密钥 通过一个GET操作,我将拥有所有JSON数据 要更新所有JSON字段,我将只使用两个操作(GET+SET) 数据库的文件大小将更小 null 如果希望并发修改JSON负载(非原子读取-修

  • 问题内容: 首先,我必须说我对API java.util.concurrent很陌生,所以也许我正在做的事情是完全错误的。 我想怎么办? 我有一个Java应用程序,它基本上运行2个单独的处理(称为 myFirstProcess , mySecondProcess ),但是这些处理必须同时运行。 因此,我尝试这样做: myFirstProcess 和 mySecondProcess 是实现的类,它们

  • 根据定义(维基百科)-租户是一组用户,他们以特定的特权共享对软件实例的公共访问,术语“软件多租户”指的是一种软件体系结构,其中一个软件实例运行在一台服务器上并为多个租户服务。它还指出,对于多租户体系结构,软件应用程序被设计为向每个租户提供实例的专用共享--包括其数据、配置、用户管理、租户个人功能和非功能属性。 从定义来看,我理解多租户更多地是从架构的角度出发的,在Google drive的情况下,