XMemcached使用示例--转
Memcached 是一个高性能的分布式内存对象的key-value缓存系统,用于动态Web应用以减轻数据库负载,现在也有很多人将它作为内存式数据库在使用,memcached通过它的自定义协议与客户端交互,而XMemcached就是它的一个java客户端实现。
XMemcached使用示例(本示例基于xmemcached-1.3.8.jar),总结一个,如下:
package com.wujintao.memcached; import java.io.IOException;
import java.util.concurrent.TimeoutException; import net.rubyeye.xmemcached.Counter;
import net.rubyeye.xmemcached.GetsResponse;
import net.rubyeye.xmemcached.MemcachedClient;
import net.rubyeye.xmemcached.MemcachedClientBuilder;
import net.rubyeye.xmemcached.XMemcachedClientBuilder;
import net.rubyeye.xmemcached.auth.AuthInfo;
import net.rubyeye.xmemcached.command.BinaryCommandFactory;
import net.rubyeye.xmemcached.exception.MemcachedException;
import net.rubyeye.xmemcached.transcoders.StringTranscoder;
import net.rubyeye.xmemcached.utils.AddrUtil; import org.junit.Test; import com.wujintao.redis.util.MD5Util; public class TestCase {
@Test
public void test1() throws IOException {
MemcachedClientBuilder builder = new XMemcachedClientBuilder(
AddrUtil.getAddresses("localhost:11211"));
// AddrUtil.getAddresses("server1:11211 server2:11211")
// 宕机报警
builder.setFailureMode(true);
// 使用二进制文件
builder.setCommandFactory(new BinaryCommandFactory());
/**
* 设置连接池大小,即客户端个数
* In a high concurrent enviroment,you may want to pool memcached clients.
* But a xmemcached client has to start a reactor thread and some thread pools,
* if you create too many clients,the cost is very large.
* Xmemcached supports connection pool instreadof client pool.
* you can create more connections to one or more memcached servers,
* and these connections share the same reactor and thread pools,
* it will reduce the cost of system.
* 默认的pool size是1。设置这一数值不一定能提高性能,请依据你的项目的测试结果为准。初步的测试表明只有在大并发下才有提升。
* 设置连接池的一个不良后果就是,同一个memcached的连接之间的数据更新并非同步的
* 因此你的应用需要自己保证数据更新的原子性(采用CAS或者数据之间毫无关联)。
*/
builder.setConnectionPoolSize(10);
MemcachedClient client = builder.build();
try {
/**
* 第一个是存储的key名称,
* 第二个是expire时间(单位秒),超过这个时间,memcached将这个数据替换出去,0表示永久存储(默认是一个月)
* 第三个参数就是实际存储的数据
*/
client.set("hello", 0, "Hello,xmemcached");
String value = client.get("hello");
System.out.println("hello=" + value);
client.delete("hello");
value = client.get("hello");
System.out.println("hello=" + value); // value=client.get(“hello”,3000); /**
* Memcached是通过cas协议实现原子更新,所谓原子更新就是compare and set,
* 原理类似乐观锁,每次请求存储某个数据同时要附带一个cas值, memcached比对这个cas值与当前存储数据的cas值是否相等,
* 如果相等就让新的数据覆盖老的数据,如果不相等就认为更新失败, 这在并发环境下特别有用
*/
GetsResponse<Integer> result = client.gets("a");
long cas = result.getCas();
// 尝试将a的值更新为2
if (!client.cas("a", 0, 2, cas)) {
System.err.println("cas error");
}
} 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
}
try {
// close memcached client
client.shutdown();
} catch (IOException e) {
System.err.println("Shutdown MemcachedClient fail");
e.printStackTrace();
} } @Test
public void test2() throws TimeoutException, InterruptedException,
MemcachedException, IOException {
MemcachedClientBuilder builder = new XMemcachedClientBuilder(
AddrUtil.getAddresses("localhost:11211"));
MemcachedClient client = builder.build();
client.flushAll();
if (!client.set("hello", 0, "world")) {
System.err.println("set error");
}
if (client.add("hello", 0, "dennis")) {
System.err.println("Add error,key is existed");
}
if (!client.replace("hello", 0, "dennis")) {
System.err.println("replace error");
}
client.append("hello", " good");
client.prepend("hello", "hello ");
String name = client.get("hello", new StringTranscoder());
System.out.println(name); /**
* 而删除数据则是通过deleteWithNoReply方法,这个方法删除数据并且告诉memcached
* 不用返回应答,因此这个方法不会等待应答直接返回,特别适合于批量处理
*/
client.deleteWithNoReply("hello");
} @Test
public void incrDecr() throws IOException, TimeoutException,
InterruptedException, MemcachedException {
MemcachedClientBuilder builder = new XMemcachedClientBuilder(
AddrUtil.getAddresses("localhost:11211"));
MemcachedClient client = builder.build();
/**
* 第一个参数指定递增的key名称, 第二个参数指定递增的幅度大小, 第三个参数指定当key不存在的情况下的初始值。
* 两个参数的重载方法省略了第三个参数,默认指定为0。
*/
assert (1 == client.incr("a", 5, 1));
assert (6 == client.incr("a", 5));
assert (10 == client.incr("a", 4));
assert (9 == client.decr("a", 1));
assert (7 == client.decr("a", 2));
} @Test
public void counter() throws Exception {
MemcachedClientBuilder builder = new XMemcachedClientBuilder(
AddrUtil.getAddresses("localhost:11211"));
MemcachedClient client = builder.build();
Counter counter = client.getCounter("counter", 0);
counter.incrementAndGet();
counter.decrementAndGet();
counter.addAndGet(-10);
} public void auth() throws Exception {
MemcachedClientBuilder builder = new XMemcachedClientBuilder(
AddrUtil.getAddresses("localhost:11211"));
builder.addAuthInfo(AddrUtil.getOneAddress("localhost:11211"),
AuthInfo.typical("cacheuser", "123456"));
// Must use binary protocol
builder.setCommandFactory(new BinaryCommandFactory());
MemcachedClient client = builder.build();
} public void nioPool() throws Exception {
MemcachedClientBuilder builder = new XMemcachedClientBuilder(
AddrUtil.getAddresses("localhost:11211"));
builder.setConnectionPoolSize(5);
} /**
*这里应该安装kestrel消息服务器,才能使用如下API生效
* @throws IOException
* @throws MemcachedException
* @throws InterruptedException
* @throws TimeoutException
*/
@Test
public void testGet() throws IOException, TimeoutException, InterruptedException, MemcachedException{
MemcachedClientBuilder builder = new XMemcachedClientBuilder(
AddrUtil.getAddresses("localhost:11212"));
MemcachedClient client = builder.build();
String value = client.get("1");
System.out.println("hello=" + value);
} @Test
public void testGet2() throws IOException, TimeoutException, InterruptedException, MemcachedException{
MemcachedClientBuilder builder = new XMemcachedClientBuilder(
AddrUtil.getAddresses("localhost:11212"));
MemcachedClient client = builder.build();
String value = client.get("srp_"+MD5Util.MD5("3rdsearch_周杰伦"));
System.out.println(value);
}
}
转自:http://javacrazyer.iteye.com/blog/1840119
XMemcached使用示例--转的更多相关文章
- 使用MEMCACHED实现缓存
什么是memcached Memcached是一个自由开源的,高性能,分布式内存对象缓存系统. Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fit ...
- XMemcached简单使用示例
Memcached的Java客户端目前有三个: Memcached Client for Java 比 SpyMemcached更稳定.更早.更广泛: SpyMemcached 比 Memcached ...
- 分布式服务框架 dubbo/dubbox 入门示例
dubbo是一个分布式的服务架构,可直接用于生产环境作为SOA服务框架. 官网首页:http://dubbo.io/ ,官方用户指南 http://dubbo.io/User+Guide-zh.htm ...
- 02.XMemcached的使用
关于XMemcached的介绍或文档请参考:https://code.google.com/p/xmemcached/wiki/User_Guide_zh 关于Memcached的命令 ...
- 分布式服务框架 dubbo/dubbox 入门示例(转)
dubbo是一个分布式的服务架构,可直接用于生产环境作为SOA服务框架. 官网首页:http://dubbo.io/ ,官方用户指南 http://dubbo.io/User+Guide-zh.htm ...
- dubbo环境搭建与tomcat集成、DEMO示例、常见问题(最完整版本、带管理控制台、监控中心、zookeeper)
以windows为例,linux基本相同,开发环境一般linux,个人环境一般windows(如果不开额外vm的话). 示例以dubbo官方自带demo为例子,进行整合和稍加修改测试. 0.dubbo ...
- XMemcached 中文api
变更历史 2010-06-22 添加客户端分布和SASL验证两节,更新spring配置一节. 2010-06-23 添加maven依赖说明 2010-10-17 1.2.6 released 2011 ...
- Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)
本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...
- .NET跨平台之旅:将示例站点升级至 ASP.NET Core 1.1
微软今天在 Connect(); // 2016 上发布了 .NET Core 1.1 ,ASP.NET Core 1.1 以及 Entity Framework Core 1.1.紧跟这次发布,我们 ...
随机推荐
- OpenGL学习之路(五)
1 引子 不知不觉我们已经进入到读书笔记(五)了,我们先对前四次读书笔记做一个总结.前四次读书笔记主要是学习了如何使用OpenGL来绘制几何图形(包括二维几何体和三维几何体),并学习了平移.旋转.缩放 ...
- 我的WCF之旅(1):创建一个简单的WCF程序
为了使读者对基于WCF的编程模型有一个直观的映像,我将带领读者一步一步地创建一个完整的WCF应用.本应用功能虽然简单,但它涵盖了一个完整WCF应用的基本结构.对那些对WCF不是很了解的读者来说,这个例 ...
- C#百万数据查询超时问题
用c#从百万数据中筛选一些信息时,经常会出现程序连接超时的错误,常见的错误很多,例如:Timeout expired. The timeout period elapsed prior to comp ...
- 【Android】Android ListViewAnimations分析
使用:https://github.com/android-cn/android-open-project-demo/tree/master/listview-animations-demo APK例 ...
- MySQL中间层 Atlas
Atlas是由 Qihoo 360, Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目.它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量bu ...
- 问题:关于一个贴友的js留言板的实现
需求:用js做一个简单的留言板效果 html部分: 1: <!DOCTYPE> 2: <html lang="zh-en"> 3: <head> ...
- while (cin>>str)退出死循环
今天在练习的时候突然发现了这个问题,百度之感觉还挺常见的,故记之! //题目描述 // //写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串. // //输入描述 : //输入一个 ...
- leetcode@ [91] Decode Ways (Dynamic Programming)
https://leetcode.com/problems/decode-ways/ A message containing letters from A-Z is being encoded to ...
- 网络操作与AFNetworking
众所周知,苹果搞的一套框架NSContention发送请求与接收请求的方式十分繁琐.操作起来很不方便.不仅要做区分各种请求设置各种不同的参数,而且还要经常在多线程里操作,同时还要对请求与返回的数据做各 ...
- 转载 DevOps的基本原则与介绍
转载原地址: http://www.cnblogs.com/wintersun/p/3339047.html DevOps的基本原则与介绍 DevOps这个术语是developer与operatio ...