Memcached学习

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

Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric为首开发的一款软件。现在已成为mixi、hatena、Facebook、Vox、LiveJournal等众多服务中提高Web应用扩展性的重要因素。

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

Memcached简洁而强大。它的简洁设计便于快速开发,减轻开发难度,解决了大数据量缓存的很多问题。它的API兼容大部分流行的开发语言。

本质上,它是一个简洁的key-value存储系统。

一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。

Memcached学习

1、解压下载的安装包到指定目录。

2、在 1.4.5 版本以前 memcached 可以作为一个服务安装,使用管理员权限运行以下命令

c:\memcached\memcached.exe -d install

3、然后我们可以使用以下命令来启动和关闭 memcached 服务:

c:\memcached\memcached.exe -d start
c:\memcached\memcached.exe -d stop


java中使用memcached:

import java.net.InetSocketAddress;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Future;


import com.google.gson.Gson;
import com.google.gson.GsonBuilder;


import model.Counter;
import model.Weibo;
import net.spy.memcached.MemcachedClient;


/**
 * 
 */
public class MemcachedUtils {

private   static MemcachedClient mcc = null;
private static Gson gson = new GsonBuilder()
// .setDateFormat("yyyy-MM-dd HH:mm:ss")  
  .create();  
//
public static void Connect() {
try{
         // 连接本地的 Memcached 服务
         mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));
         System.out.println("Connection to server sucessful.");
      
         // 存储数据
         Future fo = mcc.set("runoob", 900, "Free Education");
      
         // 查看存储状态
         System.out.println("set status:" + fo.get());
         
         // 输出值
         System.out.println("runoob value in cache - " + mcc.get("runoob"));
      }catch(Exception ex){
         System.out.println( ex.getMessage() );
      }
   }

public static void  close() {
if(mcc != null) {
  // 关闭连接
mcc.shutdown();
}
}


     
    public static void setTop100(String key, List<Counter> list) {
        String str = gson.toJson(list);
        mcc.set(key,0,str);
//        log.debug("setTop100 :" + str);
    }


    public static List<Counter> getTop100(String key) {
        String str = (String) mcc.get(key);
        if (str == null) {
            return new ArrayList<Counter>();
        }
        List<Counter> ret = new ArrayList<Counter>();
        try {
            ret = gson.fromJson(str, List.class);
        } catch (Exception e) {
//            log.error("json转换错误",e);
            e.printStackTrace();
        }
        return ret;
    }
    
    public static void deleteWeibo(String key) {
    mcc.delete(key);
    }


    public static void setWeibo(String key, Weibo weibo) {
//        String str = gson.toJson(weibo);
        mcc.set(key,0 ,weibo.toStringWithoutNotify());
//        System.out.println(getWeibo(key));
    }


    public static void replaceWeibo(String key, Weibo weibo) {
//        String str = gson.toJson(weibo);
        mcc.replace(key, 0,weibo.toStringWithoutNotify());
    }


    public static Weibo getWeibo(String key) {
        String str = (String) mcc.get(key);
        
        Weibo ret = null;
        try {
            ret =Weibo.Parser(str);
        } catch (Exception e) {
            e.printStackTrace();
//            log.error("json转换错误",e);
        }
        return ret;
    }
}


memcached与redis的比较:

redis不仅仅支持简单的K/V类型的数据,还支持list,set,hash,sort set等数据结构的存储。

redis支持数据的备份,redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候再次加载

在redis中,并不是所有的数据都是一直存储在内存中的。

redis是单线程的。