java操作Memcached

java操作Memcached

Memcached是一个自由开源的,高性能,分布式内存对象缓存系统。

Memcached是一种基于内存的key-value存储,用来存储小块的任意数据(字符串、对象)。这些数据可以是数据库调用、API调用或者是页面渲染的结果。

需要的jar包
spymemcached-2.10.3.jar

下面我们假设已经安装好Memcached,地址为127.0.0.1,端口号为:12345

1、如何连接Memcached
2、set Memcached缓存
3、add Memcached缓存
4、mccreplace 更新Memcached缓存
5、删除 Memcached缓存
6、CAS 解决并发处理相同key的问题

  • -

如何连接Memcached

import net.spy.memcached.MemcachedClient;
import java.net.*;
public static void main(String[] args) {
      try{
         //连接 Memcached 服务
         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 12345));
         System.out.println("Memcached连接成功");
         // 关闭连接
         mcc.shutdown();

      }catch(Exception ex){
         System.out.println("发生异常:"+ex.getMessage());
      }
   }

- set Memcached缓存

我们这里用java的 java.util.concurrent.Future类来实现操作Memcached

import java.net.InetSocketAddress;
import java.util.concurrent.Future;
import net.spy.memcached.MemcachedClient;
public class MemcachedJava {
   public static void main(String[] args) {

      try{
         // 连接本地的 Memcached 服务
         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 12345));
         System.out.println("连接成功");

         //添加Memcached缓存
         /**
         *这里注意:mcc.set(key,exp,value)
         *key代表你存入的唯一标识值
         *exp代表当前数据存储有效时间:0 零即代表永不过期、过期时间最长为30天= 30*24*60*60 = 2592000
         */
         Future fo = mcc.set("zhangsan", 1000, "今天要加班");
         // 获取添加结果 true表示成功,false表示失败
         System.out.println("添加结果:" + fo.get());

         // 输出值 这里会输出:今天要加班
         System.out.println("获取添加的缓存数据:" + mcc.get("zhangsan"));
        /**
         * 定义一个p对象,Persion类必须实现Serializable接口
         */
        Persion p = new Persion();
        p.setId("1");
        p.setName("王麻子");
        /**
         * 缓存一个p对象
         */
        mcc.set("p1", p);

        /**
         * 获取缓存的p对象
         */
        Persion p1 = (Persion) mcc.get("p1");
        //输出 王麻子
        System.out.println(p1.getName());
         // 关闭连接
         mcc.shutdown();

      }catch(Exception ex){
         System.out.println( ex.getMessage() );
      }
   }
}

- add Memcached缓存

import java.net.InetSocketAddress;
import java.util.concurrent.Future;
import net.spy.memcached.MemcachedClient;
public class MemcachedJava {
   public static void main(String[] args) {

      try{
         // 连接本地的 Memcached 服务
         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 12345));
         System.out.println("连接成功");

         //添加Memcached缓存
         /**
         *这里注意:mcc.add(key,exp,value)
         *add与set的区别,如果你已经set了一个key为zhangsan的数据,那么你再add一个key为zhangsan的数据,会【添加失败】,而你多次set的话,会替换前面set的zhangsan数据,就是这样。
         */
         Future fo = mcc.add("zhangsan", 2000, "明天你还是要加班");
         // 获取结果 true表示成功,false表示失败
         System.out.println("添加结果:" + fo.get());
         //添加对象一样的效果
         // 输出值
         System.out.println("获取添加的缓存数据:" + mcc.get("zhangsan"));

         // 关闭连接
         mcc.shutdown();

      }catch(Exception ex){
         System.out.println( ex.getMessage() );
      }
   }
}

- mccreplace 更新Memcached缓存

如果你不想set来更新zhangsan数据。你也可以利用mcc.mccreplace方法。

import java.net.InetSocketAddress;
import java.util.concurrent.Future;
import net.spy.memcached.MemcachedClient;
public class MemcachedJava {
   public static void main(String[] args) {

      try{
         // 连接本地的 Memcached 服务
         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 12345));
         System.out.println("连接成功");
         /**
         *这里着重说明下,使用replace方法可以更新数据,缓存中不含有key为zhangsan的数据,【无法更新,并且不会添加】
         */
         Future fo = mcc.mccreplace("zhangsan", 3000, "同学,后天请你继续加班");
         // 获取结果 true表示成功,false表示失败
         System.out.println("添加结果:" + fo.get());

         // 关闭连接
         mcc.shutdown();

      }catch(Exception ex){
         System.out.println( ex.getMessage() );
      }
   }
}

- 删除 Memcached缓存

import java.net.InetSocketAddress;
import java.util.concurrent.Future;
import net.spy.memcached.MemcachedClient;
public class MemcachedJava {
   public static void main(String[] args) {

      try{
         // 连接本地的 Memcached 服务
         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 12345));
         System.out.println("连接成功");
         /**
         *删除数据
         */
         Future fo = mcc.delete("zhangsan");
         // 获取结果 true表示成功,false表示失败
         System.out.println("添加结果:" + fo.get());
         //这时候会返回null
         System.out.println("删除后获取zhangsan数据:" + fo.get("zhangsan"));
         // 关闭连接
         mcc.shutdown();

      }catch(Exception ex){
         System.out.println( ex.getMessage() );
      }
   }
}

cas解决并发处理相同key的问题

cas方法是一个非常实用的方法,他可以解决并发处理的问题,举个例子:
并发情况下:
//请求1:set(“zhangsan”,1000,”数据一”)
//请求2:set(“zhangsan”,1000,”数据二”)
//请求3:set(“zhangsan”,1000,”数据三”)
//请求4:set(“zhangsan”,1000,”数据四”)
//请求5:set(“zhangsan”,1000,”数据五”)
/**那么最后zhangsan会被修改成:数据五,
*但是请求1再去get zhangsan的时候获取的数据是‘数据五’而不是希望获取到
*的‘数据一’,请求2/3/4都是同理的结果。那么如果解决呢。那就要用到
*cas方法了。
*/

cas原理:

当有线程试图修改当前key-value对的value时,先由gets方法得到item(也就是当前key数据)的版本号,操作完成提交数据时,使用cas方法对应版本号变更,如果在对item操作过程中这个key-value对被其它线程更改过,就放弃此次修改(乐观锁概念)。
语法
//先获取版本号
mcc.gets(“修改的key”)
//通过版本号修改数据
mcc.cas(“修改的key”,”版本号”,’修改的值’);

MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 12345));
         System.out.println("连接成功");
String keyStr = "zhangsan";
String valueStr = "根据版本号修改";
//获取需要修改的key的当前版本号
CASValue keyVersionNumber = mcc.gets(key);
//根据版本号修改,
CASResponse response = mcc.cas(keyStr, keyVersionNumber.getCas(), valueStr);
if(response.toString().equals("OK")){
//输出:根据版本号修改
 System.out.println("解决并发后的结果:\t" + response.getValue());
  System.out.println("成功");
}else{
    System.out.println("失败");
}

以上就是java操作Memcached常用的方法,另外还有其他方法,这里就不一一叙述。其他方法请看官方文档,这里主要是让大家了解常用方法,让大家有个基础,至于深入学习,作为一个程序员最好还是养成自我学习的能力.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值