Django 使用Redis作为RESTAPI的中间缓存

Django 使用Redis作为RESTAPI的中间缓存,django,rest,redis,Django,Rest,Redis,我们有一个iOS应用程序,它通过RESTAPI与django服务器对话。大多数数据由相当大的项对象组成,这些项对象涉及几个相关的模型,这些模型呈现到单个平面字典中,并且这些数据很少更改 我们发现,查询这一点对于Postgres来说不是问题,但是生成JSON响应需要花费大量的时间。另一方面,项目集合因用户而异 我考虑过一个渲染系统,我们只需为Item对象构建一个字典,并将其作为JSON字符串保存到redis中,这样我们就可以直接从redis提供API(例如HMGET(用户库中的items id),

我们有一个iOS应用程序,它通过RESTAPI与django服务器对话。大多数数据由相当大的项对象组成,这些项对象涉及几个相关的模型,这些模型呈现到单个平面字典中,并且这些数据很少更改

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

我考虑过一个渲染系统,我们只需为Item对象构建一个字典,并将其作为JSON字符串保存到redis中,这样我们就可以直接从redis提供API(例如HMGET(用户库中的items id),它速度很快,并且可以相对容易地重新生成“渲染实例”,基本上只有几个
post_save
信号


我想知道这个设计有多好,有没有什么主要的缺陷?也许有更好的方法来完成这项任务?

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

如果这是您第一次使用Redis,请记住几件事

专用Redis服务器
Redis是单线程的,应该部署在具有足够CPU能力的专用服务器上。不要错误地将其部署在应用程序或数据库服务器上

高可用性
使用主/从复制设置Redis以实现高可用性。我知道Redis已经取得了很多进展,所以您可能也希望为HA检查一下

缓存命中/未命中

在检查Redis的缓存“命中”时,如果连接已断开或出现任何异常,请不要使请求失败,只需默认数据库;缓存应始终是“尽最大努力”,因为数据库始终可以作为最后手段使用。

感谢您的提示!您的redis服务器上有什么样的负载?我们刚刚开始,到目前为止,似乎有一个EC2实例是enoughRedis将是您遇到瓶颈的最后一个地方。我们的redis服务器运行在RedHat Linux Enterprise上,具有1个双核CPU/4GB RAM;根据我们的测试,25K写入时间不到一秒,是基于有效负载(25-100Kb)读取时间的两倍Redis甚至连一根汗水都没有;它真是太棒了。json响应有多大?转储json需要多长时间?比如说,大约300个DICT,其中包含20个键,使用一些嵌套DICT,tastypie和django rest framework都会在MBPR1上渲染那些最多1s的DICT。你已经尝试使用cjson或ultra json了吗?是的,瓶颈不是json渲染,但从django模型到上述框架提供的字典实例的转换,我也不能只使用dict,因为涉及到许多转换