项目优化
# 项目优化
# 1.缓存短信验证码
生成的验证码保存到redis,并设置存活时间
前端输出后,后端从redis取出验证码进行校验,如果匹配成功则从redis中删除该验证码。
# 2.缓存菜品数据
每点击一次菜品就会发送一次数据库查询,为了减轻数据库压力需要缓存菜品数据。
业务流程:
先从redis中获取菜品数据,有则返回无需查询数据库,如果没有则查询数据库,并把数据放入到redis中。把每个菜系品种的categoryid作为key
此外DishController中添加和更新方法中,每完成一次数据库操作都需要清理缓存,防止数据库和缓存数据不一致出现脏数据。
对象可以存储为String的原因:对象通过JSON序列化成字符串在序列化成字节数组存入redis,取的时候拿到字节数组反序列即可
更改redis序列化方式为StringRedisSerializer才能正常显示字符串(默认的jdkRedis...)
# 3.Spring Cache
@EnableCaching:开启缓存注解功能,在启动类上添加
@Cacheable(value=" " , key=" #id",condition="#result!=null"):先查看缓存是否有数据,如果有则直接返回;如果没有则执行方法查询数据库语句,把结果加入到缓存并返回。condition表示满足条件才把缓存数据。一般用于select语句
@CachePut(value=" ", key=" #user.id"):将方法返回值放入缓存,value表示缓存名称,key表示缓存key;#user表示返回值,名称要和方法中的对应
@CacheEvict(value=" " ,key=" #id"):清除指定的缓存一般用于更新删除语句
@CacheEvict(value="setmealCache",allEntries = true):删除该分类下所有缓存数据
注意:使用注解要注意方法返回类型是否实现了序列化接口。而IO读写都是以字节流方式进行的,java类只有implements Serializable实现了序列化,才能被输出流转化为字节流。
# 4.读写分离
mysql主从复制,数据库的写操作在主库进行,读操作在从库进行。分成以下三步
- 主库将改变记录都记录到binary log日志中
- 从库其中一个io线程会将binary log拷贝到他的中继日志relay log
- 从库的SQL线程重做一遍中继日志的事件,将改变应用到自己的数据库
# sharding-JDBC框架
增强版JDBC驱动,轻松实现数据库读写分离
- 配置好主从数据库
- 导入maven坐标
- 在配置文件配置读写分离规则
shardingsphere:
datasource:
names:
master,slave
# 主数据源
master:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.138.100:3306/rw?characterEncoding=utf-8
username: root
password: root
# 从数据源
slave:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.138.101:3306/rw?characterEncoding=utf-8
username: root
password: root
masterslave:
# 读写分离配置
load-balance-algorithm-type: round_robin #轮询
# 最终的数据源名称
name: dataSource
# 主库数据源名称
master-data-source-name: master
# 从库数据源名称列表,多个逗号分隔
slave-data-source-names: slave
props:
sql:
show: true #开启SQL显示,默认false
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
- 在配置文件中配置允许bean定义覆盖配置项
main:
allow-bean-definition-overriding: true
2
# 5.生成接口文档
swagge生成接口文档
- 导入knife4j的maven坐标
- 在webmvcConfigp配置类添加注解@EnableSwagger2 @EnableKnife4j
- 配置类指明扫描controller的包目录
- 过滤器放行查看输出接口文档的路径地址
- 访问查看结果http://localhost:8080/doc.html
# 6.最终项目部署
192.168.142.134:部署后端jar包+mysql+redis
192.168.142.132:部署前端nginx
maven打jar包 clean+package
nohup java -jar reggie_take_out-1.0-SNAPSHOT.jar &>reggie_take_out.log &