Redis之多级缓存——亿级流量方案

序言

传统缓存问题:

传统缓存一般是请求到达Tomcat后,Tomcat先查询Redis缓存,如果未命中则查询数据库。存在下面问题:

  1. 请求要经过Tomcat服务器,Tomcat的性能成为整个并发缓存的瓶颈
  2. 如果Redis缓存失效,会对数据库产生冲击

多级缓存

充分利用各环节,分别添加缓存,减轻Tomcat的压力

客户端缓存->NGINX本地缓存->Redis->Tomcat->DB

其中Nginx缓存是业务Nginx,通常部署为集群,再由专门的Nginx做反向代理

JVM进程缓存

Caffeine技术

缓存驱逐策略:

  • 基于容量、基于时间、基于引用

实现效果:

  • 第一次查询走数据库,然后就会放入缓存,之后查询就走缓存

Lua语法

轻量小巧的脚本语言

数据类型

nil、boolean、number、string、function、table、type函数

变量

声明变量

1
2
3
4
5
local var_name = var_value
#数组
local arr = {'java','python','c++'}
#map
local map = {name = 'Jack',age = 2}

访问数组,下标从一开始arr[1]

访问Map,

1
2
map['name']
map.name

循环遍历

1
2
3
4
5
6
7
local arr = {'Java','lua','python'}
for index,value in ipairs(arr) do
print(index,value)
end
for key,value in pairs(map) do
prinr(key,value)
end

函数

1
2
3
4
function fun_name(para)
---
return nil
end

条件控制

1
2
3
4
5
6
if(布尔表达式)
then
---
else
---
end

多级缓存

配置nginx

  1. OpenResty是基于Nginx的高性能Web平台

  2. OpenResty使用流程类似于Nginx的使用

  3. 监听路径类似于Response
    Lua文件类似于Service层

  4. 请求参数处理,不同参数格式有相应解析代码

nginx查询Tomcat

小规律:服务器前三位地址相同,第四位换为1

nginx提供了内部API用以发送http请求

Tomcat集群的负载均衡

保证缓存一直生效,同一路径访问同一服务器

修改负载均衡算法由轮询改为Hash算法来直接匹配

添加Redis缓存

冷启动:服务器初启动时,没有缓存,此时查询会都导向数据库,带来较大的数据库压力

缓存预热:利用大数据统计热点数据,将热点数据存到缓存

实现nginx优先查询Redis缓存:

OpenResty如何操作Redis?

OpenResty提供了操作Redis的模块,大概模块如下:

  • 封装函数,从Redis读取数据并返回

  • 引入Redis模块,并初始化Redis模块

  • 封装函数,释放Redis连接,其实是放入连接池

Nginx本地缓存

利用shared dict开启词典

修改查询逻辑,加入缓存业务

缓存同步

三种方式

  1. 设置有效期
  2. 同步双写,在修改数据的同时直接修改缓存
  3. 异步通知,改数据库时发事件通知,相关服务进行监听到通知后修改缓存

监听mysql,使用MQ/canal实现

canal基于mysql的主从模式,canal伪装为mysql的一个slave节点完成通知