为什么要在Java分布式应用程序中使用缓存?
在提高应用程序速度和性能上,每一毫秒都很重要。根据谷歌的-项研究,假如-一个网站在3秒钟或更短时间内没有加载成功,会有53%的手机用户会离开。
缓存是让分布式应用程序加速的重要技术之- -。存储的信息越接近CPU,访问速度就越快。从CPU缓存中加载数据比从RAM中加载要快得多,比从硬盘或网络上加载要快得多得多。
要存储经常访问的数据,分布式应用程序需要在多台机器中维护缓存。分布式缓存是降低分布式应用程序延迟、提高并发性和可伸缩性的一-种重要策略。
Redis是一-种流行的开源内存数据存储,可用作数据库、缓存或消息代理。由于是从内存而非磁盘加载数据,Redis 比许多传统的数据库解决方案更快。
然而,对开发者来说让Redis分布式缓存正确工作是一个巨大挑战。 例如,必须谨慎处理本地缓存失效,即替换或删除缓存条l。 每次更新或删除存储计算机本地缓存中的信息时,必须更新分布式缓存系统所有计算机内存中的缓存。
好消息是,有一些类似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-sString, SomeObject> map =redisson.getMapCachel("anyMap");
map.put("key1", new Some0bject), 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支持本地缓存。
下面是一个RedissonS pringLocalCachedCacheManager 对象的示例配置:
@Configuration
@ComponentScan
@EnableCaching
public static class Application{
@Bean(destroyMethod="shutdown")
RedissonClient redisson()throws lOException{
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" 缓存: t=24分 钟,maxldleTime-12分钟
config.put(" testMap", new CacheConfig(24*60*1000, 12601000));)return new RedissonSpringCacheManager(redissonClient, config);
}
}
此外,还可以读取JSON或YAML文件配置RedissonSpringCacheManager.
与RMaps一样,每个RedissonSpringCacheManager实例都有两个重要参数: tt (生存时间)和maxldleTime。如果这些参数设为0或者没有定义,那么数据将无限期地保留在缓存中。
4. JCache
JCache是- -个Java缓存API,允许开发人员从缓存临时存储、检索、更新和删除对象。
Redisson提供了Redis的JCache API实现。下面是在Redisson中使用默认配置调用JCache API的示例:
MutableConfiguration<String, String> config- new MutableConfiguration<>();
CacheManager manager= Caching.getCachingProvider().getC acheManagerd();
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的所有测试。你也可以自行验证。
-end-
感谢大家看到这里,文章有不足,欢迎大家指出;如果你觉的写得不错,欢迎转发与点赞