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

Map

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

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

map.destroy();

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

Spring缓存

Spring是用于构建企业Web应用程序的Java框架,其中包括对缓存的支持。

Redisson在Spring中包括两个对象:RedissonSpringCacheManagerRedissonSpringCacheManager。顾名思义,RedissonSpringCacheManager r包括对本地缓存的支持。

以下是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);
}
}

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

像RMaps一样,每个edissonSpringCacheManager实例都有两个重要参数: 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)测试套件中的所有测试。你可以自己运行测试来确认。

Happy caching!

Redis中的Java分布式缓存的更多相关文章

  1. 5个强大的Java分布式缓存框架推荐

    在开发中大型Java软件项目时,很多Java架构师都会遇到数据库读写瓶颈,如果你在系统架构时并没有将缓存策略考虑进去,或者并没有选择更优的 缓存策略,那么到时候重构起来将会是一个噩梦.本文主要是分享了 ...

  2. Java分布式缓存框架

    http://developer.51cto.com/art/201411/457423.htm 在开发中大型Java软件项目时,很多Java架构师都会遇到数据库读写瓶颈,如果你在系统架构时并没有将缓 ...

  3. 5个强大的Java分布式缓存框架

    在开发中大型Java软件项目时,很多Java架构师都会遇到数据库读写瓶颈,如果你在系统架构时并没有将缓存策略考虑进去,或者并没有选择更优的缓存策略,那么到时候重构起来将会是一个噩梦.本文主要是分享了5 ...

  4. redis中使用java脚本实现分布式锁

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/115.html?1455860390 edis被大量用在分布式的环境中,自 ...

  5. .net core系列之《.net core中使用集成IDistributedCache接口的Redis和MongoDB实现分布式缓存》

    分布式的缓存可以提高性能和可伸缩性的 ASP.NET Core 应用程序,尤其是托管在云中或服务器场中时. 什么是分布式的缓存 分布式的缓存由多个应用程序服务器共享,缓存中的信息不存储在单独的 Web ...

  6. ASP.NET Core与Redis搭建一个简易分布式缓存

    ​本文主要介绍了缓存的概念,以及如何在服务器内存中存储内容.今天的目标是利用IDistributedCache来做一些分布式缓存,这样我们就可以横向扩展我们的web应用程序. 在本教程中,我将使用Re ...

  7. Discuz!NT中集成Memcached分布式缓存

    大约在两年前我写过一篇关于Discuz!NT缓存架构的文章,在那篇文章的结尾介绍了在IIS中如果开启多个应用程序池会造成多个缓存实例之间数据同步的问题.虽然给出了一个解决方案,但无形中却把压力转移到了 ...

  8. 小D课堂 - 零基础入门SpringBoot2.X到实战_第9节 SpringBoot2.x整合Redis实战_37、分布式缓存Redis介绍

    笔记 1.分布式缓存Redis介绍      简介:讲解为什么要用缓存和介绍什么是Redis,新手练习工具          1.redis官网 https://redis.io/download   ...

  9. 分布式缓存技术redis学习系列(五)——redis实战(redis与spring整合,分布式锁实现)

    本文是redis学习系列的第五篇,点击下面链接可回看系列文章 <redis简介以及linux上的安装> <详细讲解redis数据结构(内存模型)以及常用命令> <redi ...

随机推荐

  1. 技术人如何利用 github+Jekyll ,搭建一个独立免费的技术博客

    上次有人留言说,技术博客是程序员的标配,但据我所知绝大部分技术同学到现在仍然没有自己的技术博客.原因有很多,有的是懒的写,有的是怕写不好,还有的是一直想憋个大招,幻想做到完美再发出来,结果一直胎死腹中 ...

  2. 领扣(LeetCode)独特的电子邮箱地址 个人题解

    每封电子邮件都由一个本地名称和一个域名组成,以 @ 符号分隔. 例如,在 alice@leetcode.com中, alice 是本地名称,而 leetcode.com 是域名. 除了小写字母,这些电 ...

  3. 消除router-link 的下划线问题

    <div class="small-size"> <router-link to="/About"> <img src=" ...

  4. Unittest框架的从零到壹(一)

    前言 Python中有非常多的单元测试框架,如unittest.pytest.nose.doctest等,Python2.1及其以后的版本已经将unittest作为一个标准模块放入Python开发包中 ...

  5. mysql锁简谈

    1.mysql锁, 作用:解决因资源共享而造成的并发问题. 实例:买最好一件衣服X A: X 买: X加锁----->试衣服……下单……付款……打包….------>X解锁 B: X 买: ...

  6. AE 新建项目(一)(持续更新,做到哪算哪)

    开发环境 工具:Visual Studio 2012.ArcEngine10.4.1 语言:C# 开发步骤 1.打开Visual Studio 2012,选择新建项目,创建一个.NET Framewo ...

  7. ArcGIS 重新创建几何服务(GeometryService)

    #参考官方网址:http://enterprise.arcgis.com/zh-cn/server/10.4/administer/windows/re-creating-the-geometry-s ...

  8. Android的系统框架的深入认识

    Android采用层次化系统架构,官方公布的标准架构如下图所示.Android由底层往上分为4个主要功能层,分别是linux内核层(Linux Kernel),系统运行时库层(Libraries和An ...

  9. Unity 工作经历+近期面试经历(二)

    注册博客园后,我原本打算每一份工作经历都记录下来.但是,这份工作已经换了半年了,好几次想要写,又不知道该怎么写.太多的负能量.我始终相信,情绪是会传染的.我基本决定放弃写这篇文章了.就让时间去淡化经历 ...

  10. IDEA IntelliJ/ DataGrip 修改自动补全快捷键

    系统默认的是Tab键,个人喜欢用空格键作为自动补全键,设置方法如下 Setting-->Keymap-->Editor Actions:Choose Lookup Item Replace ...