深入分布式缓存从原理到实战之无处不在的缓存

深入分布式缓存从原理到实战之无处不在的缓存_第1张图片

缓存分类

一.按照所处位置来分:

  • 客户端缓存
  • 服务端缓存
  • 网络中缓存

二.按照规模和部署方式来分:

  • 单体缓存
  • 缓存集群
  • 分布式缓存

可见,在软件系统中缓存几乎无处不在!

为什么去使用缓存

一:提高用户体验

二:提升系统性能(响应时间、延迟时间、吞吐量、并发用户数和资源利用率等..)这几个方面。

通过缓存机制来减少数据库连接资源的竞争和对数据库读的压力,那么就可以选择采用静态页面缓存,这样程序上可以不做修改,就能很好的减少对web服务器的压力以及减少对数据库连接资源的竞争。

缓存介绍

一:客户端缓存:对于互联网通常来说的是BS架构应用,可以分为页面缓存和浏览器缓存;对于移动互联网来说,指的是APP自身所使用的缓存。

页面缓存、浏览器缓存、APP上的缓存

二:网络中的缓存:位于客户端和服务端之间,对重复的请求返回缓存中的数据资源。同时接受服务端的请求,更新缓存中的内容。

web代理缓存(Squid):支持建立复杂的缓存层级结构,拥有详细的日志,高性能缓存,支持多种插件。

边缘缓存(nginx):向用户提供静态内容。CDN

三:服务端缓存:整个缓存的重头戏

数据库缓存:Mysql使用了查询缓冲机制,将select语句和查询结果放在缓冲区中,以后对同样的SQL语句,将直接从缓冲区中读取结果,节省查询时间,提高SQL查询的效率。

平台级缓存:EHCache,配置简单,结构清晰,功能强大

应用级缓存:通过代码实现缓存机制,Redis

多级缓存流程

深入分布式缓存从原理到实战之无处不在的缓存_第2张图片

  • 首先用户的请求被负载均衡服务分发到Nginx上,此处常用的负载均衡算法是轮询或者一致性哈希,轮询可以使服务器的请求更加均匀,而一致性哈希可以提升Nginx应用的缓存命中率。
  • 接着,Nginx应用服务器读取本地缓存,实现本地缓存的方式可以是Lua脚本,如果本地缓存命中,则直接返回。Nginx本地缓存在对热点数据的反复读取问题上非常有效。
  • 如果Nginx本地缓存没有命中,就会进一步读取响应的分布式缓存Redis,如果,命中,则返回数据,并写回到Nginx应用服务器本地缓存中。
  • 如果Redis分布式缓存还没有命中的话,则会回溯到tomcat集群,可以使用轮询或者一致性哈希算法,如果缓存命中则直接返回数据,并会同步写到主Redis集群,然后再同步到从Redis集群。
  • 当所有缓存都没有命中,就会去查询数据库并返回,当然数据库也是有缓存的。

整体来看,这是一个使用了多级缓存的系统。Nginx应用服务器的本地缓存解决了热点数据的缓存问题。Redis分布式缓存集群减少了访问回溯率,Tomcat应用集群使用的平台级缓存防止了缓存失效、缓存雪崩之后的冲击,数据库缓存提升数据库查询时的效率。

参考书籍:深入分布式缓存从原理到实战

转载于:https://my.oschina.net/u/3995125/blog/3093212

你可能感兴趣的:(深入分布式缓存从原理到实战之无处不在的缓存)