Memcached学习
Memcached是一个自由开源的,高性能,分布式内存对象缓存系统。
Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric为首开发的一款软件。现在已成为mixi、hatena、Facebook、Vox、LiveJournal等众多服务中提高Web应用扩展性的重要因素。
Memcached是一种基于内存的key-value存储,用来存储小块的任意数据(字符串、对象)。这些数据可以是数据库调用、API调用或者是页面渲染的结果。
Memcached简洁而强大。它的简洁设计便于快速开发,减轻开发难度,解决了大数据量缓存的很多问题。它的API兼容大部分流行的开发语言。
本质上,它是一个简洁的key-value存储系统。
一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。
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是单线程的。