srcache

Nginx 的缓存模块
授权协议 GPL
开发语言 C/C++
所属分类 服务器软件、 Nginx扩展模块
软件类型 开源软件
地区 国产
投 递 者 艾焱
操作系统 Linux
开源组织
适用人群 未知
 软件概览

我们知道,Nginx的核心设计思想是事件驱动的非阻塞I/O。Nginx被设计为可以配置I/O多路复用策略,在Unix系统中传统的多路复用是采用select或poll,但是这两个方法的问题是随着监听socket的增加,性能会下降,因为在linux内核中是采用轮询的方式判断是否可以触发事件,换句话说算法的复杂度为O(N),而在较新的linux内核中引入了复杂度为O(1)的epoll,因此Nginx在Linux下默认采用epoll,而在FreeBSD下默认采用kqueue作为I/O策略。

即便是这样,传统的缓存策略仍可能造成效率低下,因为传统上是通过PHP操作memcache的,要执行PHP代码,Nginx就必然要和FastCGI通信,同时也要进入PHP的生命周期,因此SAPI、PHP Core和Zend Engine的一系列逻辑会被执行。更糟糕的是,fpm和PHP可能会阻塞,因此破坏了Nginx的非阻塞性。(原文中此处表述有误,fastcgi与nginx进行同步通信,但并不会破坏nginx i/o的非阻塞性,多谢agentzh给予指正)下图展示了在memcache命中时整个处理过程。

可以看到,即使memcache命中,还是要进入PHP的生命周期。我们知道,目前很多互联网应用都使用RESTful规范进行设计,在RESTful应用下,普遍使用uri和查询参数作为缓存的key,因此一种更高效的缓存策略是Nginx直接访问memcache,并用$uri和$args等Nginx内置变量设定缓存key规则,这样,当缓存命中时,Nginx可以跳过通过fastcgi和PHP通信的过程,直接从memcache中获取数据并返回。memc-nginx和srcache-nginx正是利用这种策略提高了缓存的效率。下图是这种高效缓存策略的示意图(当memcache命中时)。

模块介绍

memc-nginxsrcache-nginx模块均为前淘宝工程师agentzh(章亦春)开发。其中memc模块扩展了Nginx标准的memcache模块,增加了set、add、delete等memcache命令,而srcache则是为location增加了透明的基于subrequest的缓存层。两者配合使用,可以实现上一节提到的高效缓存机制。关于两个模块的详细信息可以参考它们Nginx官网的wiki(memc wikisrcache wiki)页。

  • http://www.oschina.net/p/srcache memc-nginx和srcache-nginx模块均为前淘宝工程师agentzh(章亦春)开发。 nginx 图片缓存 http://blog.csdn.net/xiaolang85/article/details/38260117 配置nginx的图片服务器 http://www.cnblogs.com/jarrah/p/372

  • nginx_lua异步更新缓存 NGINX 一直使用nginx作为反向代理服务器,一来nginx基于事件驱动,速度快。而来nginx的反向代理模块能很好的支持页面缓存和负载均衡。 页面缓存 nginx有proxy_cache这个内置的缓存功能,是基于文件的。如果把缓存路径设置到RAMDISK上面,可以达到和内存缓存差不多的缓存读写速度。这样做虽然解决了文件读写慢的问题,但是如果分布式部署的时候,这

 相关资料
  • beego 的 cache 模块是用来做数据缓存的,设计思路来自于 database/sql,目前支持 file、memcache、memory 和 redis 四种引擎,安装方式如下: go get github.com/astaxie/beego/cache 如果你使用memcache 或者 redis 驱动就需要手工安装引入包 go get -u github.com/astaxie/be

  • 主要内容:1. 概述,2. Cache,3. CacheKey1. 概述 在优化系统性能时,优化数据库性能是非常重要的一个环节,而添加缓存则是优化数据库时最有效的手段之一。正确、合理地使用缓存可以将一部分数据库请求拦截在缓存这一层。 MyBatis 中提供了一级缓存和二级缓存,而这两级缓存都是依赖于基础支持层中的缓 存模块实现的。这里需要读者注意的是,MyBatis 中自带的这两级缓存与 MyBatis 以及整个应用是运行在同一个 JVM 中的,共享同一块堆

  • 在高频的业务场景下,我们可能会频繁的查询数据库获取业务数据,虽然有主键索引的加持,但也不可避免的对数据库性能造成了极大的考验。而对于这种 kv 的查询方式,我们可以很方便的通过使用 模型缓存 来减缓数据库的压力。本组件实现了 Model 数据自动缓存的功能,且当删除和修改模型数据时,自动删除和修改对应的缓存。执行累加、累减操作时,缓存数据自动进行对应累加、累减变更。 模型缓存暂时只支持 Redis

  • 7.11. 模板缓存 代码中有一个低效率的地方:每次显示一个页面,renderTemplate都要调用ParseFile。更好的做法是在程序初始化的时候对每个模板调用ParseFile一次,将结果保存为*Template类型的值,在以后使用。 首先,我们创建一个全局map,命名为templates。templates用于储存*Template类型的值,使用string索引。 然后,我们创建一个in

  • 是一个用sqlite查询实现的缓存接口,FlowQueryList, FlowCursorList,或者其他你想使用它的任何地方。 只要增加 cachingEnabled = true在你得@Table注解中就可以启用表的高速缓存。要启用类缓存多列@PrimaryKey,你必须定义一个@MultiCacheField对象(下文解释)。 当查询在数据库运行时,它将在缓存中存储模型的实例,并且缓存是一

  • 本文向大家介绍JavaScript版的TwoQueues缓存模型,包括了JavaScript版的TwoQueues缓存模型的使用技巧和注意事项,需要的朋友参考一下 本文所指TwoQueues缓存模型,是说数据在内存中的缓存模型。      无论何种语言,都可能需要把一部分数据放在内存中,避免重复运算、读取。最常见的场景就是JQuery选择器,有些Dom元素的选取是非常耗时的,我们希望能把这些数据缓

  • 我正在试着用mockito测试我的缓存层。 我用的是这里描述的咖啡因 基本上,我有这个... 这工作得很好,方法被缓存并且工作得很好。

  • 问题内容: 当我启用gomodules并构建go程序时,将下载所需的软件包。 但我不能找到他们或。 它们存储在哪里? 问题答案: 对于Go 1.11,它们存储在