系统架构设计中,如何在不同层级中进行数据缓存

商城系统,用户请求,每次都从服务器读取,服务器io瓶颈,大大地限制了系统的性能。我们可以把数据缓存起来,以此来提升系统性能。

那什么数据需要缓存?

  • 静态数据:很少变化,读的次数远远大于写,比如模版文件、Js文件、用户的基础资料。
  • 热点数据:访问量很大,访问频率很高,比如秒杀活动的信息、销售排行榜等。

Web应用架构图

系统架构设计中,如何在不同层级中进行数据缓存

在架构中,不同层级间都可以使用缓存,以此来加速访问。

  • 客户端缓存:Local Storage
  • 客户端和Web服务器间缓存:CDN
  • Web服务缓存:Nginx的Proxy_Cache
  • 应用服务缓存:服务本地缓存(Guava Cache/Ehcache/Caffeine)、分布式缓存(Redis/Memcache)

系统架构设计中,如何在不同层级中进行数据缓存

1、客户端缓存

这里是离用户最近的地方,也是缓存的最佳选择。

  • 静态文件,比如页面的模板文件、Js文件、CSS样式文件、图片等静态文件,我们一个版本发布,到下次发布新版本前,都是不会改变的,这类文件,缓存的性价比是最高的,而且使用文件内容md5值作为名称的后缀,以确保不同版本发布,文件可以读取到对应版本的文件。
  • 很少变化的数据,比如用户信息,用户修改后,基本不会变化了,每次进入用户中心,没必要每次都要去读取api接口获取数据,可以把用户数据存储到Local Storage中;还有,一些活动的基础信息,活动发布后,基本不会去编辑修改,这时我们也可以存储到Local Stroage中。如果遇到数据变化了,比如在PC端修改了用户头像,在手机端看不到最新到头像,我们可以给这些数据定个有效期,过期到数据,重新读取接口。

2、CDN

我们服务器的带宽有限,比如只有10M,那么大量的用户来访问站点,很快就会把带宽用完。我们去升级带宽到100M,费用又很高,对应一个商城来说,不可能一整天都那么大用户量来访问,这会造成成本的浪费。CDN供应商会在全国布局机房,它把静态资源(JS脚本、CSS、图片、视频)缓存到离用户最近到机房,只有机房没有这些资源的时候,才会去我们的服务器拉取,直到缓存到期。这样就大大缓解我们服务器带宽的压力。

3、Nginx的Proxy_Cache

商城的很多动态数据,都是读取次数远远大于写次数。比如商品详情,用户评论等,使用proxy_cache,根据请求的url把API接口的数据缓存在Nginx中,用户读取,直接在nginx返回数据,不用每次请求都去应用服务从数据库读取数据,这样大大的提升了系统的相应速度。

4、后端缓存

考虑到数据库服务器io瓶颈,缓解数据库压力,把一些热点的数据缓存到应用服务器本地缓存中(一级缓存),本地缓存没有命中,读取分布式缓存到数据(二级缓存),这样分级缓存,很大程度上缓解数据库的压力。

5、缓存策略

系统出现的bug,一定程度是缓存不当导致的。

  • 比如JS脚本、CSS没有更新到最新版本,我们可以使用文件md5作为文件名称后缀来避免。
  • nginx的proxy_cache代理缓存,根据不同api接口运用场景,设置不同的缓存过期时间;在后台编辑数据的时候,也可以主动地去清理代理缓存,这时需要注意代理缓存的key设定,避免清理不到对应的缓存。
  • 后端缓存,一级缓存、二级缓存,也需要设置不同的缓存过期时间,后台编辑数据的时候,根据需要,也可以主动地去清理缓存,这时要主要先清理二级缓存,再清理一级缓存;如果先清理一级缓存,再清理二级缓存,会导致一级缓存读取二级缓存时,是旧的数据。

您可能还会对下面的文章感兴趣: