1、Spring Boot尚硅谷笔记整理高级篇-缓存

1、Spring Boot尚硅谷笔记整理高级篇-缓存

2、Spring Boot尚硅谷笔记整理高级篇-消息

3、Spring Boot尚硅谷笔记整理高级篇-检索

4、Spring Boot尚硅谷笔记整理高级篇-任务

5、Spring Boot尚硅谷笔记整理高级篇-安全

6、Spring Boot尚硅谷笔记整理高级篇-分布式

7、Spring Boot尚硅谷笔记整理高级篇-热部署

8、Spring Boot尚硅谷笔记整理高级篇-监控

1、Spring Boot与缓存

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

一、JSR107

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设置。
    1、Spring Boot尚硅谷笔记整理高级篇-缓存_第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、从缓存中读取之前缓存存储的数据
    1、Spring Boot尚硅谷笔记整理高级篇-缓存_第2张图片

三、几个重要概念&缓存注解

1、Spring Boot尚硅谷笔记整理高级篇-缓存_第3张图片
1、Spring Boot尚硅谷笔记整理高级篇-缓存_第4张图片
1、Spring Boot尚硅谷笔记整理高级篇-缓存_第5张图片

四、缓存使用

  • 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
  4. 配置缓存、CacheManagerCustomizers
  5. 测试使用缓存、切换缓存、 CompositeCacheManager
    Redis配置类
/**
 * @author hqp
 * redis配置类
 */
@Configuration
@EnableCaching
public class CacheConfig extends CachingConfigurerSupport{

    @SuppressWarnings("rawtypes")
    @Bean
    public CacheManager cacheManager(RedisTemplate redisTemplate) {
        RedisCacheManager rcm = new RedisCacheManager(redisTemplate);
        // 多个缓存的名称,目前只定义了一个
        rcm.setCacheNames(Arrays.asList("thisredis"));
        //设置缓存过期时间(秒)
        rcm.setDefaultExpiration(600);
        return rcm;
    }

    @Bean
    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
        StringRedisTemplate template = new StringRedisTemplate(factory);
        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);
        template.setValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }

}

可以看出,我们这里主要配置了两个东西,cacheManager方法配置了一个缓存名称,它的名字叫做thisredis,当我们要在方法注解里面使用到它的时候,就要根据名称进行区分不同缓存。同时设置了缓
存的过期时间。redisTemplate则是比较常见的,我们设置了RedisTemplate,因此在代码里面,我们也可以通过**@Autowired**注入 RedisTemplate来操作redis.
使用

接下来就是如何使用注解啦,这一步反而是最简单的。其实只用到了两个注解,@Cacheable和@CacheEvict。第一个注解代表从缓存中查询指定的key,如果有,从缓存中取,不再执行方法。如果没有则执
行方法,并且将方法的返回值和指定的key关联起来,放入到缓存中。而**@CacheEvict**则是从缓存中清除指定的key对应的数据。使用的代码如下:

@Cacheable(value="thisredis", key="'users_'+#id")
    public User findUser(Integer id) {
        User user = new User();
        user.setUsername("hlhdidi");
        user.setPassword("123");
        user.setUid(id.longValue());
        System.out.println("log4j2坏啦?");
        logger.info("输入user,用户名:{},密码:{}",user.getUsername(),user.getPassword());
        return user;
    }

    @CacheEvict(value="thisredis", key="'users_'+#id",condition="#id!=1")
    public void delUser(Integer id) {
        // 删除user
        System.out.println("user删除");
    }

可以看出,我们用@Cacheable的value属性指定具体缓存,并通过key将其放入缓存中。这里key非常灵活,支持spring的el表达式,可以通过方法参数产生可变的key(见findUser方法),也可以通过其指定在
什么情况下,使用/不使用缓存(见delUser方法)。
其实就是一个写了一个注解,然后解析注解再把相应的数据存到redis。集群一样的原理只是生成redis模板时使用集群方式。

你可能感兴趣的:(Spring,Boot)