博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
springboot2.0整合redis缓存注解
阅读量:4164 次
发布时间:2019-05-26

本文共 4156 字,大约阅读时间需要 13 分钟。

一、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@Beanpublic RedisCacheManager myRedisCacheManager(RedisConnectionFactory factory) {
RedisSerializer
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:

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/

你可能感兴趣的文章
Java多线程(2) - 多线程之线程安全详解(synchronized、Lock)
查看>>
OKR与CFR管理模式(二)-CFR与OKR的绩效管理
查看>>
Java多线程(3) - 多线程之死锁
查看>>
Java多线程(4) - 多线程之Volatile关键字、ThreadLocal、Atomic系列类、CAS
查看>>
Java多线程(5) - 多线程之线程通讯(一)(wait、notify、join、yield、sleep区别与应用)
查看>>
Java多线程(6) - 多线程之线程通讯(二)(wait与notify案例、守护线程)
查看>>
什么是项目管理?怎么管?(二)
查看>>
Java多线程(7) - 多线程之线程停止方式
查看>>
Java设计模式(1) - 单例设计模式多种写法
查看>>
Java设计模式(2) - 工厂设计模式
查看>>
Java多线程(8) - 同步(并发)类容器详解(CopyOnWrite容器、ConcurrentMap容器、Queue队列容器)
查看>>
Java设计模式(3) - 多线程并发设计模式 - Future设计模式
查看>>
Java设计模式(5) - 多线程并发设计模式 - 生产者-消费者设计模式多种写法
查看>>
Java多线程(9) - 多线程 - 线程池详解与使用示例
查看>>
Java多线程(10) - 多线程 - CountDownLatch、CyclicBarrier、Semaphore使用示例详解
查看>>
Java多线程(11) - 多线程 - 锁详解:重入锁、公平锁、非公平锁、读写锁、不可重入锁、自旋锁、独享锁、共享锁、互斥锁、悲观锁、乐观锁、分段锁、偏向锁、轻量级锁、重量级锁、CAS算法原理
查看>>
Java网络编程(10) - Netty网络编程常见问题与疑问
查看>>
Spring源码(4) - Spring AOP源码分析
查看>>
Spring源码(5) - Spring事务入门与源码分析
查看>>
大胆的做梦与执行
查看>>