- 客户端缓存
- 服务端缓存
- 网络中缓存
- 单体缓存
- 缓存集群
- 分布式缓存
可见,在软件系统中缓存几乎无处不在!nginx
一:提升用户体验web
二:提高系统性能(响应时间、延迟时间、吞吐量、并发用户数和资源利用率等..)这几个方面。算法
经过缓存机制来减小数据库链接资源的竞争和对数据库读的压力,那么就能够选择采用静态页面缓存,这样程序上能够不作修改,就能很好的减小对web服务器的压力以及减小对数据库链接资源的竞争。sql
一:客户端缓存:对于互联网一般来讲的是BS架构应用,能够分为页面缓存和浏览器缓存;对于移动互联网来讲,指的是APP自身所使用的缓存。数据库
页面缓存、浏览器缓存、APP上的缓存浏览器
二:网络中的缓存:位于客户端和服务端之间,对重复的请求返回缓存中的数据资源。同时接受服务端的请求,更新缓存中的内容。缓存
web代理缓存(Squid):支持创建复杂的缓存层级结构,拥有详细的日志,高性能缓存,支持多种插件。tomcat
边缘缓存(nginx):向用户提供静态内容。CDN服务器
三:服务端缓存:整个缓存的重头戏网络
数据库缓存:Mysql使用了查询缓冲机制,将select语句和查询结果放在缓冲区中,之后对一样的SQL语句,将直接从缓冲区中读取结果,节省查询时间,提升SQL查询的效率。
平台级缓存:EHCache,配置简单,结构清晰,功能强大
应用级缓存:经过代码实现缓存机制,Redis
- 首先用户的请求被负载均衡服务分发到Nginx上,此处经常使用的负载均衡算法是轮询或者一致性哈希,轮询可使服务器的请求更加均匀,而一致性哈希能够提高Nginx应用的缓存命中率。
- 接着,Nginx应用服务器读取本地缓存,实现本地缓存的方式能够是Lua脚本,若是本地缓存命中,则直接返回。Nginx本地缓存在对热点数据的反复读取问题上很是有效。
- 若是Nginx本地缓存没有命中,就会进一步读取响应的分布式缓存Redis,若是,命中,则返回数据,并写回到Nginx应用服务器本地缓存中。
- 若是Redis分布式缓存尚未命中的话,则会回溯到tomcat集群,可使用轮询或者一致性哈希算法,若是缓存命中则直接返回数据,并会同步写到主Redis集群,而后再同步到从Redis集群。
- 当全部缓存都没有命中,就会去查询数据库并返回,固然数据库也是有缓存的。
总体来看,这是一个使用了多级缓存的系统。Nginx应用服务器的本地缓存解决了热点数据的缓存问题。Redis分布式缓存集群减小了访问回溯率,Tomcat应用集群使用的平台级缓存防止了缓存失效、缓存雪崩以后的冲击,数据库缓存提高数据库查询时的效率。
参考书籍:深刻分布式缓存从原理到实战