在服务器端缓存JSON对象

sar*_*rat 4 api postgresql memcached json redis

我有一个服务器,其中包含要从移动客户端的API请求提供的数据.数据有点持久,更新频率非常低(比如一周一次).但是表格设计非常繁重,这使得API请求的缓慢提供

Web服务使用Yii + Postgre SQL实现.

  • 使用memcached是解决这个问题的一种方法吗?如果是,如果缓存的数据变脏,我该如何管理?
  • 对此有何替代解决方案?Postgre在MySQL中有像MEMORY这样的内置机制吗?
  • redis怎么样?

Jan*_*itz 12

您可以使用memcached,但是每个人都会遇到数据库服务器.在您的情况下,您说查询结果是持久性的,因此从Web服务缓存JSON响应可能更有意义.

这可以使用具有内置缓存的反向代理来完成.我想一个例子可能会帮助你最好地利用Jetty(Java)和NGINX来做到这一点:

在我们的设置中,我们有一个Jetty(Java)实例,为我们的移动客户端提供API.API正在侦听localhost:8080/api并返回从本地Mysql数据库上的某些查询获取的JSON结果.

此时,我们可以直接向我们的客户提供API,但这里是反向代理:

在API前面是一个NGINX网络服务器,从0.0.0.0:80/收听(无处不在,端口80)当移动客户端连接到0.0.0.0:80/api时,内置的反向代理尝试从中获取确切的查询字符串它的缓存.如果失败,则从localhost:8080/api获取它,将其放入缓存中并提供缓存中找到的新值.

优点:

  • 您可以使用其他NGINX好东西:自动GZIP压缩缓存的JSON文件
  • NGINX上的SSL端点终止.
  • 当你有更多的连接时,NGINX工作者可能会从中受益,所有这些都是从缓存中请求数据.
  • 您可以整合服务端点

考虑缓存失效:

你必须考虑缓存失效.您可以告诉NGINX保留它的缓存,例如,对于localhost:8080/api的所有HTTP 200请求持续一周,或者对所有其他HTTP状态代码持有1分钟.但是如果有时间,你想要在一周内更新API,缓存是无效的,所以你必须以某种方式删除它或将缓存时间调低到一小时或一天(这样大多数人都会点击高速缓存).

这就是我们所做的:当它是脏的时,我们选择删除缓存.我们在服务器上运行另一个JOB,监听通过Puppet触发的Update-API事件.JOB将负责为我们清除NGINX缓存.

另一个想法是在Web服务中添加清除缓存功能.我们决定不采用这种解决方案的原因是:Web服务必须知道它在反向代理之后运行,这会破坏关注点的分离.但我想说,这取决于你的计划.

另一件可以使您的Web服务更正确的事情是为每个JSON文件提供正确的ETAG和缓存过期标头.同样,我们没有这样做,因为我们有一个大的更新事件,而不是每个文件的小事件.

附注:

  • 您不必使用NGINX,但配置非常简单
  • NGINX和Apache都支持SSL
  • 还有着名的反向代理(https://www.varnish-cache.org),但据我所知它不会做SSL(但是?)

因此,如果您在Web Service + SSL前使用Varnish,您将使用如下配置:NGINX - > Varnish - > Web Service.

参考文献: - NGINX服务器:http://nginx.com - Varnish Reverse Proxy:https : //www.varnish-cache.org - Puppet IT Automation:https://puppetlabs.com - NGINX反向代理教程:http:/ /www.cyberciti.biz/faq/howto-linux-unix-setup-nginx-ssl-proxy/ http://www.cyberciti.biz/tips/using-nginx-as-reverse-proxy.html