XMemcached的基本使用
XMemcached是memcached的一个java客户端,基于java nio,支持memcached的所有协议。本文简要介绍XMemcached的基本使用。
一、添加依赖
<dependency>
<groupId>com.googlecode.xmemcached</groupId>
<artifactId>xmemcached</artifactId>
<version>2.4.0</version>
</dependency>
二、创建Java文件
UserModel.java
package com.czhappy.memcached_project.vo;
import java.io.Serializable;
public class UserModel implements Serializable{
private int uuid;
private String userName;
private int age;
public UserModel(){}
public UserModel(int uuid, String userName, int age) {
this.uuid = uuid;
this.userName = userName;
this.age = age;
}
public int getUuid() {
return uuid;
}
public void setUuid(int uuid) {
this.uuid = uuid;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "UserModel{" +
"uuid=" + uuid +
", userName='" + userName + '\'' +
", age=" + age +
'}';
}
}
ConnectonHelper.java
package com.czhappy.memcached_project.utils; import net.rubyeye.xmemcached.MemcachedClient;
import net.rubyeye.xmemcached.MemcachedClientBuilder;
import net.rubyeye.xmemcached.XMemcachedClient;
import net.rubyeye.xmemcached.XMemcachedClientBuilder;
import net.rubyeye.xmemcached.utils.AddrUtil;
import org.junit.Test; import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.Map; public class ConnectonHelper { public static MemcachedClient getClient(){
// 连接配置
MemcachedClientBuilder memcachedClientBuilder =
new XMemcachedClientBuilder(AddrUtil.getAddresses("192.168.84.128:2222"));
// 创建与服务端之间的连接[ip地址,端口号,用户名和密码]
// 获取操作业务对象
MemcachedClient memcachedClient = null;
try {
memcachedClient = memcachedClientBuilder.build();
} catch (IOException e) {
e.printStackTrace();
} return memcachedClient;
} public static void main(String[] args) throws Exception { // 连接配置
// 创建与服务端之间的连接[ip地址,端口号,用户名和密码]
// 获取操作业务对象
MemcachedClient memcachedClient =
new XMemcachedClient("192.168.84.128",2222); // 操作业务
String str = "Hello World!";
boolean isSuccess = memcachedClient.set("k1", 3600, str); String value = memcachedClient.get("k1"); System.out.println("value="+value); // 关闭与服务端连接
memcachedClient.shutdown(); } }
执行Main方法,判断是否连接成功:

三、基本使用
- 定义MemcachedClient
static MemcachedClient client = ConnectonHelper.getClient();
- 定义查询【get/gets】方法
public static void showQuery(String key)throws Exception{
UserModel um = client.get(key);
System.out.println("get方法获取的值="+um);
}
- 定义新增【set,add】方法
public static void showAdd(UserModel um) throws Exception {
client.set("set-user:"+um.getUuid(),3600,um);
client.add("add-user:"+um.getUuid(),3600,um);
}
测试:
UserModel um = new UserModel(1, "李四", 55);
showAdd(um);
showQuery("set-user:1");
showQuery("add-user:1");
查询测试结果:

我们通过命令行添加k1,用来测试update方法:

- 定义修改【replace,append,prepend】方法
public static void showUpdate(UserModel um) throws Exception{
client.replace("set-user:"+um.getUuid(),3600,um);
// Hi! asd chenz
client.prepend("k1","Hi! ");
client.append("k1"," chenz");
}
测试:
UserModel um = new UserModel(1, "王五", 60);
showUpdate(um);
查询测试结果:
showQuery("set-user:1");


- 定义删除【delete】方法
public static void showDelete(String key)throws Exception{
boolean isSuccess = client.delete(key);
System.out.println("delete结果="+isSuccess);
}
测试删除:
showDelete("k1");

- 定义检查更新【cas】方法
public static void showCAS(UserModel um)throws Exception{
String key = "set-user:" + um.getUuid();
// 第一件事先获取版本号
GetsResponse<UserModel> userModelGetsResponse = showGets(key);
long cas = userModelGetsResponse.getCas();
// // 演示cas版本是否生效
// UserModel um1 = new UserModel(1,"happy admin",20);
// showUpdate(um1);
// 进行更新操作
boolean isSuccess = client.cas(key, 3600, um, cas);
System.out.println("更新结果="+isSuccess);
}
测试:
UserModel um = new UserModel(1, "科比", 35);
showCAS(um);

查询结果:
showQuery("set-user:1");

问题:在获取版本号之后及cas数据之前,这一段存在时间差,可能会因为版本号的问题导致操作失败,因此,XMemcached特地封装了xmcas
public static void showXMCAS() throws Exception {
// 操作XMemcached提供的CAS操作
client.cas("k1", new CASOperation<String>() {
// 重试次数
public int getMaxTries() {
return Integer.MAX_VALUE;
}
// 修改内容
public String getNewValue(long cas, String currentValue) {
return "Hi ! "+currentValue + "!!!!!";
}
});
}
- 定义数值操作【incr/decr】方法
public static void showNumChange()throws Exception{
MemcachedClient memcachedClient = ConnectonHelper.getClient();
long result = memcachedClient.incr("k5",5,10);
System.out.println("result1 = "+result);
result = memcachedClient.incr("k5",40,10);
System.out.println("result2 = "+result);
result = memcachedClient.decr("k5",25,10);
System.out.println("result3 = "+result);
result = memcachedClient.decr("k5",30,10);
System.out.println("result4 = "+result);
}
测试结果:

针对上述结果,给出以下解释说明:
/*
long result = memcachedClient.incr("k5",5,10);
result1 = 10 -> API【如果key不存在,则第三个参数为初始值】 result = memcachedClient.incr("k5",40,10);
result2 = 50 -> 如果key存在,则进行递增或递减操作 result = memcachedClient.decr("k5",25,10);
result3 = 25 -> 如果key存在,则进行递增或递减操作 result = memcachedClient.decr("k5",30,10);
result4 = 0 -> decr是不能减出负数
*/
- 获取所有的key列表
public static void showKeyIterator() throws Exception{
KeyIterator keyIterator = client.getKeyIterator(AddrUtil.getOneAddress("192.168.84.128:2222"));
while(keyIterator.hasNext()){
System.out.println("keys="+keyIterator.next());
}
}

- XMemcached提供的计数器
public static void showCounter() throws Exception {
Counter counter = new Counter(client,"k5",10);
long c1 = counter.incrementAndGet();
System.out.println("c1="+c1);
long c2 = counter.decrementAndGet();
System.out.println("c2="+c2);
long c3 = counter.addAndGet(88);
System.out.println("c3="+c3);
long c4 = counter.addAndGet(-10000);
System.out.println("c4="+c4);
counter.set(50);
long c5 = counter.get();
System.out.println("c5="+c5);
String key = counter.getKey();
System.out.println("key="+key);
}
测试结果:

- 更新数据过期时间
一般采用:
/*
1、先存入一条数据 【设置过过期时间 10个小时】
2、先获取待更新过期时间的数据
3、再通过 replace | set 方法,将数据修改回去,同时设置过期时间
*/
通过XMemcached,我们这样做:
/*
1、先存入一条数据 【设置过过期时间 10个小时】
2、直接使用touch进行更新过期时间
*/
public static void showTouch() throws Exception {
client.set("k1",3600,"Hello happy");
client.touch("k1",10);
}
- 演示命名空间
因为memcached中没有数据表的概念,XMemcached引入了命名空间的概念,可以对数据进行分块存储,而实际底层操作则是变相的修改key的名称来实现的。
public static void showNameSpace() throws Exception {
String ns1 = "ns1";
String ns2 = "ns2";
// 赋值操作
client.withNamespace(ns1, new MemcachedClientCallable<String>() {
public String call(MemcachedClient memcachedClient) throws MemcachedException, InterruptedException, TimeoutException {
memcachedClient.set("k10",0," Hello chenz!! ");
return null;
}
});
String str = client.get("k10");
System.out.println("str="+str);
String k10 = client.withNamespace(ns1, new MemcachedClientCallable<String>() {
public String call(MemcachedClient memcachedClient) throws MemcachedException, InterruptedException, TimeoutException {
return memcachedClient.get("k10");
}
});
System.out.println("k10="+k10);
String k102 = client.withNamespace(ns2, new MemcachedClientCallable<String>() {
public String call(MemcachedClient memcachedClient) throws MemcachedException, InterruptedException, TimeoutException {
return memcachedClient.get("k10");
}
});
System.out.println("k102="+k102);
}
测试结果:

我们通过查询以下memcached中的所有key

可以看到前面三个是系统为我们创建并和namespace相关的,我们查询一下namespace:ns1的value值,即可看出其中端倪:

XMemcached的基本使用的更多相关文章
- Xmemcached的FAQ和性能调整建议
转载 http://www.blogjava.net/killme2008/archive/2014/02/13/325564.html 一.XMemcached是什么?经常碰到的一个问题是很多朋友对 ...
- xmemcached的使用
转载 http://www.voidcn.com/blog/u010408365/article/p-4972896.html xmemcached主要特性 高性能 XMemcached同样是基于ja ...
- 02.XMemcached的使用
关于XMemcached的介绍或文档请参考:https://code.google.com/p/xmemcached/wiki/User_Guide_zh 关于Memcached的命令 ...
- XMemcached使用示例--转
Memcached 是一个高性能的分布式内存对象的key-value缓存系统,用于动态Web应用以减轻数据库负载,现在也有很多人将它作为内存式数据库在使用,memcached通过它的自定义协议与客户端 ...
- xmemcached user guide --存档
XMemcached Introduction XMemcached is a new java memcached client. Maybe you don't know "memcac ...
- XMemcached简单使用示例
Memcached的Java客户端目前有三个: Memcached Client for Java 比 SpyMemcached更稳定.更早.更广泛: SpyMemcached 比 Memcached ...
- spring aop + xmemcached 配置service层缓存策略
Memcached 作用与使用 基本介绍 1,对于缓存的存取方式,简言之,就是以键值对的形式将数据保存在内存中.在日常业务中涉及的操作无非就是增删改查.加入缓存机制后,查询的时候,对数据进行缓存,增删 ...
- Xmemcached学习笔记
memcached有三种java客户端 第一种:Com.danga 包下面的memcached,需引入jar(本人用的是memcached-2.5.2.jar 文末附上附件需要的可以下载) 第二种:s ...
- 第七章 Xmemcached客户端介绍
提示:有关于XMemcached在实际开发中的具体使用,查看"Java企业项目开发实践"系列博客的<第八章 企业项目开发--分布式缓存memcached> 注意:本文主 ...
- XMemcached使用经历
XMemcached就是Memcached的java客户端之一,目前项目里用到了.据说它比起其他的java客户端从性能上要好一点,实现方式是NIO的.先看怎么实例化出来一个Memcached客户端吧: ...
随机推荐
- 报警提示 System.NullReferenceException:“未将对象引用设置到对象的实例。
System.NullReferenceException:“未将对象引用设置到对象的实例.是就因为Session在记录到服务器时,没有添加 IRequiresSessionState 所以运行时回 ...
- 模拟I2C协议学习点滴之复习三极管、场效应管
晶体三极管分为NPN和PNP型两种结构形式,除了电源极性的不同工作原理是大致相同的.对于NPN管,它是由2块N型半导体夹着一块P型半导体所组成的,发射区与基区之间形成的PN结称为发射结,而集电区与基区 ...
- Comet OJ - Contest #7
传送门 \(A\) 咕咕咕 int main(){ for(scanf("%d",&T);T;--T){ scanf("%d%d",&l,&am ...
- 简述*args and **kwargs
为了能让一个函数接受任意数量的位置参数:* 为了接受任意数量的关键字参数:** *参数只能出现在函数定义中最后一个位置参数后面,而**参数只能出现在最后一个参数 解决的问题:构造一个可接受任意数量参数 ...
- OpenJudge 1.5.27:级数求和
描述 已知:Sn= 1+1/2+1/3+…+1/n.显然对于任意一个整数K,当n足够大的时候,Sn大于K. 现给出一个整数K(1<=k<=15),要求计算出一个最小的n:使得Sn>K ...
- 为什么HashMap桶(链表)的长度超过8才会转换成红黑树
百度了一下,感觉能说清楚的并不多,所以在此记录一下. 首先说一说转换为红黑树的必要性:红黑树的插入.删除和遍历的最坏时间复杂度都是log(n),因此,意外的情况或者恶意使用下导致hashCode()方 ...
- /dev/mem同步写不能使用msync的MS_SYNC选项探究
问题 做了个测试板子的程序,里面有一项写铁电的功能,要求写入之后立即断电,重启后校验数据准确性:铁电设计是通过内存地址直接映射的,于是,使用mmap直接映射了/dev/mem文件,自然地写入之后使用m ...
- 2018-2019-2 20165234 《网络对抗技术》 Exp9 Web安全基础
Exp9 Web安全基础 一. 实践内容 1. 安装JDK.Webgoat 2. SQL注入攻击 数字型注入(Numeric SQL Injection) 日志欺骗(Log Spoofing) 字符串 ...
- Navicat Premium 12安装与激活(亲测已成功激活)
说明:博主所提供的激活文件理论支持Navicat Premium 12.0.16 - 12.0.24简体中文64位,但已测试的版本为Navicat Premium 12.0.22.12.0.23和12 ...
- BaggingClassifier
写在前面 Ensemble methods 组合模型的方式大致为四个:/bagging / boosting / voting / stacking ,此文主要简单叙述 bagging算法. 算法 ...