Fork me on GitHub

Spring Boot 中使用 Redis 做集中式缓存

Spring Boot 文档中定义了对项目中的缓存,提供的一种简便的解决方案,可以通过注解的方式设置需要缓存的方法,从而减少缓存代码和业务代码的耦合,并且可以方便得集成第三方缓存技术。

缓存配置

在 Spring Boot 中通过 @EnableCaching 注解自动化配置合适的缓存管理器(CacheManager),Spring Boot 将根据下面的顺序去侦测缓存提供者:

也可以通过配置属性 spring.cache.type 来强制指定。

Maven 

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

Application

@EnableTransactionManagement
@SpringBootApplication
@EnableCaching
public class SunWebApplication {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Bean
    public Object testBean(PlatformTransactionManager platformTransactionManager){
        logger.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>> platformTransactionManager name: " + platformTransactionManager.getClass().getName());
        return new Object();
    }

    public static void main(String[] args) {
        SpringApplication.run(SunWebApplication.class, args);
    }
}

Service

@CacheConfig(cacheNames = "users")
public interface UserService {


    /**
     * 根据用户名查询用户信息
     * @param username
     * @return
     */
    @Cacheable
    Users findByUsername(String username);
}

yml

cache:
    type: redis
  redis:
    host: 172.0.0.1
    port: 6379
    password: "pwd"
    database: 0
    timeout: 50ms

注解的使用

@Cacheable
标记方法为被缓存的方法,当通过参数拼接出的key在缓存中找不到对应的value时,会调用该方法,然后将参数以一定规则拼接为key,方法的返回值作为value记录到缓存数据库中。常用于select操作。
主要属性:
** cacheNames(value) **:缓存名,可指定多个。
** key **:缓存的key的取值规则,可通过SpEl表达式自定义,如#code,则表示key取值为传入的code参数。为空则默认将所有参数拼接为一个key值。
** condition **:记录缓存的条件,可通过SpEl表达式自定义,保证表达式返回true或false,返回true时才会记录缓存。

@CacheEvict
标记方法为更新缓存方法,当此方法被调用后,会清空缓存,从而让被@Cacheable标记的方法在调用时重新获取值存入缓存。常用于delete操作。
主要属性:
前三个属性与@Cacheable注解类似,除了condition,这里的condition是返回true时才会清除缓存。
** allEntries **:是否清空所有缓存,默认为false。默认情况是只有key值相同的缓存才会被清除,若指定为true,则清空所有cacheName相同的缓存记录。
** beforeInvocation **:是否在调用方法之前就执行清除缓存操作,默认是false,当调用方法抛出异常时不会清除缓存,如果指定为true就表示无论方法是否执行成功,都一定会清除缓存。

@CachePut
与@Cacheable注解一样都可以使标记方法被缓存,但不同之处在于,@CachePut标记的方法无论是否有缓存记录都会被执行,因此常用于update操作。

@CacheConfig
作用于类上,可以为此类所有的方法上的缓存注解设置默认的属性。
如:
@CacheConfig(cacheNames = "users") 则标记的类的所有方法上的缓存相关注解的cacheNames属性默认都为"users"。

REFER:
https://github.com/alibaba/jetcache
https://gitee.com/ld/J2Cache
https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-caching

posted @ 2018-10-03 14:58  花儿笑弯了腰  阅读(527)  评论(0编辑  收藏  举报