分布式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格式数据的耗时,减少了数据库的访问频率和服务器的压力。

 

 

 

时间: 06-28

分布式memcached学习(五)—— memcached java客户端的使用的相关文章

分布式memcached学习(四)&mdash;&mdash; 一致性hash算法原理

    分布式一致性hash算法简介 当你看到"分布式一致性hash算法"这个词时,第一时间可能会问,什么是分布式,什么是一致性,hash又是什么.在分析分布式一致性hash算法原理之前,我们先来了解一下这几个概念. 分布式 分布式(distributed)是指在多台不同的服务器中部署不同的服务模块,通过远程调用协同工作,对外提供服务. 以一个航班订票系统为例,这个航班订票系统有航班预定.网上值机.旅客信息管理.订单管理.运价计算等服务模块.现在要以集中式(集群,cluster)和分布

memcached的Java客户端

1. memcached的守护进程是用c写的,但是客户端可以使用任何语言来编写,并通过memcached协议与守护进程通信. 2. memcached的Java客户端可以查看 http://code.google.com/p/memcached/wiki/Clients,大致有Java memcached client/dangg       spymemcached    xmemcached 3.官方的Memcached的Java客户端API,主要提供的调用类是SockIOPool和MemC

Memcached学习笔记之一:memcached安装

一.概念 Memcached是一个自由开源的,高性能,分布式内存对象缓存系统. Memcached是一种基于内存的key-value存储,用来存储小块对的任意数据(字符串.对象等).这些数据可以是数据库调用,api调用或者是页面渲染的结果. 一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态web应用的速度,提高可扩展性. Memcached 官网:http://memcached.org/. 二.原理 Memcached有两个核心组件:服务端和客户端.首先客户端拿到服务端

memcached学习笔记6--浅谈memcached的机制 以及 memcached细节讨论

附:请浅谈memcached的机制 答: ①基于C/S架构,协议比较简单 c/s架构,此时memcached为服务器端,我们可以使用如PHP,c++/c等程序连接memcached服务器. memcached的服务器客户端通信并不使用XML等格式,而使用简单的基于文本行的协议,因此通过telnet也能在memcached上保存.读取数据. ②基于libevent事件来处理的 libevent是一套垮平台的事件处理接口的封装,能够处理兼容包括这些操作系统: windows/Linux/BSD/So

基于CentOS6.5的LNMP下memcached学习笔记的整理

1.概述 Memcached是一个C语言编写的高性能分布式的内存对象缓存系统,用于减少Web应用直接跟数据库交互,从而减轻数据库负载压力,将一些经常访问的数据对象以K/V(键/值)对的形式存放在内存中作为缓存数据.缓存是一种加速应用向后端服务器读取数据的优化手段,其思想是用对内存的读取换取直接对磁盘数据库中数据的操作,以提高web应用程序的访问速度,从而实现web动态页面高性能.高并发的访问. Memcached是通过C语言Danga Interactive开发编写的,使用libevent框架实

添加分布式的多个memcached服务器

如果有多台memcached服务器端,最好使用Memcache::addServer()来连接服务前端.而不是Memcache::connect()去连接memcached服务器,是因为PHP客户端是利用服务器池,根据算法将key分配到不同的服务器中. boolMemcache::addServer (string $host [,int $port =11211[,bool $persistent [,int $weight [,int $timeout [,int $retry_interv

memcached学习笔记(一)

预留位置,待整理 memcached学习笔记(一),布布扣,bubuko.com

java基础知识回顾之java Thread类学习(五)--java多线程安全问题(锁)同步的前提

这里举个例子讲解,同步synchronized在什么地方加,以及同步的前提: * 1.必须要有两个以上的线程,才需要同步. * 2.必须是多个线程使用同一个锁. * 3.必须保证同步中只能有一个线程在运行,锁加在哪一块代码 那么我们要思考的地方有:1.知道我们写的哪些是多线程代码 2.明确共享数据 3.明确多线程运行的代码中哪些语句是操作共享数据的.. 4.要确保使用同一个锁. 下面的代码:需求:两个存户分别往银行存钱,每次村100块,分三次存完. class bank{ private int

memcached学习笔记5--socke操作memcached 缓存系统

使用条件:当我们没有权限或者不能使用服务器的时候,我们需要用socket操作memcached memcached-client操作 特点: 无需开启memcache扩展 使用fsocketopen()套接字连接memcached 同样执行CRUD require_once(CLASS_PATH.'memcached-client.php');//CLASS_PATH 是我定义的类文件文件夹路径 $mc = new memcached( array( 'servers' => array( '1