2013-04-24 70 views
11

我们有一个iOS应用通过REST API与django服务器通信。大部分数据由相当大的Item对象组成,这些对象涉及一些呈现为单个平面字典的相关模型,而且这些数据很少会发生变化。使用Redis作为REST API的中介缓存

我们发现,查询这对Postgres不是问题,但生成JSON响应需要花费大量的时间。另一方面,项目收集因人而异。

我想到了一个渲染系统,我们只需为Item对象创建一个字典并将其保存为redis作为JSON字符串,这样我们就可以直接从redis服务API(例如HMGET(用户库中的项目ID)),这是很快的,并使得它更容易重新生成“渲染的实例”,基本上只有post_save信号

我不知道这个设计有多好,是否有任何主要缺陷?也许有更好的方法任务?

+0

json响应有多大以及转储json需要多长时间? – 2013-04-25 08:43:25

+0

说大约300个字符与他们的20个键与一些嵌套的字典,tastypie和django-rest-framework渲染那些在MBPr – 2013-04-25 08:57:45

+0

上的长达1秒你是否尝试过使用cjson或ultra json? – 2013-04-25 09:04:58

回答

16

当然,我们在我们公司也这样做,使用Redis来存储不是JSON,而是存储从后端数据库为RESTful请求生成的大型XML字符串,并且它可以节省大量网络跳跃和开销。

有几件事情要记住,如果这是你使用Redis的第一次...

专用的Redis服务器
的Redis是单线程的,应在专用服务器上进行部署足够的CPU功率。不要在将它部署到您的应用程序或数据库服务器上时发生错误。

高可用性
使用主/从复制设置Redis以实现高可用性。我知道Redis cluster已经取得了很多进展,所以你可能也想看看HA也是如此。

缓存命中/缺失
当检查Redis的一个高速缓存“命中”,如果连接是死亡或出现任何异常,不失败的请求,只是默认的数据库;缓存应该始终是“尽力而为”,因为数据库总是可以作为最后的手段使用。

+0

感谢您的提示!你的Redis服务器有什么样的负载?我们刚刚开始,到目前为止,它看起来像一个EC2实例就足够了 – 2013-04-24 19:30:07

+0

Redis将是您遇到瓶颈的最后一个地方。我们的redis服务器在RedHat Linux Enterprise上运行,具有1个双核CPU/4GB RAM;根据我们的测试,25K根据我们的有效载荷(25-100Kb)读取第二次和第二次读取,而Redis甚至没有出汗;它完全踢屁股。 – raffian 2013-04-24 19:39:36