爲何在分佈式Java應用程序中使用緩存?今天學習了兩節優銳課講解分佈式緩存的內容,收穫頗多,分享給你們。redis
在提升應用程序的速度和性能時,每毫秒都是相當重要的。例如,根據Google的一項研究,若是網站在3秒或更短期內沒法加載,則有53%的移動用戶會離開該網站。數據庫
緩存是使你的分佈式應用程序更快的最重要的技術之一。你能夠將信息存儲到計算機的CPU中越近,訪問信息的速度就越快。從CPU緩存中加載數據要比從RAM中加載數據快得多,這也比從硬盤或經過網絡加載數據快得多。緩存
爲了存儲常常訪問的數據,分佈式應用程序在多臺計算機上維護高速緩存。分佈式緩存一般是減小分佈式應用程序的延遲並提升其併發性和可伸縮性的基本策略。網絡
Redis是一種流行的開源內存中數據結構存儲,能夠用做數據庫,緩存或消息代理。由於Redis從內存而不是從磁盤加載數據,因此Redis比許多傳統的數據庫解決方案要快。數據結構
可是,使分佈式緩存在Redis中正常工做對於開發人員多是一個挑戰。例如,本地緩存失效是替換或刪除緩存條目的過程,必須謹慎處理。每次更新或刪除一臺計算機上本地緩存中存儲的信息時,都必須更新做爲分佈式緩存一部分的全部計算機上的內存中緩存。併發
好消息是,有Redis框架(例如Redisson)能夠幫助你構建應用程序所需的分佈式緩存。在下一部分中,咱們將討論Redisson中三種重要的分佈式緩存實現:Maps,Spring Cache和JCache。app
Redisson是一個基於Redis的框架,提供了用於在Java中使用Redis的包裝器和接口。Redisson包括許多熟悉的Java類的實現,包括分佈式對象,分佈式服務,分佈式鎖和同步器以及分佈式集合。正如咱們將看到的,其中一些接口支持緩存和本地緩存。框架
Maps是Java中最有用,用途最普遍的集合之一。Redisson提供了Java Map(稱爲RMap)的實現,該實現可支持本地緩存。分佈式
若是計劃執行許多讀取操做和/或網絡往返,則應將RMap與本地緩存一塊兒使用。經過將Map數據本地存儲,你的讀取操做將比不具備本地緩存的RMap快45倍。RMapCache對象用於通用分佈式緩存,而RLocalCachedMap對象用於本地緩存。ide
Redis引擎可以自行執行緩存,而無需客戶端上的任何代碼。可是,開發人員須要維護可以顯着提升讀取操做速度的本地緩存,而且可能須要一些時間來實現。Redisson提供RLocalCachedMap對象是對開發人員的好處,所以能夠更輕鬆地實現本地緩存。
下面是RMapCache對象的實例化:
RMapCache<String, SomeObject> map = redisson.getMapCache("anyMap"); map.put("key1", new SomeObject(), 10, TimeUnit.MINUTES, 10, TimeUnit.SECONDS);
上面的代碼將字符串「 key1」放入RMapCache
,並將其與aSomeObject()
關聯。而後,它指定兩個參數:生存時間(TTL)爲10分鐘,最大空閒時間爲10秒。
再也不須要RMapCache
對象時,應將其銷燬:
map.destroy();
可是,若是關閉Redisson,則沒有必要。
Spring是用於構建企業Web應用程序的Java框架,其中包括對緩存的支持。
Redisson在Spring中包括兩個對象:RedissonSpringCacheManager
和RedissonSpringCacheManager
。顧名思義,RedissonSpringCacheManager
r包括對本地緩存的支持。
如下是RedissonSpringCacheManager
對象的示例配置:
@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>(); // create "testMap" cache with ttl = 24 minutes and maxIdleTime = 12 minutes config.put("testMap", new CacheConfig(24*60*1000, 12*60*1000)); return new RedissonSpringCacheManager(redissonClient, config); } }
你還能夠經過讀取JSON或YAML文件來配置RedissonSpringCacheManager
。
像RMaps同樣,每一個edissonSpringCacheManager
實例都有兩個重要參數: ttl
(生存時間)和maxIdleTime
。若是這些參數設置爲0或未定義,則數據將無限期保留在緩存中。
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)測試套件中的全部測試。你能夠本身運行測試來確認。
Happy caching!