changgou-day04
目标(高并发的优化)
- 实现首页的广告的展示解决方案
- 广告表
- 广告分类表
- 实现的解决方案
- lua + openresty+redis (实现多级缓存)+限流(掌握)
- lua
- openresty
- 实现业务逻辑(多级缓存实现广告数据展示)
- canal的中间件
- 同步的解决方案(掌握)
1 首页广告实现的思路
优化之后的解决方案:1.先从openresty找 通过lua脚本链接redis
2.再从redis找 通过lua脚本链接Mysql
3.在mysql找数据返回
2 lua
Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能3 openresty
安装:默认是安装到/usr/local/openresty是一个基于nginx的web平台,主要是集成了lua的模块 直接提供给我们开发人员使用。能够实现超高性能的处理 1000K
nginx:yum install openresty
--刷新配置
./nginx -s reload
--启动
./nginx
--关闭
./nginx -s stop
4 需求
``` 查询数据库的数据 将数据存储到redis中 思路: 请求 到openresty openresty接收请求 转发给lua脚本来处理 lua脚本的业务逻辑如下:- 链接到数据库,查询数据库的广告的数据
- 将数据转成JSON字符串
- 链接到redis 将数据存储到redis中 请求:/update_content?id=1 参数: id —指定广告分类的id 返回值: json
步骤:
+ 1.配置/usr/local/openresty/nginx/conf/nginx.conf
+ 2.编写lua脚本(添加逻辑处理)
+ 3.重新刷新conf配置文件
![](https://cdn.nlark.com/yuque/0/2021/png/12589476/1635088543134-4e57ddcf-4b23-4181-9aec-843c22cc858a.png#id=cBfTV&originHeight=730&originWidth=1773&originalType=binary&ratio=1&status=done&style=none)
<a name="It0zN"></a>
### 5 需求(实现高兵的解决方案)
需求: 先从openresty的缓存中的数据 如果能获取直接返回 如果获取不到,再从redis中获取数据 如果能获取,将redis的数据存储到openresty中,再直接返回 如果获取到redis中的数据,再从mysql中获取,将数据存储到redis中,再返回。 思路: 请求 到openresty openresty 接收请求 转发给lua脚本来处理 lua脚本的逻辑:需求说明 请求:/read_content 参数:id 返回值:JSON 步骤:
+ 0.设置nginx缓存对象 并分配内存空间
+ 1.配置/usr/local/openresty/nginx/conf/nginx.conf
+ 2.编写lua脚本(添加逻辑处理)
+ 3.重新刷新conf配置文件
![](https://cdn.nlark.com/yuque/0/2021/png/12589476/1635088543230-46493f7c-7d54-4991-bef9-5c8c984c1d01.png#id=ZuaDa&originHeight=876&originWidth=1814&originalType=binary&ratio=1&status=done&style=none)
<a name="ChBOC"></a>
### 6 限流
- 1.控制速率
- 2.控制连接数量
canal [kə’næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费. 总结:就是一个服务器。实现监听数据变化,处理某一些业务逻辑。控制速率:<br />![](https://cdn.nlark.com/yuque/0/2021/png/12589476/1635088543349-aef3d25b-137e-4a32-b5b3-588f5420329d.png#id=RsQG6&originHeight=720&originWidth=1536&originalType=binary&ratio=1&status=done&style=none)
<a name="vztDV"></a>
### 7 canal
canal-server 服务端 伪装他自己是一个malseter的 slave canal-client 客户端 用来监听canal-server客户端(java的客户端:处理数据以及业务逻辑)canal有两个角色:
1.有个数据库 是master 2.canal-server 是slave(伪装的) 3.canal-client 进行监听canal-server 4.一旦数据库master发生数据更新,canal-server就获取到数据,canal-client 监听到数据变化,在客户端中代码实现:统一获取到数据,进行同步即可有个canal之后简单的同步的思路:
搭建canal并实现监听数据的变化的步骤:
- mysql 需要开启binlog (master角色)
- mysql 创建一个账号 用于salve专门使用,授予权限slave的权限 远程授权。
- 通过docker 安装canal-server
- 配置canal-server(配置连接到的master的ip和端口 以及自身的账号和密码以及要监听的数据库和表有哪些)
- 搭建canal-client(java微服务:监听canal-server 获取被修改的数据,然后做业务逻辑:同步数到redis中) 1.先下载参考,再安装起步依赖到本地仓库 2.再添加起步依赖 刷新 3.创建启动类启用canalclient 4.创建监听类 监听canal-server 实现当发生了CRUD的时候执行业务代码 5.配置客户端对应的服务端的地址和端口
6.canal-client写代码验证是否能监听到数据。
修改mysqld.cnf
docker cp mysql:/etc/mysql/mysql.conf.d/mysqld.cnf ./ vi mysqld.cnf
修改内容:<br />![](https://cdn.nlark.com/yuque/0/2021/png/12589476/1635088543453-f624ba6f-1ebe-4246-8ed6-0318b108a602.png#id=NrIzS&originHeight=253&originWidth=982&originalType=binary&ratio=1&status=done&style=none)<br />copy 到容器内部:
docker cp myqld.cnf mysql:/etc/mysql/mysql.conf.d/
mysql授权:
create user canal@’%’ IDENTIFIED by ‘canal’;
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT,SUPER ON . TO ‘canal’@’%’;
FLUSH PRIVILEGES;
```
重启容器
配置canal-server: exmpale/instance.propetiers
feign调用的说明: