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客户端吧: ...
随机推荐
- Linux下安装mysql(离线安装和在线安装)
一:在线安装mysql 1.首先检测一下,mysql之前有没有被安装 命令:rpm -qa | grep mysql 2.删除mysql的命令: rpm -e --nodeps `rpm -qa | ...
- IDEA2018创建SpringBoot无法连接https://start.spring.io
这是由于spring-boot需要访问https://start.spring.io外网,但是由于国内的局域网限制导致的. 解决办法: 进入到IDEA的setting 搜索 HTTP Proxy 选择 ...
- AcWing P378 骑士放置 题解
Analysis 这道题跟前几道题差不多,依旧是匈牙利算法求二分图匹配,在连边的时候,要连两个矛盾的位置(即一个骑士和其控制的位置).然后就跑一遍匈牙利算法就好了. #include<iostr ...
- Greenplum 调优--VACUUM系统表
Greenplum 调优--VACUUM系统表 1.VACUUM系统表原因 Greenplum是基于MVCC版本控制的,所有的delete并没有删除数据,而是将这一行数据标记为删除, 而且update ...
- kubernetes 部署metricserver
本篇适用于kubeadm部署的k8s的集群 安装环境:首先要部署好k8s的集群,版本是1.11.1,我的虚拟机部署的,一个master节点,一个node节点.笔记本性能有限 下载metrics-ser ...
- Springboot项目使用junit-test(@Test)报错原因汇总
1.不要随便改测试包名,我就是因为这个错的!!! 2.有的是pom.xml文件中引入了junit测试的两个jar包 3.其他问题百度就行
- leetcode解题报告(16):Move Zeroes
描述 Given an array nums, write a function to move all 0's to the end of it while maintaining the rela ...
- 爬虫(三):Requests库的基本使用
一:什么是Requests Requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库如果你看过上篇文章关于urllib库的使用,你会发现 ...
- Python中的各种排序问题
小书匠python排序 本章目录,快速浏览所需内容: 基本的排序 1.列表(list) 1.1按列表元素大小排序 1.2按列表元素的属性 2.字典(dictory) 3.元组(tuple)排序 3.1 ...
- 有没有一个工具可以帮助查找python的bug和进行静态的代码分析?
答:PyChecker是一个python代码的静态分析工具,它可以帮助查找python代码的bug, 会对代码的复杂度和格式提出警告 Pylint是另外一个工具可以进行codingstandard检查