springboot2.0整合redis缓存注解

一、JSR107缓存规范

  • CachingProvider 【缓存提供者】

    定义了创建、配置、获取、管理和控制多个CacheManager。一个应用可以在运行期访问多个CachingProvider

  • CacheManager 【缓存管理】

    定义了创建、配置、获取、管理和控制多个唯一命名的Cache,这些Cache存在于CacheManager的上下文中。一个CacheManager仅被一个CachingProvider所拥有

  • Cache 【缓存】

    是一个类似Map的数据结构并临时存储以Key为索引的值。一个Cache仅被一个CacheManager所拥有

  • Entry 【条目】

    是一个存储在Cache中的key-value对

  • Expiry 【到期】

    每一个存储在Cache中的条目有一个定义的有效期。一旦超过这个时间,条目为过期的状态。一旦过期,条目将不可访问、更新和删除。缓存有效期可以通过ExpiryPolicy设置

springboot 常用缓存注解

Cache 缓存接口,定义缓存操作。实现有:RedisCache、EhCacheCache、ConcurrentMapCache等
CacheManager 缓存管理器,管理各种缓存(Cache)组件
@Cacheable 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存(添加缓存)
@CacheEvict 清空缓存
@CachePut 保证方法被调用,又希望结果被缓存(修改缓存)
@EnableCaching 开启基于注解的缓存
keyGenerator 缓存数据时key生成策略
serialize 缓存数据时value序列化策略

1.开启缓存的注解,启动类上 @EnableCaching

2.标注缓存注解
CacheManager管理多个cache组件的,对缓存的真正CRUD操作在Cache组件中,每一个缓存组件有自己唯一一个名字;

注解说明:

@Cacheable 将【方法】的运行结果进行缓存

注解属性说明:

属性 属性值 备注
value / cacheNames 例:test 指定缓存的名字
key 例:#id 缓存数据使用的key,默认是使用方法的参数值 编写spel
keyGenerator 例: 写一个配置类加上注解 @Configuration 【key和keyGenerator 二选一】
cacheManage 例: 写一个配置类加上注解 @Configuration 缓存管理器【指定当前缓存放在哪个管理器中】
condition 例: #a0 > 1 符合指定条件的情况下才缓存
unless 例: #p0 <= 1 当unless指定条件为true,方法的返回值就不会缓存
sync 例: false 是否异步处理,默认为false

key的spel表达式部分语法:

 /**
 *  key 的方法属性:  spel表达式:
 *      #root.methodName     获取到被调用的【方法名字】
 *      #root.method.name    获取到被调用的【方法名字】
 *      #root.target         当前被调用的【目标对象】
 *      #root.targetClass    当前被调用的【目标对象类】
 *      #root.args[0]        当前被调用的方法的【参数列表】
 *      #root.caches[0].name 当前方法被调用使用的缓存列表
 *      #iban、#a0、#p0      #参数名,  #a0 或 #p0 ,0代表参数的索引
 *      #result              方法执行后的返回值
 */

keyGenerator自定义key的生成的配置:

 /**
 *  自定义生成 key 的生成规则
 *  Bean的默认名字为 【方法名】
 */
@Bean(value = "myKeyGenerator")
public KeyGenerator myKeyGenerator(){
    return new KeyGenerator() {
        @Override
        public Object generate(Object target, Method method, Object... params) {
            // 自定义key的生成策略
            return method.getName()+ Arrays.asList(params).toString();
        }
    };
}

cacheManage缓存管理器配

/**
 *  【redis缓存管理与springboot注解整合】
 *  @Primary 表示这是默认的 缓存管理器
 *  Bean的名字默认为   【方法名】
 */
@Primary
@Bean
public RedisCacheManager myRedisCacheManager(RedisConnectionFactory factory) {
    RedisSerializer<String> redisSerializer = new StringRedisSerializer();
    Jackson2JsonRedisSerializer jackson2JsonRedisSerializer =
            new Jackson2JsonRedisSerializer(Object.class);
    //解决查询缓存转换异常的问题
    ObjectMapper om = new ObjectMapper();
    om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
    jackson2JsonRedisSerializer.setObjectMapper(om);
    // 配置序列化(解决乱码的问题)
    RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
            .entryTtl(Duration.ofMillis(-1))
            .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
            .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
            .disableCachingNullValues();
    RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
            .cacheDefaults(config)
            .transactionAware()
            .build();
    return cacheManager;
}

@CachePut 修改数据的同时,也会修改缓存

属性值同上

@CacheEvict 清空缓存

属性 属性值 备注
allEntries 例: false 是否清空所有缓存
beforeInvocation 例: false 是否在方法执行之前清空缓存

@Caching 多条件复制缓存条件

 @Caching(
        cacheable = {
                @Cacheable(cacheNames = "uav2",key = "#p0")
        },
        put = {
                // cachePut 出现时,这个方法一定会执行
                @CachePut(cacheNames = "uav2",key = "#result.id"),
                @CachePut(cacheNames = "uav2",key = "#result.username")
        }
)

@CacheConfig 用在类上面,指定当前类下面缓存的通用属性

引入maven:

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

部分配置application.yml

spring:
  redis:
    host: 47.101.50.211
    database: 1
    port: 6379
    password: 123456
    jedis:
      pool:
        # 连接池最大连接数,负值表示没有限制
        max-active: 100
        # 连接池最大阻塞等待时间 -1 表示没有限制
        max-wait: -1ms
        # 连接池中最大空闲连接
        max-idle: 10
        # 连接池中最小空闲连接
        min-idle: 0
    # 连接超时时间(毫秒)
    timeout: 1000
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章