作者:唐尤华
来源:https://urlify.cn/FRvaAv
为什么要在%20JAVA%20分布式应用程序中使用缓存?
在提高应用程序速度和性能上,每一毫秒都很重要。根据谷歌的一项研究,假如一个网站在3秒钟或更短时间内没有加载成功,会有%2053%%20的手机用户会离开。
缓存是让分布式应用程序加速的重要技术之一。存储的信息越接近%20CPU,访问速度就越快。从%20CPU%20缓存中加载数据比从%20RAM%20中加载要快得多,比从硬盘或网络上加载要快得多得多。
要存储经常访问的数据,分布式应用程序需要在多台机器中维护缓存。分布式缓存是降低分布式应用程序延迟、提高并发性和可伸缩性的一种重要策略。
redis%20是一种流行的开源内存数据存储,可用作数据库、缓存或消息代理。由于是从内存而非磁盘加载数据,Redis%20比许多传统的数据库解决方案更快。
然而,对开发者来说让%20Redis%20分布式缓存正确工作是一个巨大挑战。例如,必须谨慎处理本地缓存失效,即替换或删除缓存条目。每次更新或删除存储计算机本地缓存中的信息时,必须更新分布式缓存系统所有计算机内存中的缓存。
好消息是,有一些类似%20Redisson%20这样的%20Redis%20框架,可以帮助构建应用程序所需的分布式缓存。下一节将讨论%20Redisson%20中分布式缓存的三个重要实现:Maps、Spring%20Cache%20和%20JCache。
Redisson%20是一个基于%20Redis%20的框架,用%20Java%20实现了一个%20Redis%20包装器(wrApper)和接口。Redisson%20包含许多常见的%20Java%20类,例如分布式对象、分布式服务、分布式锁和同步器,以及分布式集合。正如下面即将介绍的,其中一些接口同时支持分布式缓存和本地缓存。
Map%20是%20Java%20最有用的集合之一。Redisson%20提供了一个名为%20RMap%20的%20Java%20Map%20实现,支持本地缓存。
如果希望执行多个读操作或网络环回(roundtrip),应使用支持本地缓存的%20RMap。通过本地存储%20Map%20数据,RMap%20比不启用本地缓存时快45倍。通用分布式缓存使用%20RMapCache,本地缓存使用%20RLocalCachedMap。
Redis%20引擎自身能够执行缓存,不需要在客户端执行代码。然而,虽然本地缓存能显著提高读取速度,但需要由开发人员维护,并且可能需要一些开发工作。Redisson%20为开发人员提供了%20RLocalCachedMap%20对象,让本地缓存实现起来更容易。
下面的代码展示了如何初始化%20RMapCache%20对象:
RMapCache<String,SomeObject>map=redisson.getMapCache("anyMap");map.put("key1",newSomeObject(),10,TimeUnit.MINUTES,10,TimeUnit.SECONDS);
上面的代码将字符串%20"key1"%20放到%20RMapCache%20中,并与%20SomeObject()%20关联。然后它指定了两个参数,TTL设为10分钟、最大空闲时间10秒。
当不再需要时,应销毁%20RMapCache%20对象:
map.destroy();
Redisson%20关闭后不用再做销毁操作。
Spring%20是一个用于构建企业级%20Web%20应用程序的%20Java%20框架,也提供了缓存支持。
Redisson%20包含了%20Spring%20缓存功能,提供两个对象:RedissonSpringCacheManager%20和%20RedissonSpringLocalCachedCacheManager。RedissonSpringLocalCachedCacheManager%20支持本地缓存。
下面是一个%20RedissonSpringLocalCachedCacheManager%20对象的示例配置:
此外,还可以读取 JSON 或 YAML 文件配置 RedissonSpringCacheManager。
与 RMaps 一样,每个 RedissonSpringCacheManager 实例都有两个重要参数: ttl(生存时间)和 maxIdleTime。如果这些参数设为0或者没有定义,那么数据将无限期地保留在缓存中。
JCache 是一个 Java 缓存 API,允许开发人员从缓存临时存储、检索、更新和删除对象。
Redisson 提供了 Redis 的 JCache API 实现。下面是在 Redisson 中使用默认配置调用 JCache API 的示例:
MutableConfiguration<String,String>config=newMutableConfiguration<>();CacheManagermanager=Caching.getCachingProvider().getCacheManager();Cache<String,String>cache=manager.createCache("namedCache",config);
此外,还可以使用自定义配置文件、Redisson Config 对象或 Redisson RedissonClient 对象配置 JCache。例如,下面的代码使用自定义 Redisson 配置来调用 JCache:
MutableConfiguration<String,String>jcacheConfig=newMutableConfiguration<>();ConfigredissonCfg=...Configuration<String,String>config=RedissonConfiguration.fromConfig(redissonCfg,jcacheConfig);CacheManagermanager=Caching.getCachingProvider().getCacheManager();Cache<String,String>cache=manager.createCache("namedCache",config);
Redisson 的 JCache 实现已经通过 JCache TCK 的所有测试。你也可以自行验证。
让我们愉快地使用缓存吧!