分布式缓存技术memcached学习系列(五)—— memcached java客户端的使用
Memcached的客户端简介
我们已经知道,memcached是一套分布式的缓存系统,memcached的服务端只是缓存数据的地方,并不能实现分布式,而memcached的客户端才是实现分布式的地方。
Memcached现在已被广泛使用,客户端实现也有较多的版本,基本上各个语言的都有。比如:Memcached client for Java、Spymemcached、xMemcached,各自有各自的优缺点。由于Memcached client for Java是Memcached官方发布的客户端,应用广泛,运行比较稳定,新版本在性能上也有所提高。我们接下来将使用该客户端进行实战演示。
Memcached的客户端下载
下载地址:https://github.com/gwhalin/Memcached-Java-Client/downloads
Memcached的客户端使用
下载下来的Memcached客户端有四个jar包,分别是:commons-pool-1.5.6.jar、java_memcached-release_2.6.6.jar、slf4j-api-1.6.1.jar、slf4j-simple-1.6.1.jar。将这四个jar包添加到项目的构建路径即可。
Memcached使用实例
我们将以缓存菜单列表进行实例演示,当访问后台首页加载系统菜单列表时,先判断菜单列表是否存在memcached中,如果不存在则从数据读取系统菜单列表,并存到memcached,否则直接从memcached中读取。如下:
//MemcachedFactory.javapublic class MemcachedFactory {// 创建MemCachedClient全局对象 private static MemCachedClient memCachedClient = new MemCachedClient();static { // 创建服务器列表及其权重 String[] servers = { "127.0.0.1:11211" }; Integer[] weights = { 3 };// 创建Socket连接池 SockIOPool pool = SockIOPool.getInstance();// 设置服务器信息 pool.setServers(servers); pool.setWeights(weights); pool.setFailover(true);// 设置初始连接数、最小和最大连接数以及最大处理时间 pool.setInitConn(5); pool.setMinConn(5); pool.setMaxConn(250); pool.setMaxIdle(1000 * 60 * 60 * 6);// 设置主线程睡眠时间 pool.setMaintSleep(30);// 设置TCP参数、连接超时等 pool.setNagle(false); pool.setSocketTO(3000); pool.setSocketConnectTO(0); pool.setAliveCheck(true);// 初始化连接池 pool.initialize(); }protected MemcachedFactory() { }// Memcached 实例 protected static MemcachedFactory instance = new MemcachedFactory();public static MemcachedFactory getInstance() { return instance; }/** * 添加缓存记录 * @param key * @param value * @return */ public boolean add(String key, Object value) { return memCachedClient.add(key, value); }/** * 添加缓存记录,有效期为expiry * @param key * @param value * @param expiry * @return */ public boolean add(String key, Object value, Date expiry) { return memCachedClient.add(key, value, expiry); }/** * 缓存查询结果对象QueryResult * @param key * @param value * @return */ public boolean add(String key, QueryResult<Menu> value) { return memCachedClient.add(key, value); }/** * 提取缓存记录 * @param key * @return */ public Object get(String key) { return memCachedClient.get(key); }/** * 判断缓存是否存在 * @param key * @return */ public boolean keyExist(String key) { return memCachedClient.keyExists(key); } }IndexController.java@Controller public class IndexCtroller{ @Autowired private IIndexService indexService;@RequestMapping(value = "/back/index") public String index(HttpServletRequest request) { MemcachedFactory mcInstance = MemcachedFactory.getInstance(); String jsonTree = null;//不存在key缓存记录则查询数据库并添加存入memcached if(!mcInstance.keyExist("jsonTree")) {List<Menu> menuList = indexService.queryMenu();List2JsonUtil<Menu> list2JsonUtil = new List2JsonUtil<Menu>(new Menu());jsonTree = list2JsonUtil.getJosnStrFromList(menuList, null);mcInstance.add("jsonTree", jsonTree); //否则直接从memcached中提取 }else {jsonTree = (String) mcInstance.get("jsonTree"); }if(null != jsonTree){request.setAttribute("jsonTree", jsonTree); } return "/back/index"; } }
页面效果
首次从数据库读取菜单列表耗时
我们注释掉IndexController.java中memcached的相关代码来看看首次从数据库读取菜单列表耗时。
从上图可以看到,首次访问数据加载菜单列表耗时1.17s,这些时间包括从数据库查询记录和将查询结果转为json格式数据的时间。
首次从memcached读取菜单列表耗时
放开IndexController.java中memcached的相关代码,来看看首次从memcached读取菜单列表耗时。
从上图可以看到,当菜单列表已经存入memcached中后,首次从memcached读取菜单列表的耗时21.970ms,这里省去了从数据库查询记录和将查询结果转为json格式数据的耗时。显然,从首次访问数据库和和首次访问memcached来看,响应速度确实快了不少。在memcached后台,我们看到了存取菜单列表jsonTree的信息,如下:
上面的读取菜单列表的耗时可能并不是很准确,由于浏览器等各方面因素的影响,随着访问频率的增加,访问数据库和访问memcached的耗时都会减少,然后在某一个范围内波动。但可以确定的是,访问memcached省去了从数据库查询记录和将查询结果转为json格式数据的耗时,减少了数据库的访问频率和服务器的压力。
分布式缓存技术memcached学习系列(五)—— memcached java客户端的使用相关推荐
- memcached java 客户端优化,分布式缓存技术memcached学习系列(五)—— memcached java客户端的使用...
Memcached的客户端简介 我们已经知道,memcached是一套分布式的缓存系统,memcached的服务端只是缓存数据的地方,并不能实现分布式,而memcached的客户端才是实现分布式的地方 ...
- java 分布式 redis缓存技术_JAVA架构师系列课程分布式缓存技术Redis权威指南,资源教程下载...
课程名称 JAVA架构师系列课程分布式缓存技术Redis权威指南,资源教程下载 课程目标 本课程从0基础开始,对redis的方方面面进行细粒度的讲解:包括基础操作.高级命令.各种集群模式.动态增减节点 ...
- 分布式专题-分布式缓存技术之MongoDB04-基于MongoDB实现网络云盘实战
目录导航 前言 基本实现思路介绍 抛砖引玉 设计思路 数据隔离 高效存储解决方案 主要功能 核心代码演示 数据库设计 手写核心业务代码 登录/注销 上传文件 下载 浏览 后记 前言 前面的章节,关于分 ...
- 分布式专题-分布式缓存技术之MongoDB01-应用场景及实现原理
目录导航 前言 什么是 NoSQL 关系型数据库 PK 非关系型数据库 NoSQL 数据库分类 MongoDB的数据结构与关系型数据库数据结构对比 MongoDB中的数据类型 图解MongoDB底层原 ...
- Memcached学习一:Memcached安装使用
Memcached学习一:Memcached安装使用 这篇博文以实用为目的,因此,先阐述如何安装Memcached,然后在实践中谈谈自己自己对Memcached的一点理解. 首先,安装Memcache ...
- Android音视频学习系列(五) — 掌握音频基础知识并使用AudioTrack、OpenSL ES渲染PCM数据
系列文章 Android音视频学习系列(一) - JNI从入门到精通 Android音视频学习系列(二) - 交叉编译动态库.静态库的入门 Android音视频学习系列(三) - Shell脚本入门 ...
- idea学习系列五之debug及插件的使用
idea学习系列五之debug及插件的使用 上一篇,介绍了maven及服务器的使用,这里将介绍idea中debug及插件的使用.在实际开发中debug是最常用的了,而且idea相比于eclipse中的 ...
- Linux学习系列五:Shell命令脚本的基本语法
这个系列的Linux教程主要参考刘遄老师的<Linux就该这么学>.用的系统是RHEL8,如果遇见一些命令出现问题,请首先检查自己的系统是否一致,如果不一致,可网上查一下系统间某些命令之间 ...
- Java学习系列(十八)Java面向对象之基于UDP协议的网络通信
UDP协议:无需建立虚拟链路,协议是不可靠的. A节点以DatagramSocket发送数据包,数据报携带数据,数据报上还有目的目地地址,大部分情况下,数据报可以抵达:但有些情况下,数据报可能会丢失 ...
- Java学习系列(十六)Java面向对象之基于TCP协议的网络通信
TCP/IP的网络分层模型:应用层(HTTP/FTP/SMTP/POPS...),传输层(TCP协议),网络层(IP协议,负责为网络上节点分配唯一标识),物理层+数据链路层). IP地址用于标识网络中 ...
最新文章
- 禁用java rmi_java-如何安全关闭rmi客户端?
- Android应用程序组件Content Provider简要介绍和学习计划
- java项目加减乘除验证码_课堂Java小程序(加减乘除与验证码)
- C#读取EXIF信息类
- 信息学奥赛一本通 1182:合影效果 | OpenJudge NOI 1.10 07:合影效果
- 10 行代码构建常见目标检测应用
- 注解形式控制器 数据验证,类型转换(2)
- python-requests数据驱动延伸
- mysql中sex数据类型_MySQL数据类型+简单操作
- 最详细的《牛津阅读树》(Oxford Reading Tree)攻略,没有之一
- 什么是软件项目管理中的WBS?
- 三阶魔方学习(新手入门)
- 网站域名如何解析到阿里云和腾讯云服务器?
- EXCEL身份证号码校验以及提取基本信息
- (十九)通俗易懂理解——无人驾驶概述
- 前端开发入门 --摘自慕克网大漠穷秋
- 增量式编码器和绝对式编码器区别
- Android开发自定义相机,自定义拍照界面
- 竟然可以在Windows下用Nvim写代码?1.基础配置环境与安装nvim
- rk3288 android6,RK3288 的 Android 7.1.2 来了!