【项目优化01】使用Git管理项目及使用redis缓存短信验证码,菜品以及套餐数据

1. 使用Git管理项目

  1. 选择在我们文件的根目录创建仓库
    在这里插入图片描述
  2. 导入ignore文件,将不需要导入仓库的文件写入该文件
    在这里插入图片描述
  3. 将文件添加至暂存区
    在这里插入图片描述
  4. 添加至暂存区后就可以进行commit操作
    在这里插入图片描述
  5. 推送至远程仓库前需要先关联一下远程仓库
    在这里插入图片描述
    添加远程仓库的地址链接
    在这里插入图片描述
  6. 勾选需要上传文件,输入提交信息,选择commit and push,将项目推送至远程仓库。
    在这里插入图片描述
  7. 将原始项目推送至远程仓库后,我们接下来创建新的分支,用来进行项目优化,当我们优化项目如果出现问题,就可以将其回滚至上个版本的项目,避免影响之前的项目。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

如果项目推送失败的,多半是因为远程仓库和本地仓库的文件不一样导致,记得去看前面的blog,里面有解决方法,亲测可用

OK,使用Git管理项目就介绍到这里。

接下来我们介绍一下 使用redis缓存。

2. redis缓存

2.1 使用redis缓存短信验证码

  1. 导入redis相关maven坐标
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
  1. 修改配置文件,指定redis的主机及端口
  redis:
    host: localhost
    port: 6379
  1. 添加配置类RedisConfig,这是一个反序列化的工具
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        //默认的Key序列化器为:JdkSerializationRedisSerializer
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setConnectionFactory(connectionFactory);
        return redisTemplate;
    }
}

之前我们使用session来存储我们的短信验证码,默认时间是30分钟,接下来我们使用redis来缓存我们的短信验证码,使用phone手机号作为key,code作为value,时间是五分钟。
在这里插入图片描述

在这里插入图片描述

当用户登录成功后,我们就将缓存中的验证码删除。
在这里插入图片描述

2.2 使用redis缓存菜品数据

首先我们明确一下为什么使用redis缓存来保存我们的菜品数据。

当我们客户端的用户量很多且同一时间访问我们的页面的时候,页面会发送请求去访问我们的数据库,一旦请求次数过多,数据库效率会变慢甚至崩溃,因此,我们使用redis缓存可以实现用户只需访问一次数据库后,只要这时数据库内容不发生变化,用户就能直接从我们的缓存中读取数据,访问效率大大提高。

改变思路如下:

  1. 改造DishController中的list方法,先从redis中读取数据,当redis中没有数据时,再去访问数据库。
  2. 改造DishController中的修改和更新方法,加入清理缓存的逻辑。

需要注意的是

在使用缓存过程中,要保证数据库中的数据和缓存中的保持一致,如果数据库中的数据发生变化,要及时清理缓存中的数据。

在list方法中创建一个动态key,再根据key去缓存中获取相对应的数据。

当然了,第一次查询的时候缓存中肯定没有数据,因此,我们会先查询一次数据库,然后将本次查询的数据根据key-value形式存入缓存,接下去只要数据库中的数据不发生变化,就直接从缓存中拿数据。

		List<DishDto> dishDtoList = null;

        //1.动态构建一个key,根据key获取值 key:dish_123863546_1
        String key = "dish_"+dish.getCategoryId()+"_"+dish.getStatus();

        //2.根据key从redis中获取相对应的数据
        dishDtoList  = (List<DishDto>) redisTemplate.opsForValue().get(key);

        //3. 如果数据不为空,则直接返回该数据集合
        if(dishDtoList!=null){
            return R.success(dishDtoList);
        }
		//4. 获取数据为空,查询数据库
        redisTemplate.opsForValue().set(key,dishDtoList);

最后,在新增菜品,修改和添加菜品时将缓存中的数据清理。

        //删除缓存中的数据
        String key = "dish_"+ dishDto.getCategoryId()+"_1";
        redisTemplate.delete(key);

2.3 使用Spring Cache缓存套餐数据

在这里插入图片描述
在这里插入图片描述

  1. 导入spring cache坐标依赖
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-cache</artifactId>
 </dependency>
  1. 修改yml配置文件
    没有使用注解之前,缓存数据的有效时间不是手动设置就是默认为永久有效,现在,我们可以直接在yml文件中配置缓存有效时间,yml中时间单位为毫秒。
spring:
  cache:
    redis:
      time-to-live: 1800000 #设置过期时间30分钟
  1. 开启缓存注解功能
    在这里插入图片描述

  2. 使用注解缓存数据
    使用Cacheable注解在执行程序前,会先判断缓存中是否有数据,有数据直接从缓存中拿数据,否则执行程序查询数据库,然后将数据存入缓存中。

value是缓存的名称(一类缓存),每个缓存名称下面可以有多个key,在数据库数据发生变化后,我们只需要将该类缓存清理就可以直接将缓存中的数据清除。

    /**
     * 根据条件查询套餐数据
     * @param setmeal
     * @return
     */
    @GetMapping("/list")
    @Cacheable(value = "setmealCache",key = "#setmeal.categoryId")
    public R<List<Setmeal>> list(Setmeal setmeal){
        LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(setmeal.getCategoryId()!=null,Setmeal::getCategoryId,setmeal.getCategoryId());
        queryWrapper.eq(setmeal.getStatus()!=null,Setmeal::getStatus,setmeal.getStatus());

        List<Setmeal> setmealList = setmealService.list(queryWrapper);
        return R.success(setmealList);
    }

在后台新增套餐,修改,删除,售卖状态发生变化,我们也同样需要将缓存中的数据清理。

清理方法一样,如下

@CacheEvict将一条或者多条数据从缓存中清理,按缓存的名称清理,allEntries = true代表全部清理。

    /**
     * 修改套餐功能
     * @param setmealDto
     * @return
     */
    @PutMapping
    @CacheEvict(value = "setmealCache",allEntries = true)
    public R<String> update(@RequestBody SetmealDto setmealDto){
        setmealService.updateWithDish(setmealDto);
        return R.success("修改成功");
    }

验证缓存是否设置成功,可以先在客户端将套餐数据先查询一遍,如果成功的话数据会保存在我们的缓存中,这时候我们清理控制台,在客户端重新发送查询指令,只要我们控制台没有发送sql查询数据库,就证明添加成功。

我们之前缓存菜品数据没有使用缓存,感兴趣可以将此方法应用到菜品数据缓存中。


版权声明:本文为qq_54699828原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>