缓存优化
我们将之前写的瑞吉项目push到gitee上,然后新建一个分支v1.0,在v1.0上进行优化,并且push上去
环境搭建
host跟ip都要写自己对应的 ,如果没有设置密码 就不用写密码配置
新建RedisConfig配置类 控制不让key序列化:
@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()); // 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的缓存数据都要删除