分布式缓存技术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.java
public 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客户端的使用的更多相关文章
- 分布式缓存技术redis学习系列
分布式缓存技术redis学习系列(一)--redis简介以及linux上的安装以及操作redis问题整理 分布式缓存技术redis学习系列(二)--详细讲解redis数据结构(内存模型)以及常用命令 ...
- 分布式缓存技术redis学习系列(一)——redis简介以及linux上的安装
redis简介 redis是NoSQL(No Only SQL,非关系型数据库)的一种,NoSQL是以Key-Value的形式存储数据.当前主流的分布式缓存技术有redis,memcached,ssd ...
- 分布式缓存技术redis学习(一)——redis简介以及linux上的安装
redis简介 redis是NoSQL(No Only SQL,非关系型数据库)的一种,NoSQL是以Key-Value的形式存储数据.当前主流的分布式缓存技术有redis,memcached,ssd ...
- 分布式缓存技术redis学习系列(三)——redis高级应用(主从、事务与锁、持久化)
上文<详细讲解redis数据结构(内存模型)以及常用命令>介绍了redis的数据类型以及常用命令,本文我们来学习下redis的一些高级特性. 安全性设置 设置客户端操作秘密 redis安装 ...
- 分布式缓存技术redis学习(三)——redis高级应用(主从、事务与锁、持久化)
上文<详细讲解redis数据结构(内存模型)以及常用命令>介绍了redis的数据类型以及常用命令,本文我们来学习下redis的一些高级特性.目录如下: 安全性设置 设置客户端操作秘密 客户 ...
- 分布式缓存技术redis学习系列(五)——redis实战(redis与spring整合,分布式锁实现)
本文是redis学习系列的第五篇,点击下面链接可回看系列文章 <redis简介以及linux上的安装> <详细讲解redis数据结构(内存模型)以及常用命令> <redi ...
- 分布式缓存技术redis学习系列(四)——redis高级应用(集群搭建、集群分区原理、集群操作)
本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...
- 分布式缓存技术redis学习系列(二)——详细讲解redis数据结构(内存模型)以及常用命令
Redis数据类型 与Memcached仅支持简单的key-value结构的数据记录不同,Redis支持的数据类型要丰富得多,常用的数据类型主要有五种:String.List.Hash.Set和Sor ...
- 分布式缓存技术redis学习(四)——redis高级应用(集群搭建、集群分区原理、集群操作)
本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...
- 分布式缓存技术redis学习(二)——详细讲解redis数据结构(内存模型)以及常用命令
Redis数据类型 与Memcached仅支持简单的key-value结构的数据记录不同,Redis支持的数据类型要丰富得多,常用的数据类型主要有五种:String.List.Hash.Set和Sor ...
随机推荐
- mosquitt win32
软件 mosquitto-1.4.10-install-win32.exe. 安装时候提示下载后面两个.win32openssl一定是1_0_1,否则没有需要的dll文件. pthreadVC2.dl ...
- 深夜重温JavaScript中的对象和数组
这一块实际上已经学过了,因为没有学好,在工作过程中遇到一些对象或者数组的操作,会去百度查找,浪费了许多宝贵的时间,所以特地再拐过头来重新学习. 对象 基本概念: 对象这种基本的数据结构还有其他很多种叫 ...
- rails
http://ruby-toolbox.com/ ~/.gemrc --- :backtrace: false :benchmark: false :bulk_threshold: 1000 :sou ...
- Root--超级用户
http://www.shuame.com/root/ root (计算机术语言) ROOT存在于Linux系统.UNIX系统(如AIX.BSD等)和类UNIX系统(如稳定到服务器都在用的Debia ...
- 常用的网络命令--之...... Ipconfig详解
ipconfig是运行微软的Windows9x/NT/2000/XP/Vista操作系统的电脑上用来控制网络连接的一个命令行工具.它的主要功用,包括用来显示现时网络连接的设置(/all参数),或通过/ ...
- linux系统下修改文件夹目录权限
linux系统下修改文件夹目录权限 文件夹权限问题 Linux.Fedora.Ubuntu修改文件.文件夹权限的方法差不多.很多人开始接触Linux时都很头痛Linux的文件权限问题.这里告诉大家如何 ...
- oracle数据库_实例_用户_表空间之间的关系(转)
数据库:Oracle数据库是数据的物理存储.这就包括(数据文件ORA或者DBF.控制文件.联机日志.参数文件).其实Oracle数据库的概念和其它数据库不一样,这里的数据库是一个操作系统只有一个库.可 ...
- MRDS学习一——Hello World
第一步:从左边的Basic Activities中把Data这个元件拖到Diagram中,把Data的类别改为string,中间填入Hello World. 第二步:接着把这个资料输出到一个Servi ...
- Java开发规范摘录
对于规范的 JAVA 派生类,尽量用 eclipse工具来生成文件格式,避免用手写的头文件/实现文件. 尽量避免一行的长度超过 200 个字符,因为很多终端和工具不能很好处理之.缩进8格 ,impor ...
- spark streaming 接收 kafka 数据java代码WordCount示例
http://www.cnblogs.com/gaopeng527/p/4959633.html