為什么要在 Java 分布式應(yīng)用程序中使用緩存绷杜?
在提高應(yīng)用程序速度和性能上,每一毫秒都很重要濒募。根據(jù)谷歌的一項(xiàng)研究鞭盟,假如一個(gè)網(wǎng)站在3秒鐘或更短時(shí)間內(nèi)沒有加載成功,會(huì)有 53% 的手機(jī)用戶會(huì)離開瑰剃。
緩存是讓分布式應(yīng)用程序加速的重要技術(shù)之一齿诉。存儲(chǔ)的信息越接近 CPU,訪問速度就越快晌姚。從 CPU 緩存中加載數(shù)據(jù)比從 RAM 中加載要快得多粤剧,比從硬盤或網(wǎng)絡(luò)上加載要快得多得多。
要存儲(chǔ)經(jīng)常訪問的數(shù)據(jù)挥唠,分布式應(yīng)用程序需要在多臺(tái)機(jī)器中維護(hù)緩存抵恋。分布式緩存是降低分布式應(yīng)用程序延遲、提高并發(fā)性和可伸縮性的一種重要策略宝磨。
Redis 是一種流行的開源內(nèi)存數(shù)據(jù)存儲(chǔ)馋记,可用作數(shù)據(jù)庫、緩存或消息代理懊烤。由于是從內(nèi)存而非磁盤加載數(shù)據(jù),Redis 比許多傳統(tǒng)的數(shù)據(jù)庫解決方案更快宽堆。
然而腌紧,對(duì)開發(fā)者來說讓 Redis 分布式緩存正確工作是一個(gè)巨大挑戰(zhàn)。例如畜隶,必須謹(jǐn)慎處理本地緩存失效壁肋,即替換或刪除緩存條目。每次更新或刪除存儲(chǔ)計(jì)算機(jī)本地緩存中的信息時(shí)籽慢,必須更新分布式緩存系統(tǒng)所有計(jì)算機(jī)內(nèi)存中的緩存浸遗。
好消息是,有一些類似 Redisson 這樣的 Redis 框架箱亿,可以幫助構(gòu)建應(yīng)用程序所需的分布式緩存跛锌。下一節(jié)將討論 Redisson 中分布式緩存的三個(gè)重要實(shí)現(xiàn):Maps、Spring Cache 和 JCache届惋。
1. Redisson 分布式緩存
Redisson 是一個(gè)基于 Redis 的框架髓帽,用 Java 實(shí)現(xiàn)了一個(gè) Redis 包裝器(wrapper)和接口菠赚。Redisson 包含許多常見的 Java 類,例如分布式對(duì)象郑藏、分布式服務(wù)衡查、分布式鎖和同步器,以及分布式集合必盖。正如下面即將介紹的拌牲,其中一些接口同時(shí)支持分布式緩存和本地緩存。
2. Map
Map 是 Java 最有用的集合之一歌粥。Redisson 提供了一個(gè)名為 RMap 的 Java Map 實(shí)現(xiàn)塌忽,支持本地緩存。
如果希望執(zhí)行多個(gè)讀操作或網(wǎng)絡(luò)環(huán)回(roundtrip)阁吝,應(yīng)使用支持本地緩存的 RMap砚婆。通過本地存儲(chǔ) Map 數(shù)據(jù),RMap 比不啟用本地緩存時(shí)快45倍突勇。通用分布式緩存使用 RMapCache装盯,本地緩存使用 RLocalCachedMap。
Redis 引擎自身能夠執(zhí)行緩存甲馋,不需要在客戶端執(zhí)行代碼埂奈。然而,雖然本地緩存能顯著提高讀取速度定躏,但需要由開發(fā)人員維護(hù)账磺,并且可能需要一些開發(fā)工作。Redisson 為開發(fā)人員提供了 RLocalCachedMap 對(duì)象痊远,讓本地緩存實(shí)現(xiàn)起來更容易垮抗。
下面的代碼展示了如何初始化 RMapCache 對(duì)象:
RMapCache<String, SomeObject> map = redisson.getMapCache("anyMap");
map.put("key1", new SomeObject(), 10, TimeUnit.MINUTES, 10, TimeUnit.SECONDS);
上面的代碼將字符串 "key1" 放到 RMapCache 中,并與 SomeObject() 關(guān)聯(lián)碧聪。然后它指定了兩個(gè)參數(shù)冒版,TTL設(shè)為10分鐘、最大空閑時(shí)間10秒逞姿。
當(dāng)不再需要時(shí)辞嗡,應(yīng)銷毀 RMapCache 對(duì)象:
map.destroy();
Redisson 關(guān)閉后不用再做銷毀操作。
3. Spring Cache
Spring 是一個(gè)用于構(gòu)建企業(yè)級(jí) Web 應(yīng)用程序的 Java 框架滞造,也提供了緩存支持续室。
Redisson 包含了 Spring 緩存功能,提供兩個(gè)對(duì)象:
RedissonSpringCacheManager 和 RedissonSpringLocalCachedCacheManager谒养。 RedissonSpringLocalCachedCacheManager 支持本地緩存挺狰。
下面是一個(gè) RedissonSpringLocalCachedCacheManager 對(duì)象的示例配置:
@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 一樣达址,每個(gè) RedissonSpringCacheManager 實(shí)例都有兩個(gè)重要參數(shù): ttl(生存時(shí)間)和 maxIdleTime。如果這些參數(shù)設(shè)為0或者沒有定義趁耗,那么數(shù)據(jù)將無限期地保留在緩存中沉唠。
4. JCache
JCache 是一個(gè) Java 緩存 API,允許開發(fā)人員從緩存臨時(shí)存儲(chǔ)苛败、檢索满葛、更新和刪除對(duì)象。
Redisson 提供了 Redis 的 JCache API 實(shí)現(xiàn)罢屈。下面是在 Redisson 中使用默認(rèn)配置調(diào)用 JCache API 的示例:
MutableConfiguration<String, String> config = new MutableConfiguration<>();
CacheManager manager = Caching.getCachingProvider().getCacheManager();
Cache<String, String> cache = manager.createCache("namedCache", config);
此外嘀韧,還可以使用自定義配置文件、Redisson Config 對(duì)象或 Redisson RedissonClient 對(duì)象配置 JCache缠捌。例如锄贷,下面的代碼使用自定義 Redisson 配置來調(diào)用 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 實(shí)現(xiàn)已經(jīng)通過 JCache TCK 的所有測試。你也可以自行驗(yàn)證曼月。
讓我們愉快地使用緩存吧谊却!
最后
順便在此給大家推薦一個(gè)Java方面的交流學(xué)習(xí)群:957734884,里面會(huì)分享一些高級(jí)面試題哑芹,還有資深架構(gòu)師錄制的視頻錄像:有Spring炎辨,MyBatis,Netty源碼分析聪姿,高并發(fā)碴萧、高性能、分布式末购、微服務(wù)架構(gòu)的原理破喻,JVM性能優(yōu)化這些成為架構(gòu)師必備的知識(shí)體系,主要針對(duì)Java開發(fā)人員提升自己盟榴,突破瓶頸低缩,相信你來學(xué)習(xí),會(huì)有提升和收獲曹货。在這個(gè)群里會(huì)有你需要的內(nèi)容 朋友們請(qǐng)抓緊時(shí)間加入進(jìn)來吧