Memcached的几种Java客户端(待实践)
其实现在来尝试Memcached的客户端估计会有点过气,因为现在大势基本都在Redis那边。
Memcached Client目前有3种:
- Memcached Client for Java(已经停止更新)
- SpyMemcached(已经停止更新)
- XMemcached(一直更新,且支持客户端分片实现集群,基本现在是它的天下)
- 高性能
- 支持完整的Memcached文本协议,二进制协议。
- 支持JMX,可以通过MBean调整性能参数、动态添加/移除Server、查看统计等。
- 支持客户端统计
- 支持Memcached节点的动态增减。
- 支持Memcached分布:余数分布和一致性哈希分布。
- 更多的性能调整选项。
- XMemcached更容易与Spring集成。
- 支持客户端分片实现集群。
三种API的比较
1、较早推出的memcached JAVA客户端API,应用广泛,运行比较稳定。
2、A simple, asynchronous, single-threaded memcached client written in java. 支持异步,单线程的Memcached客户端,用到了Java1.5版本的concurrent和nio,存取速度会高于前者,但是稳定性不好,测试中常 报timeOut等相关异常。
3、XMemcached同样是基于java nio的客户端,Java nio相比于传统阻塞IO模型来说,有效率高(特别在高并发下)和资源耗费相对较少的优点。传统阻塞IO为了提高效率,需要创建一定数量的连接形成连接 池,而nio仅需要一个连接即可(当然,nio也是可以做池化处理),相对来说减少了线程创建和切换的开销,这一点在高并发下特别明显。因此XMemcached与Spymemcached在性能都非常优秀,在某些方面(存储的数据比较小的情况下)Xmemcached比Spymemcached的表现更为优秀,具体可以看这个Java Memcached Clients Benchmark。
示例代码
Memcached Client for Java
官网:https://github.com/gwhalin/Memcached-Java-Client
这个已经停止跟新。放弃使用!
import java.util.Date;
import com.danga.MemCached.*;
public class MemcacheManagerForGwhalin {
// 构建缓存客户端
private static MemCachedClient cachedClient;
// 单例模式实现客户端管理类
private static MemcacheManagerForGwhalin INSTANCE = new MemcacheManagerForGwhalin();
private MemcacheManagerForGwhalin() {
cachedClient = new MemCachedClient();
// 初始化SockIOPool,管理memcached的连接池
SockIOPool pool = SockIOPool.getInstance();
// 设置缓存服务器列表,当使用分布式缓存的时,可以指定多个缓存服务器。(这里应该设置为多个不同的服务器)
String[] servers = { "192.168.163.10:11211", "192.168.163.11:11211"
// 也可以使用域名 "server3.mydomain.com:1624"
};
pool.setServers(servers);
pool.setFailover(true);
pool.setInitConn(10); // 设置初始连接
pool.setMinConn(5);// 设置最小连接
pool.setMaxConn(250); // 设置最大连接
pool.setMaxIdle(1000 * 60 * 60 * 3); // 设置每个连接最大空闲时间3个小时
pool.setMaintSleep(30);
pool.setNagle(false);
pool.setSocketTO(3000);
pool.setAliveCheck(true);
pool.initialize();
}
/**
* 获取缓存管理器唯一实例
*
* @return
*/
public static MemcacheManagerForGwhalin getInstance() {
return INSTANCE;
}
public void add(String key, Object value) {
cachedClient.set(key, value);
}
public void add(String key, Object value, int milliseconds) {
cachedClient.set(key, value, milliseconds);
}
public void remove(String key) {
cachedClient.delete(key);
}
public void remove(String key, int milliseconds) {
cachedClient.delete(key, milliseconds, new Date());
}
public void update(String key, Object value, int milliseconds) {
cachedClient.replace(key, value, milliseconds);
}
public void update(String key, Object value) {
cachedClient.replace(key, value);
}
public Object get(String key) {
return cachedClient.get(key);
}
public static void main(String[] args) {
//将对象加入到memcached缓存
cachedClient.add("keke", "This is a test String");
//从memcached缓存中按key值取对象
String result = (String) cachedClient.get("keke");
System.out.println(result);
}
}
Spymemcached
官网:http://code.google.com/p/spymemcached/
这个是不错的选择,但是有吭,在GitHub上找不到。
public class MemcacheManagerForSpy implements IMemcacheManager {
// 缓存客户端
private MemcachedClient memcacheCient;
// Manager管理对象,单例模式
private static MemcacheManagerForSpy INSTANCE = new MemcacheManagerForSpy();
private MemcacheManagerForSpy() {
try {
memcacheCient = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));
} catch (IOException e) {
e.printStackTrace();
}
}
public static MemcacheManagerForSpy getInstance() {
return INSTANCE;
}
@Override
public void add(String key, Object value, int milliseconds) {
memcacheCient.add(key, milliseconds, value);
}
@Override
public void add(String key, Object value) {
memcacheCient.add(key, 3600, value);
}
@Override
public void remove(String key, int milliseconds) {
memcacheCient.delete(key);
}
@Override
public void remove(String key) {
memcacheCient.delete(key);
}
@Override
public void update(String key, Object value, int milliseconds) {
memcacheCient.replace(key, milliseconds, value);
}
@Override
public void update(String key, Object value) {
memcacheCient.replace(key, 3600, value);
}
@Override
public Object get(String key) {
return memcacheCient.get(key);
}
}
Xmemcached
官网:https://github.com/killme2008/xmemcached
目前最火,且时长更新,截止今天都还在更新。
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import net.rubyeye.xmemcached.utils.AddrUtil;
import net.rubyeye.xmemcached.MemcachedClient;
import net.rubyeye.xmemcached.MemcachedClientBuilder;
import net.rubyeye.xmemcached.XMemcachedClientBuilder;
import net.rubyeye.xmemcached.exception.MemcachedException;
public class TestXMemcache { public static void main(String[] args) {
MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses("10.11.15.222:10000"));
MemcachedClient memcachedClient;
try {
memcachedClient = builder.build();
memcachedClient.set("hello", 0, "Hello,xmemcached");
String value = memcachedClient.get("hello");
System.out.println("hello=" + value);
memcachedClient.delete("hello");
value = memcachedClient.get("hello");
System.out.println("hello=" + value);
// close memcached client
memcachedClient.shutdown();
} catch (MemcachedException e) {
System.err.println("MemcachedClient operation fail");
e.printStackTrace();
} catch (TimeoutException e) {
System.err.println("MemcachedClient operation timeout");
e.printStackTrace();
} catch (InterruptedException e) {
// ignore
} catch (IOException e) {
System.err.println("Shutdown MemcachedClient fail");
e.printStackTrace(); } } }
参考:
http://blog.csdn.net/xuke6677/article/details/38706501
http://blog.csdn.net/hardy008/article/details/37738901
http://blog.csdn.net/arui_email/article/details/8129400
http://blog.csdn.net/heiyueya/article/details/64441901
http://exceptioneye.iteye.com/blog/1927741
http://blog.csdn.net/hengyunabc/article/details/20735701(缓存失效后的策略处理)
Memcached的几种Java客户端(待实践)的更多相关文章
- Memcached 集群环境Java客户端
Memcached 集群环境Java客户端 学习了: http://blog.csdn.net/zhouzhiwengang/article/details/53154112 http://guazi ...
- JAVA客户端API调用memcached两种方式
1. memcached client for java客户端API:memcached client for java 引入jar包:java-memcached-2.6.2.jar package ...
- memcached学习——常用命令+基于java客户端的3种简单实现(二)
常用命令: memcached设计的原则就是简单,所以支持的命令也不是特别多~ 1.查看memcached的状态,主要用于分析内存的使用状况.优化内存分配等 stats 查看memcached的运行状 ...
- 由Memcached升级到 Couchbase的 Java 客户端的过程记录(一)
背景: 在项目启动的选用了Memcached 作为缓存服务器,采用了Xmemcached作为客户端.在项目中使用了Shiro,为了给 Shiro 配置缓存的时候,采用了开源代码 https://g ...
- 缓存系统MemCached的Java客户端优化历程
Memcached 是什么? Memcached是一种集中式Cache,支持分布式横向扩展.这里需要解释说明一下,很多开发者觉得Memcached是一种分布式缓存系统,但是其实Memcached服务端 ...
- 转: memcached Java客户端spymemcached的一致性Hash算法
转自:http://colobu.com/2015/04/13/consistent-hash-algorithm-in-java-memcached-client/ memcached Java客户 ...
- Memcached学习笔记 — 第四部分:Memcached Java 客户端-gwhalin(1)-介绍及使用
介绍 Memcached java client是官方推荐的最早的memcached java客户端.最新版本:java_memcached-release_2.6.1. 官方下载地址:http ...
- 读Java并发编程实践中,向已有线程安全类添加功能--客户端加锁实现示例
在Java并发编程实践中4.4中提到向客户端加锁的方法.此为验证示例,写的不好,但可以看出结果来. package com.blackbread.test; import java.util.Arra ...
- 【转载】Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式…)介绍
转载地址:http://blog.csdn.net/truong/article/details/46711045 关键字:Redis的Java客户端Jedis的八种调用方式(事务.管道.分布式…)介 ...
随机推荐
- (1) Jenkins + Subversion + Maven + TestNG - 软件
软件需求 1 Jenkins http://jenkins-ci.org/ 2 Visual SVN Server https://www.visualsvn.com/server/ 3 Tortoi ...
- ASP.NET控件的ID,ClientID,UniqueId的区别
一般情况下三者相同(没有父控件) ID:获取或设置分配给服务器控件的编程标识符.分配给控件的编程标识符. (可写) 设置服务器控件上的此属性可提供对服务器控件的属性.事件和方法的编程访问.Web 开发 ...
- Node.js——require加载规则
判断require中的标识参数: 非路径的标识参数:也被称为是核心模块,已经被编译到二进制文件中 带有路径标识参数:自定义模块,一般都是相对定位 第三方模块:表现形式与核心模块一样,但是实际不一样,它 ...
- 【译】x86程序员手册34-9.7错误代码
9.7 Error Code 错误代码 With exceptions that relate to a specific segment, the processor pushes an error ...
- iTOP-4412开发板网盘资料介绍
iTOP-4412开发板网盘视频资料内容如下: 01-烧写.编译以及基础知识视频 02-嵌入式Linux 视频 03-iTOP-4412 开发板硬件设计指导视频 04-Android 应用程序视频 0 ...
- leetcode_357. Count Numbers with Unique Digits
https://leetcode.com/problems/count-numbers-with-unique-digits/ 给定一个n,计算[0,10^n]中十进制中每一位都不相同的数的数目. c ...
- CREATE TYPE - 定义一个新的数据类型
SYNOPSIS CREATE TYPE name AS ( attribute_name data_type [, ... ] ) CREATE TYPE name ( INPUT = input_ ...
- 模态对话框与非模态对话框(modeless)
对话框有两种创建方式:DoModal和Creat. 其中DoModal创建的是模态的对话框,而Creat创建的是非模态的对话框下面总结下他们的不同. 对于模态的对话框,在该对话框被关闭前,用户将不能在 ...
- 02Document Type Definition
Document Type Definition 1. Document Type Definition DTD(Document Type Definition)文件格式定义作用是给予文件一种格(T ...
- PHP 下基于 php-amqp 扩展的 RabbitMQ 简单用例 (四) -- Push API 和 Pull API
RabbitMQ 中针对消息的分发提供了 Push API (订阅模式) 和 Pull API (主动获取) 两种模式. 在 PHP 中, 这两种模式分别通过 AMQPQueue 类中的 consum ...