EVCache缓存在 Spring Boot中的实战
2019独角兽企业重金招聘Python工程师标准>>>
文章共 727字,阅读大约需要 2分钟 !
概 述
EVCache 是 Netflix开源的分布式缓存系统,基于 Memcached缓存和 Spymemcached客户端实现,其用在了大名鼎鼎的 AWS亚马逊云上,并且为云计算做了优化,提供高效的缓存服务。
本文利用 Memcached作为后端缓存实例服务器,并结合 Spring Boot,来实践一下 EVCache客户端的具体使用。
注: 本文首发于 My Personal Blog:CodeSheep·程序羊,欢迎光临 小站
编译 EVCache
- 第一步:Clone
git clone git@github.com:Netflix/EVCache.git
- 第二步:编译构建
./gradlew build
Downloading https://services.gradle.org/distributions/gradle-2.10-bin.zip
....................................................................................................................................:evcache-client:check
:evcache-client:build
:evcache-client-sample:writeLicenseHeader
:evcache-client-sample:licenseMain
Missing header in: evcache-client-sample/src/main/java/com/netflix/evcache/sample/EVCacheClientSample.java
:evcache-client-sample:licenseTest UP-TO-DATE
:evcache-client-sample:license
:evcache-client-sample:compileTestJava UP-TO-DATE
:evcache-client-sample:processTestResources UP-TO-DATE
:evcache-client-sample:testClasses UP-TO-DATE
:evcache-client-sample:test UP-TO-DATE
:evcache-client-sample:check
:evcache-client-sample:buildBUILD SUCCESSFULTotal time: 22.866 secs
- 第三步:得到构建生成物
同时 ~/EVCache/evcache-client/build/reports
目录下会生成相应构建报告:
接下来我们结合 Spring工程,来实战一下 EVCache Client的具体使用。
环境准备 / 工程搭建
首先准备好两台 memcached实例:
- 192.168.199.77:11211
- 192.168.199.78:11211
接下来搭建一个SpringBoot工程,过程不再赘述,需要注意的一点是 pom中需加入 EVCache的依赖支持
<dependency><groupId>com.netflix.evcache</groupId><artifactId>evcache-client</artifactId><version>4.137.0-SNAPSHOT</version>
</dependency>
注:我将 Spring工程设置在 8899端口启动
EVCache Client导入
- 编写 EVCache Client包装类
public class EVCacheClient {private final EVCache evCache; // 关键角色在此public EVCacheClient() {String deploymentDescriptor = System.getenv("EVC_SAMPLE_DEPLOYMENT");if ( deploymentDescriptor == null ) {deploymentDescriptor = "SERVERGROUP1=192.168.199.77:11211;SERVERGROUP2=192.168.199.78:11211";}System.setProperty("EVCACHE_APP1.use.simple.node.list.provider", "true");System.setProperty("EVCACHE_APP1-NODES", deploymentDescriptor);evCache = new EVCache.Builder().setAppName("EVCACHE_APP1").build();}public void setKey(String key, String value, int timeToLive) throws Exception {try {Future<Boolean>[] _future = evCache.set(key, value, timeToLive);for (Future<Boolean> f : _future) {boolean didSucceed = f.get();// System.out.println("per-shard set success code for key " + key + " is " + didSucceed);// 此处可以针对 didSucceed做相应判断}System.out.println("finished setting key " + key);} catch (EVCacheException e) {e.printStackTrace();}}public String getKey(String key) {try {String _response = evCache.<String>get(key);return _response;} catch (Exception e) {e.printStackTrace();return null;}}}
很明显上述类主要提供了两个关键工具函数: setKey
和 getKey
- EVCache Config 配置导入
我们将 EVCacheClient 注入到Spring容器中
@Configuration
public class EVCacheConfig {@Beanpublic EVCacheClient evcacheClient() {EVCacheClient evCacheClient = new EVCacheClient();return evCacheClient;}
}
编写 EVCache Service
上面几步完成之后,Service的编写自然顺理成章,仅仅是一层封装而已
@Service
public class EVCacheService {@Autowiredprivate EVCacheClient evCacheClient;public void setKey( String key, String value, int timeToLive ) {try {evCacheClient.setKey( key, value, timeToLive );} catch (Exception e) {e.printStackTrace();}}public String getKey( String key ) {return evCacheClient.getKey( key );}
}
编写测试 Controller
我们编写一个方便用于测试的控制器,里面进行一系列对于缓存的 set
和 get
,从而便于观察实验结果
@RestController
public class EVCacheTestController {@Autowiredprivate EVCacheService evCacheService;@GetMapping("/testevcache")public void testEvcache() {try {for ( int i = 0; i < 10; i++ ) {String key = "key_" + i;String value = "data_" + i;int ttl = 180; // 此处将缓存设为三分钟(180s)生存期,时间一过,缓存即会失效evCacheService.setKey(key, value, ttl);}for (int i = 0; i < 10; i++) {String key = "key_" + i;String value = evCacheService.getKey(key);System.out.println("Get of " + key + " returned " + value);}} catch (Exception e) {e.printStackTrace();}}
}
实验验证
工程启动后,我们调用 Rest接口:localhost:8899/testevcache
,观察控制台中对于 key_0
到 key_9
等十个缓存 key的操作细节如下:
- 在 memcached集群中插入十条数据:
key_0
到key_9
注意此处是向每个后端 memcached缓存实例中都写入了 10条测试数据
- 从后端 memcached集群中读取刚插入的 10条数据
- 为了验证数据确实写入到后端 memcached,我们可以 telnet到后端 memcached中进行一一验证
而且这些数据的有效时间仅3分钟,3分钟后再次验证会发现数据已过期
[root@localhost ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
get key_0
VALUE key_0 0 6
data_0
END
get key_1
VALUE key_1 0 6
data_1
END
get key_2
VALUE key_2 0 6
data_2
END
get key_3
VALUE key_3 0 6
data_3
END
get key_4
VALUE key_4 0 6
data_4
END
get key_5
VALUE key_5 0 6
data_5
END
get key_6
VALUE key_6 0 6
data_6
END
get key_7
VALUE key_7 0 6
data_7
END
get key_8
VALUE key_8 0 6
data_8
END
get key_9
VALUE key_9 0 6
data_9
END
本文扩展
当然本文所演示的 EVCache配合 memcached使用时,memcached被硬编码进代码,实际过程中使用,可以将其与 ZK等服务发现服务进行一个结合,实现灵活运用,这就不在本文进行赘述。
后 记
由于能力有限,若有错误或者不当之处,还请大家批评指正,一起学习交流!
- My Personal Blog:CodeSheep 程序羊
- 我的半年技术博客之路
转载于:https://my.oschina.net/hansonwang99/blog/2967146
EVCache缓存在 Spring Boot中的实战相关推荐
- 在Spring Boot中使用数据缓存
关注公众号[江南一点雨],专注于 Spring Boot+微服务以及前后端分离等全栈技术,定期视频教程分享,关注后回复 Java ,领取松哥为你精心准备的 Java 干货! 春节就要到了,在回家之前要 ...
- 如何在Spring Boot中玩转智能合约【修订版】
本文是由链博科技 ChainBoard.IO 为大家带来的web3j 对智能合约的调用.让 java 程序可以和我们的智能合约愉快的交互起来~ 一. 什么是 web3j web3j是一个高度模块化.响 ...
- 如何在Spring Boot中玩转智能合约
本文是由链博科技 ChainBoard.IO 为大家带来的web3j 对智能合约的调用.让 java 程序可以和我们的智能合约愉快的交互起来~ 一.什么是 web3j web3j是一个高度模块化.响应 ...
- Spring Boot 揭秘与实战(二) 数据缓存篇 - EhCache
文章目录 1. EhCache 集成 2. 源代码 本文,讲解 Spring Boot 如何集成 EhCache,实现缓存. 在阅读「Spring Boot 揭秘与实战(二) 数据缓存篇 - 快速入门 ...
- Spring Boot中使用MongoDB数据库
MongoDB简介 MongoDB是一个基于分布式文件存储的数据库,它是一个介于关系数据库和非关系数据库之间的产品,其主要目标是在键/值存储方式(提供了高性能和高度伸缩性)和传统的RDBMS系统(具有 ...
- springboot(三):Spring boot中Redis的使用
转自www.ityouknow.com spring boot对常用的数据库支持外,对nosql 数据库也进行了封装自动化. redis介绍 Redis是目前业界使用最广泛的内存数据存储.相比memc ...
- Spring Boot Redis Cluster 实战干货
转载自 Spring Boot Redis Cluster 实战干货 添加配置信息 spring.redis:database: 0 # Redis数据库索引(默认为0)#host: 192.168 ...
- Spring Boot中使用Redis数据库
Spring Boot中除了对常用的关系型数据库提供了优秀的自动化支持之外,对于很多NoSQL数据库一样提供了自动化配置的支持,包括:Redis, MongoDB, Elasticsearch, So ...
- (转)Spring Boot(三):Spring Boot 中 Redis 的使用
http://www.ityouknow.com/springboot/2016/03/06/spring-boot-redis.html Spring Boot 对常用的数据库支持外,对 Nosql ...
最新文章
- 1136 A Delayed Palindrome 需再做
- linux系统编程:自己动手写一个cp命令
- 突然感到很无聊当没有看书时
- sql server 怎么把视图中的数据存到另外一张表中_承上篇,自制插件优化Kep数据存储问题...
- 基于matlab的语音信号基本处理系统,基于matlab的语音信号处理及分析
- ObjectDataSource与GridView配合使用经验总结系列二:分页
- Node.js设置CORS跨域请求中多域名白名单的方法
- Xcode 8.1 : Unable to read from device
- 幕墙计算软件_案例BIM在玻璃幕墙参数化设计的应用
- 使用python来读取超大型文件数据
- jsp:setProperty getProperty标签的使用
- 体育馆预约系统java_基于SSM框架下的JAVA体育场地预约系统
- 详解sqlserver 执行计划
- python Socket网络编程
- Java垃圾回收机制知识点总结
- 解析《啊哈C》--最终章:用C语言制作走迷宫和推箱子的小游戏
- AT绑定句柄无效和拒绝访问
- c语言strlen转义字符,转义字符 sizeof strlen
- MySQL数据库必会的增删查改操作(CRUD)
- Julia-第一章简介和资源汇总
热门文章
- [VB]在状态栏中显示帮助信息
- SCPPO(三):禅道的使用—项目管理员、开发等人员
- 机房收费系统个人重构版:暮然回首,灯火阑珊
- CCF业务总部和学术交流中心落户苏州相城
- 十分钟,我搞定了一个人物检测模型
- LeCun:深度学习在信号理解中的强大和局限(视频+PPT)
- 合作 | IEIC·IT耳朵智能创新大会:人工智能落地将带来新风口
- 2018年IEEE Fellow名单:32位中国学者入选,清华成最大赢家
- JS+XMLDOM+XSL:实现中英文界面切换、排序、分页显示、增删改查XML文件数据源
- 摩拜前端周刊第10期