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的基本使用的更多相关文章

  1. Xmemcached的FAQ和性能调整建议

    转载 http://www.blogjava.net/killme2008/archive/2014/02/13/325564.html 一.XMemcached是什么?经常碰到的一个问题是很多朋友对 ...

  2. xmemcached的使用

    转载 http://www.voidcn.com/blog/u010408365/article/p-4972896.html xmemcached主要特性 高性能 XMemcached同样是基于ja ...

  3. 02.XMemcached的使用

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

  4. XMemcached使用示例--转

    Memcached 是一个高性能的分布式内存对象的key-value缓存系统,用于动态Web应用以减轻数据库负载,现在也有很多人将它作为内存式数据库在使用,memcached通过它的自定义协议与客户端 ...

  5. xmemcached user guide --存档

    XMemcached Introduction XMemcached is a new java memcached client. Maybe you don't know "memcac ...

  6. XMemcached简单使用示例

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

  7. spring aop + xmemcached 配置service层缓存策略

    Memcached 作用与使用 基本介绍 1,对于缓存的存取方式,简言之,就是以键值对的形式将数据保存在内存中.在日常业务中涉及的操作无非就是增删改查.加入缓存机制后,查询的时候,对数据进行缓存,增删 ...

  8. Xmemcached学习笔记

    memcached有三种java客户端 第一种:Com.danga 包下面的memcached,需引入jar(本人用的是memcached-2.5.2.jar 文末附上附件需要的可以下载) 第二种:s ...

  9. 第七章 Xmemcached客户端介绍

    提示:有关于XMemcached在实际开发中的具体使用,查看"Java企业项目开发实践"系列博客的<第八章 企业项目开发--分布式缓存memcached> 注意:本文主 ...

  10. XMemcached使用经历

    XMemcached就是Memcached的java客户端之一,目前项目里用到了.据说它比起其他的java客户端从性能上要好一点,实现方式是NIO的.先看怎么实例化出来一个Memcached客户端吧: ...

随机推荐

  1. 数据结构实验之二叉树一:树的同构 (SDUT 3340)

    题解:把原本结构体的左右子树的类型定义成 int 型,用来存放这个结点的左右子树的编号,分别建造两棵二叉树,按个比较,如果在第二棵树中没有找到,那么就不用在判断了. #include <bits ...

  2. IDEA构建支持cdh版本和scala的maven项目注意事项

    工具和环境 idea2018.1 , scala2.11.8, scala的idea支持包,下载地址 maven3.3.9 win10系统 1.maven环境配置 下载解压maven包,(也可以使用i ...

  3. P4163 [SCOI2007]排列——next_permutation

    P4163 [SCOI2007]排列 注意要排序: next_permutation prev_permutation #include<cstdio> #include<cstri ...

  4. [luogu P1527]矩阵乘法(矩形k小)

    传送门 Description 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. Solution 整体二分 练习一波... 就是一堆询问放在一起二分 另外的,第一次发现原来矩 ...

  5. P3180 [HAOI2016]地图

    P3180 [HAOI2016]地图 显然,这是一个仙人掌图 inline void tarjan(LL u,LL fa){ low[u]=dfn[u]=++tot, pre[tot]=u; for( ...

  6. 解决vim升级后导致的高亮行行好有下划线问题,

    在自己的guodersert.vim中添加下面一行即可 hi CursorLineNr term=bold cterm=NONE ctermfg=darkgreen gui=bold guifg=Ye ...

  7. ubuntu dnsmasq

    /var/run/NetworkManager/resolv.conf 而你真实的dns服务器地址,是被这个服务管理维护着的/ local process -> local dnsmasq -& ...

  8. Hibernate 基本使用

    Hibernate框架概述 一.什么是框架 软件的一个半成品,已经帮你完成了部分功能. 把一些不确定的东西,按照框架要求,达到相应的功能 Hibernate是JavaEE技术三层架构所用到的技术 二. ...

  9. legend3---阿里云服务器配置多个网站项目

    legend3---阿里云服务器配置多个网站项目 一.总结 一句话总结: 就是和本机上面的一样,多个域名可以指向同一个ip,配置apache的时候记得ServerName配置域名,不要直接整ip 二. ...

  10. angular父组件通过@ViewChild 主动获取子组 件的数据和方法

    1.调用子组件给子组件定义一个名称 <app-footer #footerChild></app-footer> 2. 引入 ViewChild import { Compon ...