多年程序员总结分享Java 框架之Redis 分散式快取
多年程序员总结分享:Java 框架之Redis 分散式快取 为什么要在 Java 分散式应用程序中使用快取? 在提高应用程序速度和效能上,每一毫秒都很重要。根据Google的一项研究,假如一个网站在3秒钟或更短时间内没有载入成功,会有 53% 的手机使用者会离开。 快取是让分散式应用程序加速的重要技术之一。储存的资讯越接近 CPU,访问速度就越快。从 CPU 快取中载入资料比从 RAM 中载入要快得多,比从硬盘或网络上载入要快得多得多。 要储存经常访问的资料,分散式应用程序需要在多台机器中维护快取。分散式快取是降低分散式应用程序延迟、提高并发性和可伸缩性的一种重要策略。 Redis 是一种流行的开源内存资料储存,可用作数据库、快取或讯息代理。由于是从内存而非磁盘载入资料,Redis 比许多传统的数据库解决方案更快。 然而,对开发者来说让 Redis 分散式快取正确工作是一个巨大挑战。例如,必须谨慎处理本地快取失效,即替换或删除快取条目。每次更新或删除储存计算机本地快取中的资讯时,必须更新分散式快取系统所有计算机内存中的快取。 好讯息是,有一些类似 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 map = redisson.getMapCache(anyMap);
map.put(key1, new SomeObject(), 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 支援本地快取。
下面是一个
RedissonSpringLocalCachedCacheManager 物件的示例配置:
@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 config = new HashMap();
// 新建 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 一样,
每个 RedissonSpringCacheManager 例项都有两个重要引数: ttl(生存时间)和 maxIdleTime。如果这些引数设为0或者没有定义,那么资料将无限期地保留在快取中。
4. JCache
JCache 是一个 Java 快取 API,允许开发人员从快取临时储存、检索、更新和删除物件。
Redisson 提供了 Redis 的 JCache API 实现。下面是在 Redisson 中使用预设配置呼叫 JCache API 的示例:
MutableConfiguration config = new MutableConfiguration();
CacheManager manager = Caching.getCachingProvider().getCacheManager();
Cache cache = manager.createCache(namedCache, config);
此外,还可以使用自定义配置档案、Redisson Config 物件或 Redisson RedissonClient 物件配置 JCache。例如,下面的程式码使用自定义 Redisson 配置来呼叫 JCache:
MutableConfiguration jcacheConfig = new MutableConfiguration();
Config redissonCfg = ...
Configuration config = RedissonConfiguration.fromConfig(redissonCfg, jcacheConfig);
CacheManager manager = Caching.getCachingProvider().getCacheManager();
Cache cache = manager.createCache(namedCache, config);
Redisson 的 JCache 实现已经通过 JCache TCK 的所有测试。你也可以自行验证。
end:如果你觉得本文对你有帮助的话,记得关注点赞转发,你的支援就是我更新动力。
![](/static-img/_ZmlQVHch8NaUJo0MV-i8PDj8w6cURy1uAJrk0MFsnQW-EOMjZG7G_x-4IiP0vGr.jpg)