赞
踩
目录
传统缓存策略一般是请求到tomcat后,先查询redis,如果未命中则查询数据库
请求要先经过tomcat处理,tomcat的性能成为整个系统的瓶颈
多级缓存就是利用请求处理的每个环节,分别添加缓存,减轻tomcat压力,提升服务器性能:
我们把缓存分为两类:分布式缓存和进程本地缓存
分布式缓存,例如Redis:
进程本地缓存,例如hashMap、GuavaCache
Cafeine是一个基于Java8开发的,提供了近乎最佳命中率的高性能的本地缓存库。目前Spring内部的缓存使用的就是Caffeine。
创建一个CaffeineConfig配置类
在要使用的地方注入bean
修改业务
我们现在已经完成了nginx反向代理和tomcat的进程缓存
接下来我们要用lua来完成nginx的本地缓存
Lua是轻量小巧的脚本语言,用c编写,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能,经常用在游戏开发中
centOS自带了lua,所有不用安装
Lua声明变量的时候,不需要指定数据的类型,local表示局部变量的意思
for循环遍历的时候do和end就相当于大括号,in后面是要遍历的对象括号里面是类型
前面是以键值对的方式来遍历的,index数组的话就是索引和value就是值
OpenResty是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
先按照好OpenResty然后配置好nginx
我们先把自己的接口请求打到nginx反向代理服务器,然发到OpenResty的服务器上
openResty的lua模块是固定的直接复制
因为是快速入门,我们先用假数据返回固定的
我们可以把请求打到nginx的负载均衡服务器再转发到tomcat
我们这个请求是要发两次的,我们要提取出来,方便复用,放到lualib目录下
编写lua脚本
因为中间要用到字符串拼接,json不能实现所有要转成lua语法再拼接然后转化json返回
我们实际上不可能只有一台tomcat肯定是集群,所以我们要配置负载均衡
我们肯定不能每次走不同的,这样会导致进程缓存重复缓存,所以我们经历同一个id的请求打到一个服务器上,我们要用hash运算然后对服务器数量取模。
冷启动:服务刚刚启动时,redis中并没有缓存,如果所有商品数据都在第一次查询时添加缓存,可能会给数据库带来较大压力
缓存预热:在实际开发中,我们可以利用大数据统计用户访问的热点数据,再项目启动时将这些热点数据提前查询并保存redis中
所以在我们redisconfig里面添加上预热
因为我们是分表的商品信息表和库存表,所以分开缓存,库存表经常变动
OpenResty的Redis模块
OpenResty提供了操作Redis的模块,我们只需要引入该模块就能直接使用:
查询数据的方法
把查询和释放的方法都写到common.lua里面,然后暴露出去,到时候调用就行
查询逻辑也要改,先查询redis,redis没命中再查tomcat
OpenResty为Nginx提供了shard dIct功能,可以在nginx的多个worker之间共享数据,实现缓存功能
先再nginx.conf中配置共享词典
然后导入
需求
缓存数据同步的常见方式有三种:
引入canal的异步通知,canal监听数据库的变化,发生变化后立刻通知更新缓存
Canal译为水道、管道,是阿里开源项目,基于java开发。基于数据库增量日志解析,提供增量数据订阅&消费
Canal是基于mysql主从同步实现的,mysql主从同步原理如下
Canal就是把自己伪装成mysql的一个slava节点,从而监听master的binary log变化,再把变化的信息通知给canal客户端,进而完成对其他数据库的同步
(1)先开启mysql主从同步
(2)安装Canal
(3)执行命令创建Canal容器:
这样,我们就成功用Canal对mysql进行监听了
接下来我们就更新tomcat的客户端,来监听Canal的消息
监听Canal我们首先先引入springboot整合canal的依赖,然后配置好canal
然后编写监听器来监听canal的消息
canal推送给canal客户端的是被修改的这一行数据,我们引入的canal客户端会帮助我们把这行数据封装到item实体类中,这个过程需要知道数据库和实体的映射关系,要用到注解来映射
业务逻辑:
最后的架构图:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。