一篇文章带你搞定 Spring Cache 整合 Redis

一、前期配置

首先W建一个 Springboot 工程,引入依赖:
Spring Web,Spring cache,redis,Spring Security

在这里插入图片描述
配置 application.properties

spring.redis.host=192.168.176.128
spring.redis.port=6379
#给缓存取一个名字,后面会用到
spring.cache.cache-names=yolo

二、缓存使用

(1)@CacheConfig

这个注解在类上使用,用来描述该类中所有方法使用的缓存名称,当然也可以不使用该注解,直接在具体的缓存注解上配置名称,示例代码如下:

@Service
@CacheConfig(cacheNames = "yolo")
public class UserService {
    
    
}

可以看到 缓存的 key 会都加上该名字:

在这里插入图片描述

(2)@Cacheable

这个注解一般加在查询方法上,表示将一个方法的返回值缓存起来,默认情况下,缓存的key就是方法的参数,缓存的value就是方法的返回值。示例代码如下:

@Cacheable(key = "#id")
public User getUserById(Integer id,String username) {
    
    
    System.out.println("getUserById");
    return getUserFromDBById(id);
}

当有多个参数时,默认就使用多个参数来做key,如果只需要其中某一个参数做key,则可以在@Cacheable注解中,通过key属性来指定key,如上代码就表示只使用id作为缓存的key,如果对key有复杂的要求,可以自定义keyGenerator。当然,Spring Cache中提供了root对象,可以在不定义keyGenerator的情况下实现一些复杂的效果:

在这里插入图片描述
示例:

@Service
//用来描述该类中所有方法使用的缓存名称
@CacheConfig(cacheNames = "yolo")
public class UserService {
    
    
    //表示将该方法的返回值缓存起来
    @Cacheable
    public User getUserById(Integer id) {
    
    
        System.out.println("getUserById>>>" + id);
        User user = new User();
        user.setId(id);
        return user;
    }
}

测试缓存:

在这里插入图片描述
可以看到方法只执行了一次,这是因为第二次调用并没有去执行,使用的是缓存结果。

当调用传递的参数不一样时,会被认为是两次不用的调用:

在这里插入图片描述
当指定 key时,会根据 key 的不同做出判断,如果 两次调用 key 相同,则只调用一次:

这里虽然有多个参数,但是可以指定一个key,比如指定 id 为 key:
在这里插入图片描述
可以看到此时尽管传递的参数不同,但是只调用了一次:

在这里插入图片描述

(3)自定义 keyGenerator

如果对 key 有复杂的要求,可以自定义 keyGenerator
比如这里我想要的 key 格式为:方法名:参数

//自定义 keyGenerator,将返回值当做 key
@Component
public class MyKeyGenerator implements KeyGenerator {
    
    
    @Override
    public Object generate(Object o, Method method, Object... objects) {
    
    
        //可以根据自己的需求返回 key
        return method.getName() + ":" + Arrays.toString(objects);
    }
}

在这里插入图片描述
存储的key:

在这里插入图片描述

(4)@CacheEvict

这个注解一般加在删除方法上,当数据库中的数据删除后,相关的缓存数据也要自动清除,该注解在使用的时候也可以配置按照某种条件删除(condition属性)或者或者配置清除所有缓存(allEntries属性),示例代码如下:

  @CacheEvict
    public void deleteUserById(Integer id) {
    
    
        System.out.println("deleteUserById>>>" + id);
    }

可以看到第二次没有使用缓存,重新调用了一次:

在这里插入图片描述

(5)@CachePut

这个注解一般加在更新方法上,当数据库中的数据更新后,缓存中的数据也要跟着更新,使用该注解,可以将方法的返回值自动更新到已经存在的key上,示例代码如下:

  @CachePut(key = "#user.id")
    public User updateUserById(User user) {
    
    
        return user;
    }

可以看到只调用了一次,第二次直接使用的是缓存,但是此时的缓存是已经更新过的缓存。

在这里插入图片描述

三、总结

在Spring Boot中,使用Redis缓存,既可以使用RedisTemplate自己来实现,也可以使用使用这种方式,这种方式是Spring Cache提供的统一接口,实现既可以是Redis,也可以是Ehcache或者其他支持这种规范的缓存框架。从这个角度来说,Spring Cache和Redis、Ehcache的关系就像JDBC与各种数据库驱动的关系。

参考雨哥的视频

猜你喜欢

转载自blog.csdn.net/nanhuaibeian/article/details/108470086