Blage's Coding Blage's Coding
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
  • 网关

  • 抽奖

  • 电商

  • 外卖

    • 外卖
    • 项目优化
      • 1.缓存短信验证码
      • 2.缓存菜品数据
      • 3.Spring Cache
      • 4.读写分离
        • sharding-JDBC框架
      • 5.生成接口文档
      • 6.最终项目部署
    • 踩坑
  • 项目笔记
  • 外卖
phan
2023-05-15
目录

项目优化

# 项目优化

# 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
1
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
1
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 &
1
编辑 (opens new window)
上次更新: 2023/12/15, 15:49:57
外卖
踩坑

← 外卖 踩坑→

Theme by Vdoing | Copyright © 2023-2024 blageCoder
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式