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客户端的使用的更多相关文章

  1. 分布式缓存技术redis学习系列

    分布式缓存技术redis学习系列(一)--redis简介以及linux上的安装以及操作redis问题整理 分布式缓存技术redis学习系列(二)--详细讲解redis数据结构(内存模型)以及常用命令 ...

  2. 分布式缓存技术redis学习系列(一)——redis简介以及linux上的安装

    redis简介 redis是NoSQL(No Only SQL,非关系型数据库)的一种,NoSQL是以Key-Value的形式存储数据.当前主流的分布式缓存技术有redis,memcached,ssd ...

  3. 分布式缓存技术redis学习(一)——redis简介以及linux上的安装

    redis简介 redis是NoSQL(No Only SQL,非关系型数据库)的一种,NoSQL是以Key-Value的形式存储数据.当前主流的分布式缓存技术有redis,memcached,ssd ...

  4. 分布式缓存技术redis学习系列(三)——redis高级应用(主从、事务与锁、持久化)

    上文<详细讲解redis数据结构(内存模型)以及常用命令>介绍了redis的数据类型以及常用命令,本文我们来学习下redis的一些高级特性. 安全性设置 设置客户端操作秘密 redis安装 ...

  5. 分布式缓存技术redis学习(三)——redis高级应用(主从、事务与锁、持久化)

    上文<详细讲解redis数据结构(内存模型)以及常用命令>介绍了redis的数据类型以及常用命令,本文我们来学习下redis的一些高级特性.目录如下: 安全性设置 设置客户端操作秘密 客户 ...

  6. 分布式缓存技术redis学习系列(五)——redis实战(redis与spring整合,分布式锁实现)

    本文是redis学习系列的第五篇,点击下面链接可回看系列文章 <redis简介以及linux上的安装> <详细讲解redis数据结构(内存模型)以及常用命令> <redi ...

  7. 分布式缓存技术redis学习系列(四)——redis高级应用(集群搭建、集群分区原理、集群操作)

    本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...

  8. 分布式缓存技术redis学习系列(二)——详细讲解redis数据结构(内存模型)以及常用命令

    Redis数据类型 与Memcached仅支持简单的key-value结构的数据记录不同,Redis支持的数据类型要丰富得多,常用的数据类型主要有五种:String.List.Hash.Set和Sor ...

  9. 分布式缓存技术redis学习(四)——redis高级应用(集群搭建、集群分区原理、集群操作)

    本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...

  10. 分布式缓存技术redis学习(二)——详细讲解redis数据结构(内存模型)以及常用命令

    Redis数据类型 与Memcached仅支持简单的key-value结构的数据记录不同,Redis支持的数据类型要丰富得多,常用的数据类型主要有五种:String.List.Hash.Set和Sor ...

随机推荐

  1. bzoj 2756奇怪的游戏

    2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec  Memory Limit: 128 MB Description Blinke 最近喜欢上一个奇怪的游戏. 这个游戏 ...

  2. 通过grep来进行日志分析,grep -C和配合awk实际对catalina.out使用案例

    本文介绍通过grep来进行日志分析,主要介绍grep -C和配合awk实际对catalina.out使用案例 grep可以对日志文件进行筛选,统计,查询,快速定位bug. 首先,你的日志需要比较规范, ...

  3. PHP 流程管理

    添加新流程页面: <div> 请选择流程节点:<br /><br /> <?php session_start(); include("../DBD ...

  4. myBatis foreach详解【转】

    MyBatis的foreach语句详解 foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.foreach元素的属性主要有 item,index,collection,ope ...

  5. Class PLBuildVersion is implemented in both /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/PrivateFrameworks/AssetsLibr

    网上找了一大堆,没有解决的办法 ,主要是iOS10的适配问题,info.plist里没有加对. 访问相册,我只加了 <!-- 相册 --> <key>NSPhotoLibrar ...

  6. 浅谈JavaScript中的defer,async

    引言 开始重读<<JavaScript高级程序设计>>一书,看到关于JavaScript中关于defer.async的部分.网上查询了点资料,觉得蛮好的.现在总结下. defe ...

  7. Coursera系列-R Programming第二周

    博客总目录,记录学习R与数据分析的一切:http://www.cnblogs.com/weibaar/p/4507801.html  --- 好久没发博客 且容我大吼一句 终于做完这周R Progra ...

  8. KEGG数据库的使用方法与介绍

    KEGG数据库的使用方法与介绍 KEGG的数据 KEGG中的pathway是根据相关知识手绘的,这里的手绘的意思可能是指人工以特定的语言格式来确定通路各组件的联系:基因组信息主要是从NCBI等数据库中 ...

  9. fetch 资源请求

    简介:fetch() 方法用于发起获取资源的请求.它返回一个 promise,这个 promise 会在请求响应后被 resolve,并传回 Response 对象. 为了更好的体验,可点击这里阅读 ...

  10. dp 走格子问题

    问题: 一个5x8的格子,想从左下角走到右上角,求最短路径,共有多少种走法. 思路: 因为是求最短路径,所以,只会往右往上走. 我们可以把棋盘的左下角看做二维坐标的原点(0,0),把棋盘的右上角看做二 ...