为什么在分布式Java应用程序中使用缓存?今天学习了两节优锐课讲解分布式缓存的内容,收获颇多,分享给大家。
在提高应用程序的速度和性能时,每毫秒都是至关重要的。例如,根据Google的一项研究,如果网站在3秒或更短时间内无法加载,则有53%的移动用户会离开该网站。
缓存是使你的分布式应用程序更快的最重要的技术之一。你可以将信息存储到计算机的CPU中越近,访问信息的速度就越快。从CPU缓存中加载数据要比从RAM中加载数据快得多,这也比从硬盘或通过网络加载数据快得多。
为了存储经常访问的数据,分布式应用程序在多台计算机上维护高速缓存。分布式缓存通常是减少分布式应用程序的延迟并提高其并发性和可伸缩性的基本策略。
Redis是一种流行的开源内存中数据结构存储,可以用作数据库,缓存或消息代理。因为Redis从内存而不是从磁盘加载数据,所以Redis比许多传统的数据库解决方案要快。
但是,使分布式缓存在Redis中正常工作对于开发人员可能是一个挑战。例如,本地缓存失效是替换或删除缓存条目的过程,必须谨慎处理。每次更新或删除一台计算机上本地缓存中存储的信息时,都必须更新作为分布式缓存一部分的所有计算机上的内存中缓存。
好消息是,有Redis框架(例如Redisson)可以帮助你构建应用程序所需的分布式缓存。在下一部分中,我们将讨论Redisson中三种重要的分布式缓存实现:Maps,Spring Cache和JCache。
Redisson中的分布式缓存
Redisson是一个基于Redis的框架,提供了用于在Java中使用Redis的包装器和接口。Redisson包括许多熟悉的Java类的实现,包括分布式对象,分布式服务,分布式锁和同步器以及分布式集合。正如我们将看到的,其中一些接口支持缓存和本地缓存。
Map
Maps是Java中最有用,用途最广泛的集合之一。Redisson提供了Java Map(称为RMap)的实现,该实现可支持本地缓存。
如果计划执行许多读取操作和/或网络往返,则应将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
,并将其与aSomeObject()
关联。然后,它指定两个参数:生存时间(TTL)为10分钟,最大空闲时间为10秒。
不再需要RMapCache
对象时,应将其销毁:
map.destroy();
但是,如果关闭Redisson,则没有必要。
Spring缓存
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
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!