缓存优化

 

我们将之前写的瑞吉项目push到gitee上,然后新建一个分支v1.0,在v1.0上进行优化,并且push上去

环境搭建

 

host跟ip都要写自己对应的 ,如果没有设置密码 就不用写密码配置

新建RedisConfig配置类 控制不让key序列化:

@Configuration
public class RedisConfig extends CachingConfigurerSupport {@Beanpublic RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();//默认的Key序列化器为:JdkSerializationRedisSerializerredisTemplate.setKeySerializer(new StringRedisSerializer()); // key序列化//redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); // value序列化redisTemplate.setConnectionFactory(connectionFactory);return redisTemplate;}
}

当我们没有主动设置RedisTemplate的Bean的时候SpringBoot会自带设置RedisTemplate的bean:

 

配置好后,我们选择提交并push

缓存短信验证码

实现思路

 

//将生成的验证码,缓存到redis中,并设置有效期为5分钟
redisTemplate.opsForValue().set(phone,code,5, TimeUnit.MINUTES);
//如果用户登录成功,我们就直接删除redis中的验证码
redisTemplate.delete(phone);

缓存菜品数据

每次我们点击分类,后台都会进行很多的sql查询,为了减少后台工作量

我们需要缓存菜品的数据

 我们按照分类,对菜品数据进行缓存,list方法里先从redis获取数据,有就直接返回,没有就查数据库然后把数据放入redis

但是我们更新完菜品后,如果还从缓存拿数据,就跟数据库不一样了,所以我们要在涉及到数据库更新的方法里,加入清理缓存逻辑

List<DishDto> dishDtos=null;
//按格式拼接一个key
String key = "dish_"+dish.getCategoryId()+"_"+dish.getStatus();
//先从redis中获取缓存数据
dishDtos = (List<DishDto>) redisTemplate.opsForValue().get(key);//判断获取的dishDtos是否为空,有内容则直接返回
if (dishDtos!=null){return new R(1,"查询成功",dishDtos);
}//如果没有内容 就继续往下执行

执行完之后,将数据放到Redis缓存中:

//将菜品数据缓存到Redis 时长为60分钟
redisTemplate.opsForValue().set(key,dishDtos,60, TimeUnit.MINUTES);

清理缓存:

我们有两种方式:一种是清除所有菜品的缓存数据,一种是清除当前的菜品类的缓存数据

清除所有菜品缓存数据: 先获取dish_开头的key的Set集合,然后删除

清理当前操作的菜品类的缓存数据 

 

经过测试没有问题,我们切回主分支,然后将v1.0合并到主分支

SpringCache快速应用

 SpringCache常用注解

 我们先讲SpringCache基础功能 

坐标这块我们Springboot-web就已经包括了SpringCache了

 #user对应的是return出来的user

根据key删除相应缓存:

 

Cacheable:

 

 

切换成使用redis配合缓存

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>

 

 

 

套餐数据缓存

实现思路:

 

  我们的结果需要实现序列化接口,否则无法用注解的方式缓存

 allEntries = true 表示所有的setmeal的缓存数据都要删除