Springboot Cache缓存

JSR-107、Spring缓存抽象、整合Redis

Java Caching定义了5个核心接口,分别是CachingProvider, CacheManager, Cache, Entry和 Expiry。
CachingProvider定义了创建、配置、获取、管理和控制多个CacheManager。一个应用可以在运行期访问多个CachingProvider。
CacheManager定义了创建、配置、获取、管理和控制多个唯一命名的Cache,这些Cache存在于CacheManager的上下文中。一个CacheManager仅被一个CachingProvider所拥有。Cache是一个类似Map的数据结构并临时存储以Key为索引的值。一个Cache仅被一个CacheManager所拥有。
Entry是一个存储在Cache中的key-value对。
Expiry 每一个存储在Cache中的条目有一个定义的有效期。一旦超过这个时间,条目为过期的状态。一旦过期,条目将不可访问、更新和删除。缓存有效期可以通过ExpiryPolicy设置。

Springboot Cache缓存_第1张图片
Spring缓存抽象
Spring从3.1开始定义了org.springframework.cache.Cache
和org.springframework.cache.CacheManager接口来统一不同的缓存技术; 并支持使用JCache(JSR-107)注解简化我们开发;
•Cache接口为缓存的组件规范定义,包含缓存的各种操作集合;
•Cache接口下Spring提供了各种xxxCache的实现;如RedisCache,EhCacheCache ,ConcurrentMapCache等;

•每次调用需要缓存功能的方法时,Spring会检查检查指定参数的指定的目标方法是否 已经被调用过;如果有就直接从缓存中获取方法调用后的结果,如果没有就调用方法并缓存结果后返回给用户。下次调用直接从缓存中获取。
•使用Spring缓存抽象时我们需要关注以下两点;
1、确定方法需要被缓存以及他们的缓存策略
2、从缓存中读取之前缓存存储的数据
Springboot Cache缓存_第2张图片
Cache 缓存接口,定义缓存操作。实现有:RedisCache、EhCacheCache、
ConcurrentMapCache等
CacheManager 缓存管理器,管理各种缓存(Cache)组件
@Cacheable 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存
@CacheEvict 清空缓存
@CachePut 保证方法被调用,又希望结果被缓存。
@EnableCaching 开启基于注解的缓存
keyGenerator 缓存数据时key生成策略
serialize 缓存数据时value序列化策略

Springboot Cache缓存_第3张图片
Springboot Cache缓存_第4张图片
缓存使用
•1、引入spring-boot-starter-cache模块
•2、@EnableCaching开启缓存
•3、使用缓存注解
•4、切换为其他缓存

整合redis实现缓存
1.引入spring-boot-starter-data-redis
2.application.yml配置redis连接地址
3.使用RestTemplate操作redis

  • 1.redisTemplate.opsForValue();//操作字符串
    2.redisTemplate.opsForHash();//操作hash
    3.redisTemplate.opsForList();//操作list
    4.redisTemplate.opsForSet();//操作set
    5.redisTemplate.opsForZSet();//操作有序set

自己配置redisCacheManager的序列化器

@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport{
     
@Bean
public CacheManager cacheManager(RedisConnectionFactory connectionFactory) {
     
        //初始化一个RedisCacheWriter
        RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory);

        Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);

        RedisSerializationContext.SerializationPair<Object> pair = RedisSerializationContext.SerializationPair.fromSerializer(serializer);

        RedisCacheConfiguration defaultCacheConfig=RedisCacheConfiguration.defaultCacheConfig().serializeValuesWith(pair);

        return new RedisCacheManager(redisCacheWriter, defaultCacheConfig);
}
}
@Mapper
@CacheConfig(cacheNames = "users")
public interface UserMapper {
     

   @Insert("insert into user(name,age) values(#{name},#{age})")
   int addUser(@Param("name")String name,@Param("age")String age);
   
   @Select("select * from user where id =#{id}")
   @Cacheable(key ="#p0")
   User findById(@Param("id") String id);
   
   @CachePut(key = "#p0")
   @Update("update user set name=#{name} where id=#{id}")
   void updataById(@Param("id")String id,@Param("name")String name);
   
   //如果指定为 true,则方法调用后将立即清空所有缓存
   @CacheEvict(key ="#p0",allEntries=true)
   @Delete("delete from user where id=#{id}")
   void deleteById(@Param("id")String id);
   
}

@Cacheable将查询结果缓存到redis中,(key="#p0")指定传入的第一个参数作为redis的key。
@CachePut,指定key,将更新的结果同步到redis中
@CacheEvict,指定key,删除缓存数据,allEntries=true,方法调用后将立即清除缓存

你可能感兴趣的:(springboot)