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使用示例--转的更多相关文章

  1. 使用MEMCACHED实现缓存

    什么是memcached Memcached是一个自由开源的,高性能,分布式内存对象缓存系统. Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fit ...

  2. XMemcached简单使用示例

    Memcached的Java客户端目前有三个: Memcached Client for Java 比 SpyMemcached更稳定.更早.更广泛: SpyMemcached 比 Memcached ...

  3. 分布式服务框架 dubbo/dubbox 入门示例

    dubbo是一个分布式的服务架构,可直接用于生产环境作为SOA服务框架. 官网首页:http://dubbo.io/ ,官方用户指南 http://dubbo.io/User+Guide-zh.htm ...

  4. 02.XMemcached的使用

        关于XMemcached的介绍或文档请参考:https://code.google.com/p/xmemcached/wiki/User_Guide_zh     关于Memcached的命令 ...

  5. 分布式服务框架 dubbo/dubbox 入门示例(转)

    dubbo是一个分布式的服务架构,可直接用于生产环境作为SOA服务框架. 官网首页:http://dubbo.io/ ,官方用户指南 http://dubbo.io/User+Guide-zh.htm ...

  6. dubbo环境搭建与tomcat集成、DEMO示例、常见问题(最完整版本、带管理控制台、监控中心、zookeeper)

    以windows为例,linux基本相同,开发环境一般linux,个人环境一般windows(如果不开额外vm的话). 示例以dubbo官方自带demo为例子,进行整合和稍加修改测试. 0.dubbo ...

  7. XMemcached 中文api

    变更历史 2010-06-22 添加客户端分布和SASL验证两节,更新spring配置一节. 2010-06-23 添加maven依赖说明 2010-10-17 1.2.6 released 2011 ...

  8. Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)

    本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...

  9. .NET跨平台之旅:将示例站点升级至 ASP.NET Core 1.1

    微软今天在 Connect(); // 2016 上发布了 .NET Core 1.1 ,ASP.NET Core 1.1 以及 Entity Framework Core 1.1.紧跟这次发布,我们 ...

随机推荐

  1. 学习面试题Day04

    1.简述Java派生类中的构造方法如何为父类传递参数.     在Java中,使用super关键字加括号()的形式来为父类的构造方法提供参数,通过参数的数目和类型来决定调用哪个构造方法.如果调用的是父 ...

  2. (转载)内联函数inline和宏定义

    (转载)http://blog.csdn.net/chdhust/article/details/8036233 内联函数inline和宏定义   内联函数的优越性: 一:inline定义的类的内联函 ...

  3. andorid 进度条

    SeekBar类似于ProgressBar,但是ProgressBar的主要功能是让用户知道目前的状态,而SeekBar的功能在于让用户调整进度,举个例子,在音乐播放器中,可以通过调整SeekBar来 ...

  4. PowerShell:Linux程序员喜欢的cmd增强版

    Linux程序员有时偶尔使用Windows下的cmd工具,会被逼疯的,有些命令ls, cat, ps等已经条件反射一样使用. 但在cmd下,根本不知道该用什么命令,好在盖兹大叔照顾了此部分需求.从Vi ...

  5. NOIP2014 生活大爆炸版石头剪刀布

    生活大爆炸版石头剪刀布 (rps.cpp/c/pas) [问题描述] 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.在<生活大爆炸>第二季第8 ...

  6. 家庭局域网接入Internet

     接入Internet  建立宽带连接 步骤一:单击"网络",再属性 步骤二:单击"更改适配器设置" 步骤三:选择"宽带连接" 步骤四:输入 ...

  7. android界面优化笔记(TODO)

    1.避免使用线性布局的层层嵌套,要使用相对而已.使用线性布局越多,嵌套越多 官方文档: Optimizing Your UI

  8. Java字符流读写数据的两种方式

    第一种方式:逐个字符进行读写操作(代码注释以及详细内容空闲补充) package IODemo; import java.io.FileReader; import java.io.FileWrite ...

  9. hdu 1437 天气情况【概率DP】

    天气情况 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  10. [iOS基础控件 - 5.2] 查看大图、缩放图片代码(UIScrollView制作)

    原图: 900 x 1305      拖曳滚动:   缩放:           主要代码: // // ViewController.m // ImageZoom // // Created by ...