我想开始一个大型的CakePHP项目,性能将成为一个问题。我将有一个用户表作为树行为和许多与用户相关的财务数据。该应用程序将生成大量动态报告,聚合不同树节点的数据等。
由于github上有一个易于使用的库,它将模型的数据源设置为redis,我想知道将它用于整个应用程序是否是一个好主意?是否有人有过这方面的经验,如果我决定依赖redis作为主要/唯一的数据存储,可能会出现什么问题?
编辑:我已经安装了redis并试图将RedisModel用于两个简单关系HasMany / BelongsTo的模型。当我试图简单地使用像标准AppModels这样的模型 - 它根本不会工作(Redis错误:缺少键)。显然你不能以标准方式使用Model-> find Model-> save等。您必须使用redis方法(setKeyValue等)。这意味着分页和其他cakePHP期货也将无效。因此,对我的所有模型使用redisModel也许不是最好的想法......
答案 0 :(得分:5)
我不能特别代表CakePHP发言,但我会谈到一般的redis以及特别是你的问题的要点,它应该适用于你最终选择的框架。我们来看看:
你提到你想启动一个性能将成为问题的应用程序 - 我只是想提一下你应该小心你会假设你会需要一个nosql解决方案,因为这很难事先评估。 Redis是快速的,但是MySQL已被证明能够处理数百万条记录和操作,只要它已经正确配置和使用,并且如果你需要大量的关系结构,它会更简单。
关于Redis是主要且唯一的数据存储:
Redis对于这项工作非常稳定。 Instagram的 据报道,stored 300 million key-value pairs伪分片 使用哈希效果很好,虽然它不是唯一的数据 他们使用的存储系统,显示redis非常可靠。 这个网站(Stack Overflow)uses redis也广泛用于 缓存目的。
Redis也reported平均具有良好的连续正常运行时间(考虑到上述情况,这不应该令人惊讶)
存在减少停机问题的选项,replication在某种程度上得到支持,Redis Cluster即将推出以支持正确的分布式方法。
你可能面临的主要问题是没有正确理解它是怎样的 坚持有效。在开始之前,您应该完全阅读this和this文章,因为这一点非常重要。简而言之,redis不会立即将更改写入磁盘,这意味着根据您的配置,崩溃可能导致数据丢失,范围从上次磁盘写入后的几秒到几分钟。根据您的使用情况,这可能是也可能不是问题;如果数据非常敏感(即财务记录),您可能需要在跳转到redis之前三思而后行,或构建一个不专门使用redis而是与另一个存储系统结合使用的系统。
像redis这样的非关系数据存储中的关系结构意味着做更多的工作并经常复制/非规范化数据。它可以做到,但这是需要考虑的事情;在你的问题中,你提到你需要聚合数据来生成动态报告,你确定要使用redis吗?听起来像关系数据库会以非常小的性能成本为您提供更大的灵活性。如果你事先知道你需要对你的数据进行复杂的查询,那么除非你绝对需要,否则不要重新发明轮子是个好主意。
我的建议是首先要更好地了解redis是什么以及如何工作,可能会构建自己的模型,而不是依赖其他人来更好地理解可以做什么和不能做什么,并从那里评估你想要的地方接受。 Redis足够可靠,可以独立使用,但在一天结束时,使用正确的工具来做正确的工作是很聪明的,你可能会发现你的应用程序的一些东西可以很好地使用redis,而其他一些东西更适合使用redis。更传统的存储系统。