歡迎光臨
每天分享高質量文章

Redis 分佈式快取 Java  框架

(給ImportNew加星標,提高Java技能)

 

來自:唐尤華,

https://dzone.com/articles/java-distributed-caching-in-redis

 

為什麼要在 Java 分佈式應用程式中使用快取?

 

在提高應用程式速度和性能上,每一毫秒都很重要。根據谷歌的一項研究,假如一個網站在3秒鐘或更短時間內沒有加載成功,會有 53% 的手機用戶會離開。

 

快取是讓分佈式應用程式加速的重要技術之一。儲存的信息越接近 CPU,訪問速度就越快。從 CPU 快取中加載資料比從 RAM 中加載要快得多,比從硬碟或網絡上加載要快得多得多。

 

要儲存經常訪問的資料,分佈式應用程式需要在多台機器中維護快取。分佈式快取是降低分佈式應用程式延遲、提高併發性和可伸縮性的一種重要策略。

 

Redis 是一種流行的開源記憶體資料儲存,可用作資料庫、快取或訊息代理。由於是從記憶體而非磁盤加載資料,Redis 比許多傳統的資料庫解決方案更快。

 

然而,對開發者來說讓 Redis 分佈式快取正確工作是一個巨大挑戰。例如,必須謹慎處理本地快取失效,即替換或刪除快取條目。每次更新或刪除儲存計算機本地快取中的信息時,必須更新分佈式快取系統所有計算機記憶體中的快取。

 

好訊息是,有一些類似 Redisson 這樣的 Redis 框架,可以幫助構建應用程式所需的分佈式快取。下一節將討論 Redisson 中分佈式快取的三個重要實現:Maps、Spring Cache 和 JCache。

 

1. Redisson 分佈式快取

 

Redisson 是一個基於 Redis 的框架,用 Java 實現了一個 Redis 包裝器(wrapper)和接口。Redisson 包含許多常見的 Java 類,例如分佈式物件分佈式服務分佈式鎖和同步器,以及分佈式集合。正如下麵即將介紹的,其中一些接口同時支持分佈式快取和本地快取。

 

2. Map

 

Map 是 Java 最有用的集合之一。Redisson 提供了一個名為 RMap 的 Java Map 實現,支持本地快取。

 

如果希望執行多個讀操作或網絡環回(roundtrip),應使用支持本地快取的 RMap。通過本地儲存 Map 資料,RMap 比不啟用本地快取時快45倍。通用分佈式快取使用 RMapCache,本地快取使用 RLocalCachedMap

 

Redis 引擎自身能夠執行快取,不需要在客戶端執行代碼。然而,雖然本地快取能顯著提高讀取速度,但需要由開發人員維護,並且可能需要一些開發工作。Redisson 為開發人員提供了 RLocalCachedMap 物件,讓本地快取實現起來更容易。

下麵的代碼展示瞭如何初始化 RMapCache 物件:

 

RMapCache map = redisson.getMapCache("anyMap");
map.put("key1", new SomeObject(), 10, TimeUnit.MINUTES, 10, TimeUnit.SECONDS);

 

上面的代碼將字串 “key1” 放到 RMapCache 中,並與 SomeObject() 關聯。然後它指定了兩個引數,TTL設為10分鐘、最大空閑時間10秒。

 

當不再需要時,應銷毀 RMapCache 物件:

 

map.destroy();

 

Redisson 關閉後不用再做銷毀操作。

 

3. Spring Cache

 

Spring 是一個用於構建企業級 Web 應用程式的 Java 框架,也提供了快取支持

Redisson 包含了 Spring 快取功能,提供兩個物件: RedissonSpringCacheManager 和 RedissonSpringLocalCachedCacheManager。 RedissonSpringLocalCachedCacheManager 支持本地快取。

下麵是一個 RedissonSpringLocalCachedCacheManager 物件的示例配置:

 

@Configuration
@ComponentScan
@EnableCaching
public static class Application {
    @Bean(destroyMethod="shutdown")
    RedissonClient redisson() throws IOException {
        Config config = new Config();
        config.useClusterServers()
                .addNodeAddress("127.0.0.1:7004", "127.0.0.1:7001");
        return Redisson.create(config);
    }
    @Bean
    CacheManager cacheManager(RedissonClient redissonClient) {
        Map config = new HashMap();
        // 新建 "testMap" 快取:ttl=24分鐘,maxIdleTime=12分鐘
        config.put("testMap", new CacheConfig(24*60*1000, 12*60*1000));
        return new RedissonSpringCacheManager(redissonClient, config);
    }
}

 

此外,還可以讀取 JSON 或 YAML 檔案配置 RedissonSpringCacheManager。

 

與 RMaps 一樣,每個 RedissonSpringCacheManager 實體都有兩個重要引數: ttl(生存時間)和 maxIdleTime。如果這些引數設為0或者沒有定義,那麼資料將無限期地保留在快取中。

 

4. JCache

 

JCache 是一個 Java 快取 API,允許開發人員從快取臨時儲存、檢索、更新和刪除物件。

 

Redisson 提供了 Redis 的 JCache API 實現。下麵是在 Redisson 中使用預設配置呼叫 JCache API 的示例:

 

MutableConfiguration config = new MutableConfiguration<>();
CacheManager manager = Caching.getCachingProvider().getCacheManager();
Cache cache = manager.createCache("namedCache", config);

 

此外,還可以使用自定義配置檔案、Redisson Config 物件或 Redisson RedissonClient 物件配置 JCache。例如,下麵的代碼使用自定義 Redisson 配置來呼叫 JCache:

 

MutableConfiguration jcacheConfig = new MutableConfiguration<>();
Config redissonCfg = ...
Configuration config = RedissonConfiguration.fromConfig(redissonCfg, jcacheConfig);
CacheManager manager = Caching.getCachingProvider().getCacheManager();
Cache cache = manager.createCache("namedCache", config);

 

Redisson 的 JCache 實現已經通過 JCache TCK 的所有測試。你也可以自行驗證

 

讓我們愉快地使用快取吧!

 

看完本文有收穫?請轉發分享給更多人

關註「ImportNew」,提升Java技能

喜歡就點「好看」唄~

 

    赞(0)

    分享創造快樂