- Redisson 分布式快取
- Map
- Spring Cache
- JCache
- 最新Java面試題

為什么要在 Java 分布式應用程式中使用快取?
在提高應用程式速度和性能上,每一毫秒都很重要,根據谷歌的一項研究,假如一個網站在3秒鐘或更短時間內沒有加載成功,會有 53% 的手機用戶會離開,
快取是讓分布式應用程式加速的重要技術之一,存盤的資訊越接近 CPU,訪問速度就越快,從 CPU 快取中加載資料比從 RAM 中加載要快得多,比從硬碟或網路上加載要快得多得多,
要存盤經常訪問的資料,分布式應用程式需要在多臺機器中維護快取,分布式快取是降低分布式應用程式延遲、提高并發性和可伸縮性的一種重要策略,
Redis 是一種流行的開源記憶體資料存盤,可用作資料庫、快取或訊息代理,由于是從記憶體而非磁盤加載資料,Redis 比許多傳統的資料庫解決方案更快,
然而,對開發者來說讓 Redis 分布式快取正確作業是一個巨大挑戰,例如,必須謹慎處理本地快取失效,即替換或洗掉快取條目,每次更新或洗掉存盤計算機本地快取中的資訊時,必須更新分布式快取系統所有計算機記憶體中的快取,
好訊息是,有一些類似 Redisson 這樣的 Redis 框架,可以幫助構建應用程式所需的分布式快取,下一節將討論 Redisson 中分布式快取的三個重要實作:Maps、Spring Cache 和 JCache,
- 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<String, SomeObject> 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<String, CacheConfig> config = new HashMap<String, CacheConfig>();
// 新建 "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<String, String> config = new MutableConfiguration<>();
CacheManager manager = Caching.getCachingProvider().getCacheManager();
Cache<String, String> cache = manager.createCache("namedCache", config);
此外,還可以使用自定義組態檔、Redisson Config 物件或 Redisson RedissonClient 物件配置 JCache,例如,下面的代碼使用自定義 Redisson 配置來呼叫 JCache:
MutableConfiguration<String, String> jcacheConfig = new MutableConfiguration<>();
Config redissonCfg = ...
Configuration<String, String> config = RedissonConfiguration.fromConfig(redissonCfg, jcacheConfig);
CacheManager manager = Caching.getCachingProvider().getCacheManager();
Cache<String, String> cache = manager.createCache("namedCache", config);
Redisson 的 JCache 實作已經通過 JCache TCK 的所有測驗,你也可以自行驗證,
讓我們愉快地使用快取吧!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/262355.html
標籤:Java
下一篇:學習筆記
