JavaWeb_瑞吉外卖_项目优化Day10-Spring Cache

JavaWeb_瑞吉外卖_项目优化Day10-Spring Cache

  • Git管理现有项目
  • 环境搭建
    • maven坐标
    • yml配置文件
    • 配置类
  • 缓存短信验证码
  • 缓存菜品数据
  • Spring Cache
    • 介绍
    • 常用注解
    • 使用方式
  • 缓存套餐数据
  • 来源

Git管理现有项目

  • 提交步骤:
    1. 生成空仓库, 不要加任何文件
    2. 右键项目, add整个项目
    3. commit和push, push时添加远程仓库地址
  • 新建分支步骤:
    1. 在本地新建一个分支
    2. push

环境搭建

maven坐标


<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-data-redisartifactId>
dependency>

yml配置文件

spring:
  redis:
    host: localhost
    port: 6379
    # password:
    database: 0

配置类

@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;
    }
}

缓存短信验证码

  • 注入redis对象
    @Autowired
    private RedisTemplate redisTemplate;
    
  • 将验证码保存到redis, 有效期5分钟
    redisTemplate.opsForValue().set(phone, code, 5, TimeUnit.MINUTES);
    
  • 获取验证码, 登录成功后删除验证码
    // 从redis中获取保存的验证码
    Object codeInSession = redisTemplate.opsForValue().get(phone);
    // 登录成功则删除验证码
    redisTemplate.delete(phone);
    

缓存菜品数据

  • 获取缓存数据
    List<DishDto> dishDtoList = null;
    // 动态构造key
    String key = "dish_"+dish.getCategoryId()+"_"+dish.getStatus();
    
    // 先从redis中获取缓存数据
    dishDtoList = (List<DishDto>) redisTemplate.opsForValue().get(key);
    if(dishDtoList != null){
        // 如果存在, 直接返回, 无需查询数据库
        return R.success(dishDtoList);
    }
    
    ... 
    
    // 将查询到的菜品数据缓存到redis
    redisTemplate.opsForValue().set(key, dishDtoList);
    
  • 删除缓存数据
    // 清理所有菜品的缓存数据
    // Set keys = redisTemplate.keys("dish_*");
    // redisTemplate.delete(keys);
    
    // 清理某个分类下的菜品缓存数据
    String key = "dish_"+dishDto.getCategoryId()+"_1";
    redisTemplate.delete(key);
    

Spring Cache

介绍

  • Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。
  • Spring Cache提供了一层抽象,底层可以切换不同的cache实现。具体就是通过CacheManager接口来统一不同的缓存技术。
  • CacheManager是Spring提供的各种缓存技术抽象接口。
  • 针对不同的缓存技术需要实现不同的CacheManager:
    CacheManager 描述
    EhCacheCacheManager 使用EhCache作为缓存技术
    GuavaCacheManager 使用Google的GuavaCache作为缓存技术
    RedisCacheManager 使用Redis作为缓存技术

常用注解

注解 功能
@EnableCaching 开启缓存注解功能
@Cacheable 在方法执行前spring先查看缓存中是否有数据, 如果有数据, 则直接返回缓存数据; 若没有数据, 调用方法并将方法返回值放到缓存中
@CachePut 将方法的返回值放到缓存中
@CacheEvict 将一条或多条数据从缓存中删除
  • 在SpringBoot项目中, 使用缓存技术只需要在项目中导入相关缓存技术的依赖包, 并在启动类上使用@EnableCaching开启换成支持即可
  • 例如, 使用Redis作为缓存技术, 只需要导入Spring data Redis的maven坐标即可

使用方式

maven依赖

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-cacheartifactId>
dependency>

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-data-redisartifactId>
dependency>

设置缓存有效期

cache:
  redis:
    time-to-live: 1800000 # 设置缓存有效期 

注解

@CachePut(value = "userCache", key = "#user.id")
@CacheEvict(value = "userCache", key = "#user.id")
@Cacheable(value = "userCache", key = "#id", unless = "#result == null")
@Cacheable(value = "userCache", key = "#user.id+'_'+#user.name", unless = "#result == null")

注: @Cacheable的condition属性不能使用#result

缓存套餐数据

@CacheEvict(value = "setmealCache", allEntries = true)
public R<String> save(@RequestBody SetmealDto setmealDto)
@Cacheable(value = "setmealCache", key = "#setmeal.categoryId+'_'+#setmeal.status")
public R<List<Setmeal>> list(Setmeal setmeal)

来源

黑马程序员. 瑞吉外卖项目

你可能感兴趣的:(JavaWeb开发,#,spring,java,后端,spring,boot,redis,Spring,Cache,MybatisPlus)