Redis 分布式緩存 Java 框架


為什么要在 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)來吧


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市讳推,隨后出現(xiàn)的幾起案子顶籽,更是在濱河造成了極大的恐慌,老刑警劉巖银觅,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件礼饱,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)镊绪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門匀伏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蝴韭,你說我怎么就攤上這事够颠。” “怎么了榄鉴?”我有些...
    開封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵履磨,是天一觀的道長。 經(jīng)常有香客問我庆尘,道長剃诅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任驶忌,我火速辦了婚禮矛辕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘付魔。我一直安慰自己聊品,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開白布抒抬。 她就那樣靜靜地躺著杨刨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪擦剑。 梳的紋絲不亂的頭發(fā)上妖胀,一...
    開封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音惠勒,去河邊找鬼赚抡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛纠屋,可吹牛的內(nèi)容都是我干的涂臣。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼售担,長吁一口氣:“原來是場噩夢啊……” “哼赁遗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起族铆,我...
    開封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤岩四,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后哥攘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體剖煌,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡材鹦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了耕姊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片桶唐。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖茉兰,靈堂內(nèi)的尸體忽然破棺而出尤泽,到底是詐尸還是另有隱情,我是刑警寧澤邦邦,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布安吁,位于F島的核電站,受9級(jí)特大地震影響燃辖,放射性物質(zhì)發(fā)生泄漏鬼店。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一黔龟、第九天 我趴在偏房一處隱蔽的房頂上張望妇智。 院中可真熱鬧,春花似錦氏身、人聲如沸巍棱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽航徙。三九已至,卻和暖如春陷虎,著一層夾襖步出監(jiān)牢的瞬間到踏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來泰國打工尚猿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留窝稿,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓凿掂,卻偏偏與公主長得像伴榔,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子庄萎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容