高并发系统设计十-数据库成为瓶颈后,动态数据的查询如何加速(引入缓存)

缓存:数据库成为瓶颈后,动态数据的查询如何加速

在高并发大流量下,数据库层的演进过程、分库分表设计上的分析,基本可以支持十几万的 DAU (DAU(Daily Active User)日活跃用户数量)了。但是随着并发的增加,存储数据量的增多,数据库的磁盘 IO 逐渐成了系统的瓶颈,这个时候就需要使用缓存,来降低请求响应时间,提升系统的性能。

1、缓存的定义

存储数据的组件,作用是让对数据的请求更快地返回。

我们使用内存作为还贷存储介质相比较以磁盘作为主要存储介质的数据库来说,性能上会提高多个数量级,同时也能够支撑更高的并发量,所以内存是常用的一种缓存数据的介质。

2、缓存的分类

常见的缓存主要就是静态缓存、分布式缓存、热点本地缓存

2.1、静态缓存

静态缓存在 Web 1.0 时期是非常著名的,它一般通过生成 Velocity 模板或者静态 HTML 文件来实现静态缓存,在 Nginx 上部署静态缓存可以减少对于后台应用服务器的压力。

比如做内容管理系统时,后台录入很多文章,前台在网站上展示文章内容,像新浪、网易这类门户网站。

每篇文章在录入的时候渲染成静态页面,放置在所有的前端 Nginx 或者 Squid 等 Web 服务器上,这样用户在访问的时候会优先访问 Web 服务器上的静态页面。

2.2、分布式缓存

Memcached、Redis 就是分布式缓存

2.3、热点本地缓存

热点本地缓存主要部署在应用服务器的代码中,用于阻挡热点查询对于分布式缓存节点或者数据库的压力。

那么我们会在代码中使用一些本地缓存方案,如 HashMap,Guava Cache 或者是 Ehcache 等,它们和应用程序部署在同一个进程中,优势是不需要跨网络调度,速度极快,所以可以用来阻挡短时间内的热点查询。

由于本地缓存是部署在应用服务器中,而我们应用服务器通常会部署多台,当数据更新时,我们不能确定哪台服务器本地中了缓存,更新或者删除所有服务器的缓存不是一个好的选择,所以我们通常会等待缓存过期。因此,这种缓存的有效期很短,通常为分钟或者秒级别,以避免返回前端脏数据。

3、缓存的优势劣势

  • 缓存比较适合于读多写少的业务场景,并且数据最好带有一定的热点属性,数据有热点属性时才能保证一定的缓存命中率

  • 缓存会给整体系统带来复杂度,并且会有数据不一致的风险

    在更新数据库成功,更新缓存失败的情况下,缓存中就会存在脏数据,对于这类问题,可以使用较短的过期时间或者手动清理的方式来解决

  • 之前提到缓存通常使用内存作为存储介质,但是内存并不是无限的。对于消耗极大内存的数据,要慎用缓存方案,同时缓存一定要设置过期时间,剔除非热点数据。

  • 缓存会给运维也带来一定的成本

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章