• SpringBoot缓存


    目录

    缓存支持

     缓存集成

    redis缓存集成


    缓存支持

    Spring 框架只提供抽象,不提供具体的缓存存储,底层需要依赖第三方存储组件,如果当前应用没有注册CacheManager 或者 CacheResolver 实例,Spring Boot 会按以下缓存组件的顺序来检测:

    1. Generic
    2. JCache (SR-107)(EhCache 3, Hazelcast, Infinispan 等等)
    3. Hazelcast
    4. lnfinispan
    5. Couchbase
    6. redis

    ........

    Spring Boot的自动配置类为:CacheAutoConfiguration,在 CacheAutoConfiguration 缓存自动配置类中引入了 CacheConfigurationImportSelector 配置选择器:

    1. @AutoConfiguration(after = { CouchbaseDataAutoConfiguration.class, HazelcastAutoConfiguration.class,
    2. HibernateJpaAutoConfiguration.class, RedisAutoConfiguration.class })
    3. @ConditionalOnClass(CacheManager.class)
    4. @ConditionalOnBean(CacheAspectSupport.class)
    5. @ConditionalOnMissingBean(value = CacheManager.class, name = "cacheResolver")
    6. @EnableConfigurationProperties(CacheProperties.class)
    7. @Import({ CacheConfigurationImportSelector.class, CacheManagerEntityManagerFactoryDependsOnPostProcessor.class })
    8. public class CacheAutoConfiguration {
    9. ...
    10. static class CacheConfigurationImportSelector implements ImportSelector {
    11. @Override
    12. public String[] selectImports(AnnotationMetadata importingClassMetadata) {
    13. CacheType[] types = CacheType.values();
    14. String[] imports = new String[types.length];
    15. for (int i = 0; i < types.length; i++) {
    16. imports[i] = CacheConfigurations.getConfigurationClass(types[i]);
    17. }
    18. return imports;
    19. }
    20. }

    该选择器通过 CacheConfiqurations 缓存配置类来选择对应缓存组件的配置类:

    1. final class CacheConfigurations {
    2. private static final Map<CacheType, String> MAPPINGS;
    3. static {
    4. Map<CacheType, String> mappings = new EnumMap<>(CacheType.class);
    5. mappings.put(CacheType.GENERIC, GenericCacheConfiguration.class.getName());
    6. mappings.put(CacheType.HAZELCAST, HazelcastCacheConfiguration.class.getName());
    7. mappings.put(CacheType.INFINISPAN, InfinispanCacheConfiguration.class.getName());
    8. mappings.put(CacheType.JCACHE, JCacheCacheConfiguration.class.getName());
    9. mappings.put(CacheType.COUCHBASE, CouchbaseCacheConfiguration.class.getName());
    10. mappings.put(CacheType.REDIS, RedisCacheConfiguration.class.getName());
    11. mappings.put(CacheType.CAFFEINE, CaffeineCacheConfiguration.class.getName());
    12. mappings.put(CacheType.CACHE2K, Cache2kCacheConfiguration.class.getName());
    13. mappings.put(CacheType.SIMPLE, SimpleCacheConfiguration.class.getName());
    14. mappings.put(CacheType.NONE, NoOpCacheConfiguration.class.getName());
    15. MAPPINGS = Collections.unmodifiableMap(mappings);
    16. }
    17. ...代码...
    18. }

     缓存集成

    依赖配置:

    1. <dependency>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-cache</artifactId>
    4. </dependency>

    加入依赖后,通过使用@EnableCaching注解来启用缓存功能。通过参数type指定要使用的缓存组件,以redis为示例:

    1. spring:
    2. cache:
    3. type: redis

    禁用缓存

    1. spring:
    2. cache:
    3. type: none

     缓存类型type的值

    • GENERIC: 通用缓存类型
    • HAZELCAST: Hazelcast 缓存类型
    • INFINISPAN: Infinispan 缓存类型
    • JCACHE: JCache 缓存类型
    • COUCHBASE: Couchbase 缓存类型
    • REDIS: Redis 缓存类型
    • CAFFEINE: Caffeine 缓存类型
    • CACHE2K: Cache2k 缓存类型
    • SIMPLE: 简单缓存类型
    • NONE: 无缓存类型

    redis缓存集成

    Spring Boot 2.7中使用@EnableCaching注解启用缓存功能时,如果你想使用Redis作为缓存存储,你需要在配置文件中指定Redis的相关配置。

    application.properties或application.yml文件中添加以下配置:

    1. spring:
    2. cache:
    3. type: redis # 指定缓存使用redis
    4. redis:
    5. host: 127.0.0.1 # Redis服务器地址
    6. database: 1 # Redis数据库索引(默认为0)
    7. port: 6379 # Redis服务器连接端口
    8. password: # Redis服务器连接密码(默认为空)

    依赖配置:

    1. <dependency>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-data-redis</artifactId>
    4. </dependency>

     配置缓存管理器:

    1. @Configuration
    2. @EnableCaching
    3. public class RedisTemplateConfiguration {
    4. /**
    5. * 默认过期时长,单位:秒
    6. */
    7. @Getter
    8. private long expire = 60 * 60 * 24;
    9. @Bean
    10. public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
    11. RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
    12. redisTemplate.setKeySerializer(RedisSerializer.string());
    13. redisTemplate.setHashKeySerializer(RedisSerializer.string());
    14. redisTemplate.setValueSerializer(RedisSerializer.java());
    15. redisTemplate.setHashValueSerializer(RedisSerializer.java());
    16. redisTemplate.setConnectionFactory(factory);
    17. return redisTemplate;
    18. }
    19. @Bean
    20. public HashOperations<String, String, Object> hashOperations(RedisTemplate<String, Object> redisTemplate) {
    21. return redisTemplate.opsForHash();
    22. }
    23. @Bean
    24. public ValueOperations<String, String> valueOperations(RedisTemplate<String, String> redisTemplate) {
    25. return redisTemplate.opsForValue();
    26. }
    27. @Bean
    28. public ListOperations<String, Object> listOperations(RedisTemplate<String, Object> redisTemplate) {
    29. return redisTemplate.opsForList();
    30. }
    31. @Bean
    32. public SetOperations<String, Object> setOperations(RedisTemplate<String, Object> redisTemplate) {
    33. return redisTemplate.opsForSet();
    34. }
    35. @Bean
    36. public ZSetOperations<String, Object> zSetOperations(RedisTemplate<String, Object> redisTemplate) {
    37. return redisTemplate.opsForZSet();
    38. }
    39. }

  • 相关阅读:
    <C++>类和对象-中
    redis实战-redis实现异步秒杀优化
    移动平台 GPU 架构扫盲
    JAVA大学生学业互助与交流平台计算机毕业设计Mybatis+系统+数据库+调试部署
    排序算法问题
    《css》- 47个不为人知的高阶操作(下篇20-47, 7K长文多图预警)
    6191. 好路径的数目 并查集
    ASR语音识别纠错-fast correct
    gns相关状态查看
    JVM 内存和 GC 算法
  • 原文地址:https://blog.csdn.net/weixin_43522117/article/details/136436787