本地缓存是提高Redis等数据库性能的最有用的策略之一。希望在Java中进行本地缓存的Redis开发人员会发现Redis不支持这一功能。在本文中,我们将讨论如何使用第三方redis java客户机利用java和redis中的本地缓存
什么是本地缓存?
缓存是内存缓冲区,用于将数据存储在一个方便的位置,以便以后对该数据的请求能够更快地执行。
在本地缓存中,数据库中最常用的数据在物理上存储在离访问它的应用程序更近的地方,存储库称为本地缓存…例如,如果应用程序运行在经常访问数据库服务器的客户端上,本地缓存可能存储在客户机自己的硬盘上,从而消除了网络延迟通过在本地缓存中更接近地存储数据,可以显着地加快响应时间并减少网络流量;但是,还需要小心地处理本地缓存,以确保本地缓存中存储的数据与原始数据库中的数据保持一致。
用Java在Redis中进行本地缓存
开发人员可以很容易地实现本地内存。Java中的缓存,无论是使用内置Java数据结构(如HashMaps)还是使用第三方Java库。
当开发人员希望在Redis中使用这些本地缓存特性时,问题就出现了,因为Redis并不自动支持Java编程语言的使用。
幸运的是,有一个简单的解决方案:开发人员可以在Redis项目中使用第三方Java框架(如redisson)。Redisson是Redis的Java客户端,它提供了数十个分布式Java对象和服务。这使得熟悉标准Java类和接口的开发人员更容易使用Redis学习曲线。
在接下来的几节中,我们将讨论开发人员可以使用Redisson在Redis中实现Java本地缓存的几种方法。
在带有地图的Redis和Java中进行本地缓存
Java中的映射表示键值对之间的映射;它们是在Java中实现本地缓存的最简单方法之一。
Redisson中的RLocalCachedMap接口扩展了Java的内置ConcurrentMap接口,包括对Redis中的本地缓存的支持。此本地缓存使应用程序能够执行比正常速度快45倍的读取操作。
用户可以配置以下RLocalCachedMap功能:
· 最大缓存大小。
· 每个缓存条目的存活时间。
· 每个缓存条目的最大空闲时间。
· 缓存项的驱逐策略。
· 缓存更改的同步策略。
下面是如何在Redisson中使用RLocalCachedMap的示例:
RLocalCachedMap<String, Integer> map = redisson.getLocalCachedMap("test", LocalCachedMapOptions.defaults());
String prevObject = map.put("123", 1);
String currentObject = map.putIfAbsent("323", 2);
String obj = map.remove("123");
// use fast* methods when previous value is not required map.fastPut("a", 1);
map.fastPutIfAbsent("d", 32); map.fastRemove("b");
RFuture<String> putAsyncFuture = map.putAsync("321");
RFuture<Void> fastPutAsyncFuture = map.fastPutAsync("321");
map.fastPutAsync("321", new SomeObject());
map.fastRemoveAsync("321");
如果RLocalCachedMap不再使用,建议显式销毁该映射;但是,如果Redisson关闭,则这一点并不是绝对必要的:
RLocalCachedMap<String, Integer> map = ...
map.destroy();
使用SpringCache的Redis和Java本地缓存
Redisson还支持用于本地缓存的三个第三方Java框架:弹簧缓存、Hibernate缓存和JCache。
Spring与Redisson框架完全兼容,Redisson通过RedissonSpringLocalCachedCacheManager类支持SpringCache。用户可以配置以下功能:
· 最大缓存大小。
· 每个缓存条目的存活时间。
· 每个缓存条目的最大空闲时间。
· 重新连接策略。
· 缓存更改的同步策略。
下面是如何在Redisson中配置Spring缓存的示例:
@Configuration
@ComponentScan
@EnableCaching
public static class Application {
@Bean(destroyMethod="shutdown")
RedissonClient redisson() throws IOException {
Config config = new Config();
config.useClusterServers()
.addNodeAddress("redis://127.0.0.1:7004", "redis://127.0.0.1:7001");
return Redisson.create(config);
}
@Bean
CacheManager cacheManager(RedissonClient redissonClient) {
Map<String, CacheConfig> config = new HashMap<String, CacheConfig>();
// define local cache settings for "testMap" cache.
// ttl = 48 minutes and maxIdleTime = 24 minutes for local cache entries
LocalCachedMapOptions options = LocalCachedMapOptions.defaults()
.evictionPolicy(EvictionPolicy.LFU)
.timeToLive(48, TimeUnit.MINUTES)
.maxIdle(24, TimeUnit.MINUTES);
.cacheSize(1000);
// create "testMap" Redis cache with ttl = 24 minutes and maxIdleTime = 12 minutes
config.put("testMap", new LocalCachedCacheConfig(24*60*1000, 12*60*1000, options));
return new RedissonSpringLocalCachedCacheManager(redissonClient, config);
}
}
使用Hibernate缓存的Redis和Java本地缓存
Hibernate缓存是Redisson中的第二个第三方Java本地缓存选项。Hibernate中的缓存是通过RedissonLocalCachedRegionFactory类在Redisson中完成的。用户可以配置以下功能:
· 最大缓存大小。
· 每个缓存条目的存活时间。
· 每个缓存条目的最大空闲时间。
· 缓存项的驱逐策略。
· 重新连接策略。
· 缓存更改的同步策略。
在带有JCache的Redis和Java中进行本地缓存
最后,还可以使用Redisson和JCache在Redis中执行Java本地缓存。配置缓存是通过LocalCacheConfiguration类在JCache实例初始化期间完成的。用户可以配置以下功能:
· 最大缓存大小。
· 每个缓存条目的存活时间。
· 每个缓存条目的最大空闲时间。
· 缓存项的驱逐策略。
· 重新连接策略。
· 缓存更改的同步策略。
下面是如何使用JCache和Redisson初始化Java本地缓存的示例:
LocalCacheConfiguration<String, String> config = new LocalCacheConfiguration<>();
CacheManager manager = Caching.getCachingProvider().getCacheManager();
Cache<String, String> cache = manager.createCache("myCache", config);
// or
URI redissonConfigUri = getClass().getResource("redisson-jcache.yaml").toURI();
CacheManager manager = Caching.getCachingProvider().getCacheManager(redissonConfigUri, null);
Cache<String, String> cache = manager.createCache("myCache", config);
// or
Config redissonCfg = ... Configuration<String, String> rConfig =
RedissonConfiguration.fromConfig(redissonCfg, config);
CacheManager manager = Caching.getCachingProvider().getCacheManager();
Cache<String, String> cache = manager.createCache("namedCache", rConfig);
结语
Redisson为Java开发人员在Redis中执行本地缓存提供了多种选项:map、SpringCache、Hibernate缓存和JCache。
请注意,最后三个选项–Spring缓存、Hibernate缓存和JCache–仅供Redisson专业用户使用。Redisson pro包括各种特性和性能增强,使其有别于Redisson的开源版本。这包括集群模式下的数据分区、XA事务、多线程应用程序的超高速速度和24x7支持。
感谢您的阅读。对文章如有疑问,欢迎提出。望分享的内容对大家有所帮助。搜集整理了一些Java资料,包括Java进阶学习路线以及对应学习资料,还有一些大厂面试题,需要的朋友可以自行领取:Java高级架构学习资料分享+架构师成长之路
顺便给大家推荐一个Java技术交流群:473984645里面会分享一些资深架构师录制的视频资料:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多!