spymemcache java的demo

最新学了spymemcache,发现网上关于memcache的学习资料不是很多,很多资料都是php的demo,没有找到java的demo,于是想自己写一个。

代码需要spymemcached和junit的jar包,需要安装memcache,以下附源码。

import net.spy.memcached.CASResponse;
import net.spy.memcached.CASValue;
import net.spy.memcached.MemcachedClient;
import net.spy.memcached.internal.GetFuture;
import net.spy.memcached.internal.OperationFuture;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class Main {
    MemcachedClient client=null;
    @Before
    public void before(){
        try {
            client = new MemcachedClient(new InetSocketAddress("localhost",11211));
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    }
    @After
    public void after(){
        client.shutdown();
    }

    @Test
    public void get(){
        try{
            client.add("name", 60, "小明");
            System.out.println(client.get("name"));
        }catch(Exception e){
           e.printStackTrace();
        }
    }

    @Test
    public void getUserList(){
        try{
            //实体类需要序列化
            User user1=new User();
            user1.setId(1L);
            user1.setName("张三");
            user1.setAge(10);
            User user2=new User();
            user2.setId(2L);
            user2.setName("李四");
            user2.setAge(12);
            List<User> list=new ArrayList<User>();
            list.add(user1);
            list.add(user2);
            client.add("userList",60,list);
            List<User> returnUserList=(List<User>)client.get("userList");
            if(returnUserList!=null&&returnUserList.size()>0){
                for(User user:returnUserList){
                    System.out.println(user.toString());
                }
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }


    @Test
    public void asyncGet(){
        client.set("name", 60, "小明");
        //异步获取
        GetFuture<Object> f=client.asyncGet("name");
        try {
            //f.get的参数是指获取数据的时间上限,如果超出该时间,则会抛出异常。
            System.out.println(f.get(5, TimeUnit.SECONDS));
        } catch (InterruptedException e) {
            //没有catch到异常,则可以取消这次请求。
            f.cancel(true);
            System.out.println(e.getMessage());
        } catch (TimeoutException e) {
            f.cancel(true);
            System.out.println(e.getMessage());
        } catch (ExecutionException e) {
            f.cancel(true);
            System.out.println(e.getMessage());
        }catch(Exception e){
            System.out.println(e.getMessage());
        }
    }

    @Test
    public void cas(){
        try{
            client.set("title",60,"hello");
            retry("title"," world",2);
        }catch(Exception e){
            e.printStackTrace();
        }

    }

    public void retry(String key,String value,int type){
        CASValue<Object> casValue=client.gets(key);
        System.out.println(casValue.getCas()+"----"+casValue.getValue());
        CASResponse casResponse=null;
        if(type==1){
            //覆蓋值
        }else if(type==2){
            //追加值
            casResponse=client.cas("title",casValue.getCas(),casValue.getValue()+value);
        }
        if(casResponse.toString().equals("OK")){
            CASValue<Object> casValue2=client.gets("title");
            System.out.println(casValue2.getCas()+"---"+casValue2.getValue());
        }else{
           retry(key,value,type);
        }
    }

    @Test
    public void append(){
        try{
            client.set("content",60,"hello");
            CASValue<Object> casValue=client.gets("content");
            OperationFuture<Boolean> operationFuture=client.append(casValue.getCas(),"content"," world");
            System.out.println(operationFuture.get()+"---"+operationFuture.getKey()+"---"+operationFuture.getStatus().isSuccess()+"---"+operationFuture.isDone());
            if(!operationFuture.get().equals(true)){
                append();
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    @Test
    public void asyncCAS(){
        try{
            client.set("asynccas",60,"hello");
            CASValue<Object> casValue=client.gets("asynccas");
            System.out.println(casValue.getCas()+"---"+casValue.getValue());
            Future<CASResponse> future= client.asyncCAS("asynccas",casValue.getCas(),"hi");
            CASResponse casResponse=future.get();
            System.out.println(casResponse.toString());
            if(!casResponse.toString().equals("OK")){
                asyncCAS();
            }else{
                casValue=client.gets("asynccas");
                System.out.println(casValue.getCas()+"---"+casValue.getValue());
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    @Test
    public void decr(){
        try{
            //注意值需为String类型,如何为int类型会将其转化为字符串,不能调用incr decr方法。
            client.set("age",60,"30");
            CASValue<Object> casValue=client.gets("age");
            System.out.println(casValue.getCas()+"--"+casValue.getValue());
            //值必須大於等於0,否則會報invalid numeric delta argument
            //client.decr("age",-5);
            client.decr("age",5);
            casValue=client.gets("age");
            System.out.println(casValue.getCas()+"--"+casValue.getValue());
            //第三個為def,如果decr操作失敗,則將def的值加到value上。
            client.decr("age",3,4L);
            casValue=client.gets("age");
            System.out.println(casValue.getCas()+"--"+casValue.getValue());
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    @Test
    public void asyncDecr(){
        try{
            client.set("age",60,"30");
            OperationFuture<Long> operationFuture=client.asyncDecr("age",5);
            System.out.println(operationFuture.get()+"---"+operationFuture.getKey()+"---"+operationFuture.getStatus().isSuccess()+"---"+operationFuture.isDone());
            if(!operationFuture.getStatus().isSuccess()){
                asyncDecr();
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    @Test
    public void incr(){
        try{
            //注意值需为String类型,如何为int类型会将其转化为字符串,不能调用incr decr方法。
            client.set("age",60,"30");
            CASValue<Object> casValue=client.gets("age");
            System.out.println(casValue.getCas()+"--"+casValue.getValue());
            //值必須大於等於0,否則會報invalid numeric delta argument
            //client.incr("age",-5);
            client.incr("age",5);
            casValue=client.gets("age");
            System.out.println(casValue.getCas()+"--"+casValue.getValue());
            //第三個為def,如果incr操作失敗,則將def的值加到value上。
            client.incr("age",3,4L);
            casValue=client.gets("age");
            System.out.println(casValue.getCas()+"--"+casValue.getValue());
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    @Test
    public void asyncIncr(){
        try{
            client.set("age",60,"30");
            OperationFuture<Long> operationFuture=client.asyncIncr("age",5);
            System.out.println(operationFuture.get()+"---"+operationFuture.getKey()+"---"+operationFuture.getStatus().isSuccess()+"---"+operationFuture.isDone());
            if(!operationFuture.getStatus().isSuccess()){
                asyncIncr();
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    @Test
    public void prepend(){
        try{
            client.set("prepend",60," world");
            CASValue<Object> casValue=client.gets("prepend");
            OperationFuture<Boolean> operationFuture=client.prepend(casValue.getCas(),"prepend","hello");
            casValue=client.gets("prepend");
            System.out.println(casValue.getValue());
            if (!operationFuture.get().equals(true)) {
                prepend();
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    @Test
    public void flush(){
        try{
            client.set("flush",60,"hello");
            //清除服務器所有緩存
            client.flush();
            //在10秒后清除服務器所有緩存
//            client.flush(10);
            CASValue<Object> casValue=client.gets("flush");
            System.out.println(casValue==null);
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    @Test
    public void getBulk(){
        try{
            client.set("bulk1",60,"111");
            client.set("bulk2",60,"222");
            client.set("bulk3",60,"333");
            List<String> keyList=new ArrayList<String>();
            keyList.add("bulk1");
            keyList.add("bulk2");
            keyList.add("bulk3");
            Map<String,Object> map=client.getBulk(keyList);
            if(map!=null){
                Set<String> keySet=map.keySet();
                for(String key:keySet){
                    System.out.println(key+"---"+map.get(key));
                }
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值