初识Memcache---(2)使用memcache

Memcache服务端已经安装好,此时我们可以在程序中进行缓存操作了,这时我们需要Memcache客户端进行操作。市场上Memcache客户端有很多种,这里我们对两种使用比较广泛的客户端进行介绍。

我们常使用客户的方法为以下几种:

public interface IMemCacheClient {
public Object get(String key);//从缓存获取一个指定的值,获取的值需要进行强制转换
public boolean set(String key,Object value);//添加一个指定的值到缓存,如果key存在则替换它
public boolean set(String key,Object value,int expiry);//添加一个指定的值到缓存,并且指定value的生命周期,如果key存在则替换它
public boolean add(String key,Object value);//添加一个指定的值到缓存,如果key存在返回false
public boolean add(String key,Object value,int expiry);//添加一个指定的值到缓存,并且指定value的生命周期,如果key存在返回false
public boolean replace(String key,Object value);//替换一个值到缓存,失败false
public boolean replace(String key,Object value,int expiry);//替换一个值到缓存,失败false,并指定生命周期
public boolean del(String key);//删除指定的值
public boolean flushAll();//删除指定的值,置为失效
}

主要的区别是客户端初始化方法,这两种客户端初始化方法代码如下:
1、Memcached-Java-Client

// 创建全局的唯一实例
   private MemcachedClient client = new MemcachedClient();
   // 设置与缓存服务器的连接池
    static{
        // 服务器列表和其权重
           String[] servers = { "192.168.56.102:11211" };

        // 获取soket 连接池的实例对象
           SockIOPool pool = SockIOPool.getInstance();

           // 设置服务器信息
           pool.setServers(servers);
           pool.setFailover(true);

         //设置初始连接数、最小和最大连接数以及最大处理时间
           pool.setInitConn(10);
           pool.setMinConn(5);
           pool.setMaxConn(250);

        // 设置主线程的睡眠时间
           pool.setMaintSleep(30);

           // 设置TCP的参数和连接超时
           pool.setNagle(false);
           pool.setSocketTO(3000);
           pool.setAliveCheck(true);

        // 初始化连接池
           pool.initialize();
    }

2、XmemcacheClient

private static XmemcacheClient instance = new XmemcacheClient();

    /** XMemCache允许开发者通过设置节点权重来调节MemCache的负载,设置的权重越高,该MemCache节点存储的数据越多,负载越大 */
    private static MemcachedClientBuilder mcb = 
            new XMemcachedClientBuilder(AddrUtil.getAddresses("192.168.56.102:11211"), new int[]{1});
    private static MemcachedClient mc = null;

    /** 初始化加载客户端MemCache信息 */
    static
    {
        mcb.setCommandFactory(new BinaryCommandFactory()); // 使用二进制文件
        mcb.setConnectionPoolSize(10); // 连接池个数,即客户端个数
        try
        {
            mc = mcb.build();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }

    }

3、完整示例(Memcached-Java-Client)
MemcacheClient1.java

/**
 * 
 */
package com.css.sword.cache;

import java.util.Calendar;
import java.util.Date;

import com.meetup.memcached.MemcachedClient;
import com.meetup.memcached.SockIOPool;

/**
 * <p>Title:MemcacheClient1</p>
 * <p>Description: 使用memcache_client.jar(Memcached-Java-Client-master) com.meetup.memcached</p> 
 * @author yuanxj
 * @date 2017-2-27
 */
public class MemcacheClient1 implements IMemCacheClient{
     // 创建全局的唯一实例
   private MemcachedClient client = new MemcachedClient();
      private static MemcacheClient1 client1 = new MemcacheClient1();

   // 设置与缓存服务器的连接池
    static{
        // 服务器列表和其权重
           String[] servers = { "192.168.56.102:11211" };

        // 获取soket 连接池的实例对象
           SockIOPool pool = SockIOPool.getInstance();

           // 设置服务器信息
           pool.setServers(servers);
           pool.setFailover(true);

         //设置初始连接数、最小和最大连接数以及最大处理时间
           pool.setInitConn(10);
           pool.setMinConn(5);
           pool.setMaxConn(250);

        // 设置主线程的睡眠时间
           pool.setMaintSleep(30);

           // 设置TCP的参数和连接超时
           pool.setNagle(false);
           pool.setSocketTO(3000);
           pool.setAliveCheck(true);

        // 初始化连接池
           pool.initialize();
    }
    private MemcacheClient1 (){}    

    public static MemcacheClient1 getInstance() {  
        return client1;  
        }    

    @Override
    public Object get(String key) {
        // TODO Auto-generated method stub      
        return client.get(key);
    }

    @Override
    public boolean set(String key, Object value) {
        // TODO Auto-generated method stub
        //client.setSanitizeKeys(false);
        return client.set(key, value);
    }

    @Override
    public boolean set(String key, Object value, int expiry) {
        // TODO Auto-generated method stub
        Calendar nowTime = Calendar.getInstance();
        nowTime.add(Calendar.SECOND, expiry);
        return client.set(key, value,nowTime.getTime());
    }

    @Override
    public boolean add(String key, Object value) {
        // TODO Auto-generated method stub
        return client.add(key, value);
    }

    @Override
    public boolean add(String key, Object value, int expiry) {
        // TODO Auto-generated method stub
        Calendar nowTime = Calendar.getInstance();
        nowTime.add(Calendar.SECOND, expiry);
        return client.add(key, value,expiry);
    }

    @Override
    public boolean replace(String key, Object value) {
        // TODO Auto-generated method stub
        return client.replace(key, value);
    }

    @Override
    public boolean replace(String key, Object value, int expiry) {
        // TODO Auto-generated method stub
        Calendar nowTime = Calendar.getInstance();
        nowTime.add(Calendar.SECOND, expiry);
        return client.replace(key, value,expiry);
    }

    @Override
    public boolean del(String key) {
        // TODO Auto-generated method stub
        return client.delete(key);
    }


    @Override
    public boolean flushAll() {
        // TODO Auto-generated method stub
        return client.flushAll();
    }
}

测试:

public static void main(String[] args){
        try {  
            MemcacheClient1 client1 = new MemcacheClient1();
            client1.set("name", "liuhuao"); 
            String myObject = (String) client1.get("name");  
            System.out.println(myObject);
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }

这只是个简单的示例,XmemcacheClient和这个类似,需要注意的有两点:
(1)Memcached-Java-Client客户端的生命周期 expiry是Date类型,而XmemcacheClient是int类型,所以需要转换下;
(2)关于key值,例如key值为+iBGV1cMhD+sQmK1rxUMtQ==
Memcached-Java-Client 会将key值设为%2BiBGV1cMhD%2BsQmK1rxUMtQ%3D%3D
而XmemcacheClient是原值,查看Memcached-Java-Client源码发现该客户端会对key进行编码URLEncoder.encode,如果不行进行编码,可用client.setSanitizeKeys(false)解决。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值