【项目优化01】使用Git管理项目及使用redis缓存短信验证码,菜品以及套餐数据
1. 使用Git管理项目
- 选择在我们文件的根目录创建仓库
- 导入ignore文件,将不需要导入仓库的文件写入该文件
- 将文件添加至暂存区
- 添加至暂存区后就可以进行commit操作
- 推送至远程仓库前需要先关联一下远程仓库
添加远程仓库的地址链接
- 勾选需要上传文件,输入提交信息,选择commit and push,将项目推送至远程仓库。
- 将原始项目推送至远程仓库后,我们接下来创建新的分支,用来进行项目优化,当我们优化项目如果出现问题,就可以将其回滚至上个版本的项目,避免影响之前的项目。
如果项目推送失败的,多半是因为远程仓库和本地仓库的文件不一样导致,记得去看前面的blog,里面有解决方法,亲测可用。
OK,使用Git管理项目就介绍到这里。
接下来我们介绍一下 使用redis缓存。
2. redis缓存
2.1 使用redis缓存短信验证码
- 导入redis相关maven坐标
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- 修改配置文件,指定redis的主机及端口
redis:
host: localhost
port: 6379
- 添加配置类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缓存可以实现用户只需访问一次数据库后,只要这时数据库内容不发生变化,用户就能直接从我们的缓存中读取数据,访问效率大大提高。
改变思路如下:
- 改造DishController中的list方法,先从redis中读取数据,当redis中没有数据时,再去访问数据库。
- 改造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缓存套餐数据
- 导入spring cache坐标依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
- 修改yml配置文件
没有使用注解之前,缓存数据的有效时间不是手动设置就是默认为永久有效,现在,我们可以直接在yml文件中配置缓存有效时间,yml中时间单位为毫秒。
spring:
cache:
redis:
time-to-live: 1800000 #设置过期时间30分钟
-
开启缓存注解功能
-
使用注解缓存数据
使用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查询数据库,就证明添加成功。
我们之前缓存菜品数据没有使用缓存,感兴趣可以将此方法应用到菜品数据缓存中。