一、缓存介绍
1、关于缓存
缓存是存储在计算机的一个原始数据的复制集。为了便于访问,缓存中的数据可能是提前计算生成好的结果。2、为什么需要?
主要是解决高并发,大流量场景下的热点数据访问的性能问题,提供高性能的数据快速访问。
二、缓存架构的演进
1、初始架构(动态访问)
php+nginx+mysql
动态页面,每次请求都要调用多个依赖服务的接口,从数据库里查询数据,然后通过类似php模板引擎渲染到HTML模板中,返回最终HTML页面。
问题:每次请求都是要访问数据库,性能差。
2、页面静态化技术
当用户第一次访问时,就调用相关的依赖服务,渲染生成一个html,然后利用rsync的方式同步推送到多台nginx服务上
当用户第二次请求到任何一台应用nginx服务器上,都有全量的HTML静态页面可以返回,不请求到后端服务器
问题:全量更新问题假设是商品详情页如果某一个商品分类、商家等信息变更了那么那个分类、店铺、商家下面所有的商品详情页都需要重新生成静态HTML页面
更新速度过慢问题分类、店铺、商家、商品信息数据越来越多重新生成HTML的负载越来越高,rsync全量同步所有nginx的负载也越来越高从数据变更到生成静态HTML,再到全量同步到所有nginx,时间越来越慢
扩容问题因为每个商品详情页都要全量同步到所有的nginx上,导致系统无法扩容,无法增加系统容量
3、动态渲染技术
根据前面的问题,我们引出第三个版本迅速响应各种页面模板的改版和个性化需求的新模板的加入页面模块化,页面中的某个区域变化,只要更新这个区域中的数据即可支持高性能访问支持水平扩容的伸缩性架构
更新问题:不再是生成和推送html,直接数据更新到redis,然后走动态渲染,性能大大提升。访问的时候利用lua从缓存读取数据,动态渲染html模板
全量更新问题:数据和模板分离,数据更新存储在redis当中,模板存放在nginx上,模板变更,只要更新nginx上模板,第二次商品详情页访问,不需要重新生成所有html,直接走动态渲染,用最新的模板+最新的数据动态渲染最新的html。
容量问题:不需要依赖nginx所在机器的磁盘空间存储大量的html,将数据放redis,html就存放模板,大大减少空间占用,且redis集群、nginx都可扩容
三、架构设计
多级缓存架构当中每一层的意义
ngx_lua属于nginx的一部分,它的执行指令都包含在nginx的个步骤之中了,相应的处理阶段可以做插入式处理,即可插拔式架构,不过ngx_lua并不是所有阶段都会运行的;另外指令可以在