vlambda博客
学习文章列表

Redis中的Java分布式缓存

为什么在分布式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类的实现,包括分布式对象分布式服务分布式锁和同步器以及分布式集合正如我们将看到的那样,这些接口中的一些接口都支持缓存和本地缓存。

地图

地图是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 并将其与关联SomeObject()然后,它指定两个参数:10分钟的生存时间(TTL)和10秒的最大空闲时间。

RMapCache 当不再需要该  对象时,应将其销毁:

map.destroy();

但是,如果关闭Redisson,则没有必要。

弹簧缓存

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>();            // 使用ttl = 24分钟和maxIdleTime = 12分钟创建“ testMap”缓存            config.put("testMap"new CacheConfig(24*60*100012*60*1000)); return new RedissonSpringCacheManager(redissonClient, config);
} }


您还可以  RedissonSpringCacheManager 通过读取JSON或YAML文件来配置。

与RMaps一样,的每个实例  RedissonSpringCacheManager 都有两个重要参数:(  ttl 生存时间)和  maxIdleTime如果这些参数设置为0或未定义,则数据将无限期保留在缓存中。

缓存

JCache是Java的缓存API,允许开发人员临时存储,检索,更新和删除缓存中的对象。

Redisson包括用于Redis的JCache API的实现。以下是使用默认配置文件在Redisson中使用JCache API的示例:

MutableConfiguration<StringString> config = new MutableConfiguration<>();CacheManager manager = Caching.getCachingProvider().getCacheManager();Cache<String, String> cache = manager.createCache("namedCache", config);

您还可以使用具有自定义位置的文件,Redisson Config 对象或Redisson  RedissonClient 对象配置JCache  例如,以下代码使用自定义Redisson配置来配置JCache:

MutableConfiguration<StringString> jcacheConfig = new MutableConfiguration<>();Config redissonCfg = ...Configuration<StringString> config = RedissonConfiguration.fromConfig(redissonCfg, jcacheConfig);CacheManager manager = Caching.getCachingProvider().getCacheManager();Cache<String, String> cache = manager.createCache("namedCache", config);

Redisson的JCache实现通过了JCache技术兼容性套件(TCK)测试套件中的所有测试


 
   
   
 

感觉不错的话,麻烦动动小手关注一下小编啦


更多精彩请点击

1.