在提高应用程序的速度和性能方面,每毫秒都很重要。例如,谷歌的一项研究显示,如果网站在3秒或更短时间内没有加载,将有53%的移动用户离开网站。
缓存是使分布式应用程序更快的最重要技术之一。您可以将信息存储到计算机的CPU越近,访问速度就越快。从CPU缓存加载数据比从RAM加载数据快得多,这也比从硬盘或网络加载数据快得多。
为了存储频繁访问的数据,分布式应用程序在多台机器上维护缓存。分布式缓存通常是减少分布式应用程序延迟并提高其并发性和可伸缩性的重要策略。
Redis是一种流行的开源内存数据结构存储,可用作数据库,缓存或消息代理。因为它从内存而不是从磁盘加载数据,所以Redis比许多传统数据库解决方案更快。
但是,在Redis中使分布式缓存正常工作对开发人员来说可能是一个挑战。例如,必须小心处理本地缓存失效,这是替换或删除缓存条目的过程。每次更新或删除存储在一台计算机上的本地缓存中的信息时,都必须更新属于分布式缓存的所有计算机上的内存缓存。
好消息是Redis框架,如Redisson,可以帮助您构建应用程序所需的分布式缓存。在下一节中,我们将讨论Redisson中分布式缓存的三个重要实现:Maps,Spring Cache和JCache。
Redisson中的分布式缓存
Redisson是一个基于Redis的框架,它提供了一个包装器和接口,用于在Java中使用Redis。Redisson包括许多熟悉的Java类的实现,包括分布式对象,分布式服务,分布式锁和同步器以及分布式集合。正如我们将看到的,其中一些接口支持缓存和本地缓存。
地图
地图是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);
上面的代码将String“key1”放入 RMapCache 并将其与a关联SomeObject()。然后它指定两个参数:生存时间(TTL)为10分钟,最大空闲时间为10秒。
RMapCache 不再需要时应该销毁该 对象:
map.destroy();
但是,如果Redisson关闭,则不需要这样做。
Spring Cache
Spring是用于构建企业Web应用程序的Java框架,其中包括 对缓存的支持。
Redisson包含一个在Spring中实现缓存功能的两个对象: RedissonSpringCacheManager和 RedissonSpringLocalCachedCacheManager。顾名思义, RedissonSpringLocalCachedCacheManager 包括对本地缓存的支持。
以下是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);
}
}
您还可以 RedissonSpringCacheManager 通过读取JSON或YAML文件来配置。
像RMaps一样,每个实例 RedissonSpringCacheManager 都有两个重要参数:( 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)测试套件中的所有测试。您可以通过自己运行测试来确认这一点。
快乐缓存!
另外本人从事在线教育多年,将自己的资料整合建了一个公众号,对于有兴趣一起交流学习java可以微信搜索:“程序员文明”,里面有大神会给予解答,也会有许多的资源可以供大家学习分享,欢迎大家前来一起学习进步!
网友评论