Memcached这个产品还是很不错的,原来一直在linux下运行,LINUX的服务的设计思想,在性能上也是很不多,很多大型的网站都有用到它,而且现在有些数据库都会和它整合。
我在做聚聚呀时,社区的FEED性能不高,对数据的运算要求比较多,CPU有时比较高,于是我就采用了Memcached来得提升下它的性能。
我使用的环境是
windows 2008 server 32位系统
使用的版本是memcached-1.2.6-win32-bin,这个大家可以去他的官方网站上下载下载地址:http://code.jellycan.com/memcached/。
我先把我的使用步骤记下来
1,安装Memcached
为了方便使用,我直接把Memcached安装成WINDOWS SERVICE
D:\MemCache>sc create memcached binPath= "e:\app\memcached-1.2.6-win32-bin\memcached.exe -p 9999 -l 192.168.1.10 -d runservice" DisplayName= "memcached_server" start= auto
memcached的基本设置:
-p 监听的端口
-l 连接的IP地址, 默认是本机
-d start 启动memcached服务
-d restart 重起memcached服务
-d stop|shutdown 关闭正在运行的memcached服务
-d install 安装memcached服务
-d uninstall 卸载memcached服务
-u 以的身份运行 (仅在以root运行的时候有效)
-m 最大内存使用,单位MB。默认64MB
-M 内存耗尽时返回错误,而不是删除项
-c 最大同时连接数,默认是1024
-f 块大小增长因子,默认是1.25
-n 最小分配空间,key+value+flags默认是48
-h 显示帮助
执行完这个命令后,我们在192.168.1.10 这个机器上可以看到多了一个windows 服务,它是memcached_server,它运行起来了就可以工作了,接下来是使用客户端来完成与它的交互,它是基于socket的网络应用,所以要注意它的端口,上面我们设置的端口是-p 9999,9999就是它的端口了
.NET有一个memcache的客户端,我这里介绍一个用的比较好的客户端包是BeITMemcached_source_2009_02_27,大家可以下载来直接引用它里面的DLL 到工程项目中来
好了我们现在开始试下,新建一个WEB APP,然后需要引用MMC客户端包BeITMemcached
修改配置WEB.CONFIG
<add key="CacheServer" value="192.168.1.10:9999"/><!--mmc server的服务器地址和端口-->
<add key="CacheMaxPoolSize" value="5"/>
<add key="TimeOut" value="5000"/>
我这里是我自己封装了一个类库用于访问Memcache server
测试代码如下
protected void Page_Load(object sender, EventArgs e)
{
List<string> lst = new List<string>();
for (int i = 0; i <= 50000; i++)
{
lst.Add("fdfasfdsfasfasfdsafa"+i.ToString());
}
SNET.Common.MemCached.SNETMemCachedClient.Set("mylst", lst);
List<string> flsg = SNET.Common.MemCached.SNETMemCachedClient.Get("mylst") as List<string>;
foreach (string strs in flsg)
{
Response.Write(strs + "<br>");
}
SNET.Common.MemCached.SNETMemCachedClient.Set("mystring", "The quick brown fox jumped over the lazy dog.");
SNET.Common.MemCached.SNETMemCachedClient.Set("myarray", new string[] { "This is the first string.", "This is the second string." });
SNET.Common.MemCached.SNETMemCachedClient.Set("myinteger", 4711);
SNET.Common.MemCached.SNETMemCachedClient.Set("mydate", new DateTime(2008, 02, 23));
//Use custom hash
SNET.Common.MemCached.SNETMemCachedClient.Set("secondstring", "Flygande 测试啊~~~~....$$%%^^^$$#$$$", 4711);
//Get a string
string str = SNET.Common.MemCached.SNETMemCachedClient.Get("1_mystring") as string;
str = SNET.Common.MemCached.SNETMemCachedClient.Get("mystring") as string;
if (str != null)
{
Response.Write("Fetched item with key: mystring, value: " + str + "<br>");
}
//Get an object
string[] array = SNET.Common.MemCached.SNETMemCachedClient.Get("myarray") as string[];
if (array != null)
{
Response.Write("Fetched items with key: myarray, value 1: " + array[0] + ", value 2: " + array[1]+"<br>");
}
//Get several values at once
object[] result = SNET.Common.MemCached.SNETMemCachedClient.Get(new string[] { "myinteger", "mydate" });
if (result[0] != null && result[0] is int)
{
Response.Write("Fetched item with key: myinteger, value: " + (int)result[0] + "<br>");
}
if (result[1] != null && result[1] is DateTime)
{
Response.Write("Fetched item with key: mydate, value: " + (DateTime)result[1] + "<br>");
}
str = SNET.Common.MemCached.SNETMemCachedClient.Get("secondstring", 4711) as string;
if (str != null)
{
Response.Write("Fetched item with key and custom hash: secondstring, value: " + str + "<br>");
}
SNET.Common.MemCached.SNETMemCachedClient.Replace("mystring", "替换的....");
str = SNET.Common.MemCached.SNETMemCachedClient.Get("mystring") as string;
if (str != null)
{
Response.Write("Fetched item with key: mystring, value: " + str + "<br>");
}
}
本地测试的性能还不错的。
注意在大型的网站应用时,一定要设置合适的CacheMaxPoolSize,不然会假死,这个表示最大的PoolSize.