• 14.2. Spring Cache整合
    • 14.2.1. Spring Cache - 本地缓存和数据分片
    • 14.2.2. Spring Cache - JSON和YAML配置文件格式:

    14.2. Spring Cache整合

    Redisson提供了将Redis无缝整合到Spring框架的能力。Redisson依照Spring Cache标准提供了基于Redis的Spring缓存实现。 每个缓存(Cache)实例都提供了了两个重要的可配置参数:过期时间(ttl)最长空闲时间(maxIdleTime),如果这两个参数都未指定或值为0,那么实例管理的数据将永久保存。配置范例:

    1. @Configuration
    2. @ComponentScan
    3. @EnableCaching
    4. public static class Application {
    5. @Bean(destroyMethod="shutdown")
    6. RedissonClient redisson() throws IOException {
    7. Config config = new Config();
    8. config.useClusterServers()
    9. .addNodeAddress("127.0.0.1:7004", "127.0.0.1:7001");
    10. return Redisson.create(config);
    11. }
    12. @Bean
    13. CacheManager cacheManager(RedissonClient redissonClient) {
    14. Map<String, CacheConfig> config = new HashMap<String, CacheConfig>();
    15. // 创建一个名称为"testMap"的缓存,过期时间ttl为24分钟,同时最长空闲时maxIdleTime为12分钟。
    16. config.put("testMap", new CacheConfig(24*60*1000, 12*60*1000));
    17. return new RedissonSpringCacheManager(redissonClient, config);
    18. }
    19. }

    Spring Cache也可以通过JSON或YAML配置文件来配置:

    1. @Configuration
    2. @ComponentScan
    3. @EnableCaching
    4. public static class Application {
    5. @Bean(destroyMethod="shutdown")
    6. RedissonClient redisson(@Value("classpath:/redisson.json") Resource configFile) throws IOException {
    7. Config config = Config.fromJSON(configFile.getInputStream());
    8. return Redisson.create(config);
    9. }
    10. @Bean
    11. CacheManager cacheManager(RedissonClient redissonClient) throws IOException {
    12. return new RedissonSpringCacheManager(redissonClient, "classpath:/cache-config.json");
    13. }
    14. }

    14.2.1. Spring Cache - 本地缓存和数据分片

    Redisson提供了几种不同的Spring Cache Manager,按功能可以分为以下两大类:

    • 本地缓存(Local Cache) 类 — 本地缓存(Local Cache)也叫就近缓存(Near Cache)。这类Spring Cache的使用主要用于在特定的场景下,映射缓存(MapCache)上的高度频繁的读取操作,使网络通信都被视为瓶颈的情况。Redisson与Redis通信的同时,还将部分数据保存在本地内存里。这样的设计的好处是它能将读取速度提高最多 45倍

    • 数据分片(Sharding) 类 — 数据分片(Sharding)类仅适用于Redis集群环境下,因此带有数据分片(Sharding)功能的Spring Cache也叫集群分布式Spring缓存。它利用分库的原理,将单一一个缓存结构切分为若干个小的缓存,并均匀的分布在集群中的各个槽里。这样的设计能使Spring缓存突破Redis自身的容量限制,让其容量随集群的扩大而增长。在扩容的同时,还能够使读写性能和元素淘汰处理能力随之成线性增长。

    以下列表是Redisson提供的所有Spring Cache Manager的名称及其特性:

    类名 本地缓存功能 Local Cache 数据分片功能 Sharding
    RedissonSpringCacheManager  No No
    RedissonClusteredSpringLocalCachedCacheManager仅限于Redisson PRO版本 Yes No
    RedissonClusteredSpringCacheManager仅限于Redisson PRO版本 No Yes
    RedissonSpringClusteredLocalCachedCacheManager仅限于Redisson PRO版本 Yes Yes

    在初始化org.redisson.spring.cache.RedissonSpringLocalCachedCacheManager对象和org.redisson.spring.cache.RedissonSpringClusteredLocalCachedCacheManager对象的时候可以通过LocalCachedMapOptions对象来配置选项。

    1. LocalCachedMapOptions options = LocalCachedMapOptions.defaults()
    2. // 淘汰机制有LFU, LRU和NONE这几种算法策略可供选择
    3. .evictionPolicy(EvictionPolicy.LFU)
    4. .cacheSize(1000)
    5. // 如果该值是`真(true)`时,在该实例执行更新和删除操作的同时,将向其他所有的相同实例发
    6. // 送针对该元素的淘汰消息。其他相同实例在收到该消息以后,会同时删除自身的缓存。下次读取
    7. // 该元素时会从Redis服务器获取。
    8. .invalidateEntryOnChange(false)
    9. // 每个Map本地缓存里元素的有效时间,默认毫秒为单位
    10. .timeToLive(10000)
    11. // 或者
    12. .timeToLive(10, TimeUnit.SECONDS)
    13. // 每个Map本地缓存里元素的最长闲置时间,默认毫秒为单位
    14. .maxIdle(10000)
    15. // 或者
    16. .maxIdle(10, TimeUnit.SECONDS);

    Redisson为每个Spring缓存实例都提供了两个很重要的参数:ttlmaxIdleTime,当两个参数设为0或为指定值时,缓存数据将永久保留。

    完整的使用范例如下:

    1. @Configuration
    2. @ComponentScan
    3. @EnableCaching
    4. public static class Application {
    5. @Bean(destroyMethod="shutdown")
    6. RedissonClient redisson() throws IOException {
    7. Config config = new Config();
    8. config.useClusterServers()
    9. .addNodeAddress("127.0.0.1:7004", "127.0.0.1:7001");
    10. return Redisson.create(config);
    11. }
    12. @Bean
    13. CacheManager cacheManager(RedissonClient redissonClient) {
    14. Map<String, CacheConfig> config = new HashMap<String, CacheConfig>();
    15. LocalCachedMapOptions options = LocalCachedMapOptions.defaults()
    16. .evictionPolicy(EvictionPolicy.LFU)
    17. .cacheSize(1000);
    18. // 创建一个名称为"testMap"的缓存,过期时间ttl为24分钟,同时最长空闲时maxIdleTime为12分钟。
    19. config.put("testMap", new LocalCachedCacheConfig(24*60*1000, 12*60*1000, options));
    20. return new RedissonSpringLocalCachedCacheManager(redissonClient, config);
    21. }
    22. }

    也可以通过JSON或YAML配置文件来设置相关缓存参数:

    1. @Configuration
    2. @ComponentScan
    3. @EnableCaching
    4. public static class Application {
    5. @Bean(destroyMethod="shutdown")
    6. RedissonClient redisson(@Value("classpath:/redisson.yaml") Resource configFile) throws IOException {
    7. Config config = Config.fromYAML(configFile.getInputStream());
    8. return Redisson.create(config);
    9. }
    10. @Bean
    11. CacheManager cacheManager(RedissonClient redissonClient) throws IOException {
    12. return new RedissonSpringLocalCachedCacheManager(redissonClient, "classpath:/cache-config.yaml");
    13. }
    14. }

    14.2.2. Spring Cache - JSON和YAML配置文件格式:

    JSON:

    1. {
    2. "testMap": {
    3. "ttl": 1440000,
    4. "maxIdleTime": 720000,
    5. "localCacheOptions": {
    6. "invalidationPolicy": "ON_CHANGE",
    7. "evictionPolicy": "NONE",
    8. "cacheSize": 0,
    9. "timeToLiveInMillis": 0,
    10. "maxIdleInMillis": 0
    11. }
    12. }
    13. }

    YAML:

    1. ---
    2. testMap:
    3. ttl: 1440000
    4. maxIdleTime: 720000
    5. localCacheOptions:
    6. invalidationPolicy: "ON_CHANGE"
    7. evictionPolicy: "NONE"
    8. cacheSize: 0
    9. timeToLiveInMillis: 0
    10. maxIdleInMillis: 0

    以上内容是名叫testMap的Spring缓存实例的配置方式。

    需要注意的是:localCacheOptions配置实例仅适用于org.redisson.spring.cache.RedissonSpringLocalCachedCacheManager类和org.redisson.spring.cache.RedissonSpringClusteredLocalCachedCacheManager类。