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客户端的使用相关推荐

  1. memcached java 客户端优化,分布式缓存技术memcached学习系列(五)—— memcached java客户端的使用...

    Memcached的客户端简介 我们已经知道,memcached是一套分布式的缓存系统,memcached的服务端只是缓存数据的地方,并不能实现分布式,而memcached的客户端才是实现分布式的地方 ...

  2. java 分布式 redis缓存技术_JAVA架构师系列课程分布式缓存技术Redis权威指南,资源教程下载...

    课程名称 JAVA架构师系列课程分布式缓存技术Redis权威指南,资源教程下载 课程目标 本课程从0基础开始,对redis的方方面面进行细粒度的讲解:包括基础操作.高级命令.各种集群模式.动态增减节点 ...

  3. 分布式专题-分布式缓存技术之MongoDB04-基于MongoDB实现网络云盘实战

    目录导航 前言 基本实现思路介绍 抛砖引玉 设计思路 数据隔离 高效存储解决方案 主要功能 核心代码演示 数据库设计 手写核心业务代码 登录/注销 上传文件 下载 浏览 后记 前言 前面的章节,关于分 ...

  4. 分布式专题-分布式缓存技术之MongoDB01-应用场景及实现原理

    目录导航 前言 什么是 NoSQL 关系型数据库 PK 非关系型数据库 NoSQL 数据库分类 MongoDB的数据结构与关系型数据库数据结构对比 MongoDB中的数据类型 图解MongoDB底层原 ...

  5. Memcached学习一:Memcached安装使用

    Memcached学习一:Memcached安装使用 这篇博文以实用为目的,因此,先阐述如何安装Memcached,然后在实践中谈谈自己自己对Memcached的一点理解. 首先,安装Memcache ...

  6. Android音视频学习系列(五) — 掌握音频基础知识并使用AudioTrack、OpenSL ES渲染PCM数据

    系列文章 Android音视频学习系列(一) - JNI从入门到精通 Android音视频学习系列(二) - 交叉编译动态库.静态库的入门 Android音视频学习系列(三) - Shell脚本入门 ...

  7. idea学习系列五之debug及插件的使用

    idea学习系列五之debug及插件的使用 上一篇,介绍了maven及服务器的使用,这里将介绍idea中debug及插件的使用.在实际开发中debug是最常用的了,而且idea相比于eclipse中的 ...

  8. Linux学习系列五:Shell命令脚本的基本语法

    这个系列的Linux教程主要参考刘遄老师的<Linux就该这么学>.用的系统是RHEL8,如果遇见一些命令出现问题,请首先检查自己的系统是否一致,如果不一致,可网上查一下系统间某些命令之间 ...

  9. Java学习系列(十八)Java面向对象之基于UDP协议的网络通信

    UDP协议:无需建立虚拟链路,协议是不可靠的. A节点以DatagramSocket发送数据包,数据报携带数据,数据报上还有目的目地地址,大部分情况下,数据报可以抵达:但有些情况下,数据报可能会丢失 ...

  10. Java学习系列(十六)Java面向对象之基于TCP协议的网络通信

    TCP/IP的网络分层模型:应用层(HTTP/FTP/SMTP/POPS...),传输层(TCP协议),网络层(IP协议,负责为网络上节点分配唯一标识),物理层+数据链路层). IP地址用于标识网络中 ...

最新文章

  1. 禁用java rmi_java-如何安全关闭rmi客户端?
  2. Android应用程序组件Content Provider简要介绍和学习计划
  3. java项目加减乘除验证码_课堂Java小程序(加减乘除与验证码)
  4. C#读取EXIF信息类
  5. 信息学奥赛一本通 1182:合影效果 | OpenJudge NOI 1.10 07:合影效果
  6. 10 行代码构建常见目标检测应用
  7. 注解形式控制器 数据验证,类型转换(2)
  8. python-requests数据驱动延伸
  9. mysql中sex数据类型_MySQL数据类型+简单操作
  10. 最详细的《牛津阅读树》(Oxford Reading Tree)攻略,没有之一
  11. 什么是软件项目管理中的WBS?
  12. 三阶魔方学习(新手入门)
  13. 网站域名如何解析到阿里云和腾讯云服务器?
  14. EXCEL身份证号码校验以及提取基本信息
  15. (十九)通俗易懂理解——无人驾驶概述
  16. 前端开发入门 --摘自慕克网大漠穷秋
  17. 增量式编码器和绝对式编码器区别
  18. Android开发自定义相机,自定义拍照界面
  19. 竟然可以在Windows下用Nvim写代码?1.基础配置环境与安装nvim
  20. rk3288 android6,RK3288 的 Android 7.1.2 来了!

热门文章

  1. 算法导论2.1-2.3 部分答案
  2. NSArray和NSString的联合使用
  3. ios 6.1中 Release问题
  4. windows环境 logstash file input fail 解决
  5. 交换二叉树的每个节点的左右子树
  6. 诗与远方:无题(八十六)
  7. Eclipse远程调试Java代码的三种方法
  8. mysql8.0新建用户登录_Mysql8.0 创建远程登陆账户
  9. 只收藏不点赞的人是什么心理???
  10. 高性价比手持机有哪些