Redis之多级缓存
Redis之多级缓存——亿级流量方案
序言
传统缓存问题:
传统缓存一般是请求到达Tomcat后,Tomcat先查询Redis缓存,如果未命中则查询数据库。存在下面问题:
- 请求要经过Tomcat服务器,Tomcat的性能成为整个并发缓存的瓶颈
- 如果Redis缓存失效,会对数据库产生冲击
多级缓存
充分利用各环节,分别添加缓存,减轻Tomcat的压力
客户端缓存->NGINX本地缓存->Redis->Tomcat->DB
其中Nginx缓存是业务Nginx,通常部署为集群,再由专门的Nginx做反向代理
JVM进程缓存
Caffeine技术
缓存驱逐策略:
- 基于容量、基于时间、基于引用
实现效果:
- 第一次查询走数据库,然后就会放入缓存,之后查询就走缓存
Lua语法
轻量小巧的脚本语言
数据类型
nil、boolean、number、string、function、table、type函数
变量
声明变量
1 | local var_name = var_value |
访问数组,下标从一开始arr[1]
访问Map,
1 | map['name'] |
循环遍历
1 | local arr = {'Java','lua','python'} |
函数
1 | function fun_name(para) |
条件控制
1 | if(布尔表达式) |
多级缓存
配置nginx
-
OpenResty是基于Nginx的高性能Web平台
-
OpenResty使用流程类似于Nginx的使用
-
监听路径类似于Response
Lua文件类似于Service层 -
请求参数处理,不同参数格式有相应解析代码
nginx查询Tomcat
小规律:服务器前三位地址相同,第四位换为1
nginx提供了内部API用以发送http请求
Tomcat集群的负载均衡
保证缓存一直生效,同一路径访问同一服务器
修改负载均衡算法由轮询改为Hash算法来直接匹配
添加Redis缓存
冷启动:服务器初启动时,没有缓存,此时查询会都导向数据库,带来较大的数据库压力
缓存预热:利用大数据统计热点数据,将热点数据存到缓存
实现nginx优先查询Redis缓存:
OpenResty如何操作Redis?
OpenResty提供了操作Redis的模块,大概模块如下:
-
封装函数,从Redis读取数据并返回
-
引入Redis模块,并初始化Redis模块
-
封装函数,释放Redis连接,其实是放入连接池
Nginx本地缓存
利用shared dict开启词典
修改查询逻辑,加入缓存业务
缓存同步
三种方式
- 设置有效期
- 同步双写,在修改数据的同时直接修改缓存
- 异步通知,改数据库时发事件通知,相关服务进行监听到通知后修改缓存
监听mysql,使用MQ/canal实现
canal基于mysql的主从模式,canal伪装为mysql的一个slave节点完成通知