本文共 4156 字,大约阅读时间需要 13 分钟。
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组件中,每一个缓存组件有自己唯一一个名字;注解说明:
注解属性说明:
属性 | 属性值 | 备注 |
---|---|---|
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@Beanpublic RedisCacheManager myRedisCacheManager(RedisConnectionFactory factory) { RedisSerializerredisSerializer = 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;}
属性值同上
@CacheEvict 清空缓存
属性 | 属性值 | 备注 |
---|---|---|
allEntries | 例: false | 是否清空所有缓存 |
beforeInvocation | 例: false | 是否在方法执行之前清空缓存 |
@Caching( cacheable = { @Cacheable(cacheNames = "uav2",key = "#p0") }, put = { // cachePut 出现时,这个方法一定会执行 @CachePut(cacheNames = "uav2",key = "#result.id"), @CachePut(cacheNames = "uav2",key = "#result.username") })
引入maven:
org.springframework.boot spring-boot-starter-data-redis
部分配置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
转载地址:http://lhxxi.baihongyu.com/