Redis 分布式缓存 Java 框架
为什么要在 Java 分布式应用程序中使用缓存?
在提高应用程序速度和性能上,每一毫秒都很重要。根据谷歌的一项研究,假如一个网站在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<String, SomeObject> 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<String, CacheConfig> config = new HashMap<String, CacheConfig>();
// 新建 "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<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 的所有测试。你也可以自行验证。
让我们愉快地使用缓存吧!
Redis 分布式缓存 Java 框架的更多相关文章
- 组件-------(一)redis系列--安装部署redis+实现redis分布式缓存 java+Spring+redis
目的:解决单机session不能共享问题,插入查询数据库时间效率问题,实现分布式缓存. 准备材料:Redis 下载链接 http://pan.baidu.com/s/1dEGTxvV 相关jar包如果 ...
- c#实例化继承类,必须对被继承类的程序集做引用 .net core Redis分布式缓存客户端实现逻辑分析及示例demo 数据库笔记之索引和事务 centos 7下安装python 3.6笔记 你大波哥~ C#开源框架(转载) JSON C# Class Generator ---由json字符串生成C#实体类的工具
c#实例化继承类,必须对被继承类的程序集做引用 0x00 问题 类型“Model.NewModel”在未被引用的程序集中定义.必须添加对程序集“Model, Version=1.0.0.0, Cu ...
- 基于redis分布式缓存实现
Redis的复制功能是完全建立在之前我们讨论过的基 于内存快照的持久化策略基础上的,也就是说无论你的持久化策略选择的是什么,只要用到了Redis的复制功能,就一定会有内存快照发生,那么首先要注意你 的 ...
- Redis分布式缓存实现
基于redis分布式缓存实现 第一:Redis是什么? Redis是基于内存.可持久化的日志型.Key-Value数据库高性能存储系统,并提供多种语言的API. 第二:出现背景 数据结构(Data S ...
- MyBatiesPlus+Redis分布式缓存
一.开启二级缓存 cache-enabled: true # mybatis-plus相关配置 mybatis-plus: # xml扫描,多个目录用逗号或者分号分隔(告诉 Mapper 所对应的 X ...
- fourinone分布式缓存研究和Redis分布式缓存研究
最近在写一个天气数据推送的项目,准备用缓存来存储数据.下面分别介绍一下fourinone分布式缓存和Redis分布式缓存,然后对二者进行对比,以供大家参考. 1 fourinone分布式缓存特性 1 ...
- Redis分布式缓存剖析及大厂面试精髓v6.2.6
概述 官方说明 Redis官网 https://redis.io/ 最新版本6.2.6 Redis中文官网 http://www.redis.cn/ 不过中文官网的同步更新维护相对要滞后不少时间,但对 ...
- 从Redis分布式缓存实战入手到底层原理分析、面面俱到覆盖大厂面试考点
概述 官方说明 Redis官网 https://redis.io/ 最新版本6.2.6 Redis中文官网 http://www.redis.cn/ 不过中文官网的同步更新维护相对要滞后不少时间,但对 ...
- 基于redis分布式缓存实现(新浪微博案例)
第一:Redis 是什么? Redis是基于内存.可持久化的日志型.Key-Value数据库 高性能存储系统,并提供多种语言的API. 第二:出现背景 数据结构(Data Structure)需求越来 ...
随机推荐
- git error: Your local changes to the following files would be overwritten by merge:xxxxxx ,Please commit your changes or stash them before you merge.的phpstorm解决办法
git报错 error: Your local changes to the following files would be overwritten by merge: .idea/encoding ...
- [原]Failed connect to mirrors.cloud.aliyuncs.com:80; Connection refused
web site : https://opsx.alibaba.com/mirror 运行后出现下面的Error: base//x86_64/other_db FAILED http://mirror ...
- selenium 操作过程中,元素标红高亮的两种实现方式
在使用selenium时,动作元素标红高亮,在定位问题时相当好用,有以下二种方法可以实现 一.使用js将元素属性修改 这也是网上大部分的实现方式,但有时候会有点小问题,代码如下: 只写其实某一段函数 ...
- js版的in_array的实现方法
这是一个JS版的判断数组内的元素的方法. var arr = ['a','b','c']; console.log(in_array('b',arr)); // true function in_ar ...
- codechef cook 103 div2
第一次打codechef...不太会用这oj. A: #include <bits/stdc++.h> #define mk(a,b) make_pair(a,b) #define pii ...
- win 10安装Linux虚拟机教程
1.首先下载虚拟机 用的是VMware 官方下载地址:https://my.vmware.com/en/web/vmware/free#desktop_end_user_computing/vmwar ...
- Oracle课程档案,第七天
数据库管理 关闭数据库有4中方式: 1.shutdown modes 关机模式 2.shutdown normal 关机正常 3.shutdown immediate 立即关闭 ★★ 常用命令 4.s ...
- Python学习之旅(七)
Python基础知识(6):基本数据类型之列表 在Python中,最基本的数据结构是序列.序列中的每个元素被分配一个序号——即元素的位置,也称为索引.第一个索引从0开始,如果要从右边开始,序列中的最后 ...
- vim diff 使用
1. 可以在用户目录下编辑.vimrc 文件,设置vim格式.如无该文件,添加即可vim ~/.vimrc 内容自己添加set ts=4 "set tabstop=4set nu &q ...
- 插入排序(Python实现)
目录 1. for版本--插入排序 2. while版本--插入排序 3. 测试用例 4. 算法时间复杂度分析 1. for版本--插入排序 def insert_sort_for(a_list): ...