公司有两个主要使用的网站,对两个数据库有交叉的调用,访问速度该怎么提升就成了网站优化的一个关键因素。
1、 何为Memcache?
是一套分布式的高速缓存系统,目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的、需要频繁访问的数据库的网站访问速度提升效果十分显著
2、 Memcache 工作原理?
先检查客户端的请求数据是否在memcached中,如有,直接把请求数据返回,不再对数据库进行任何操作;如果请求的数据不在memcached中,就去查数据库,把从数据库中获取的数据返回给客户端,同时在 Memcached中存一份缓存。
Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的哈希表,它能够用来存储各种格式的的数据,包括视频、图像、文字以及数据库检索的结果等。也就是将数据放在内存中方便使用。
Memcached是以守护程序(监听)方式运行于一个或多个服务器
中,随时会接收客户端的连接
和操作。
3、 Memcache 简单使用案例:
1、在服务器上安装Memcache的服务,
Memcached的下载地址:http://www.newasp.net/soft/63735.html#downloaded/
2、在服务器上安装Memcache:打开命令行提示符,输入安装Memcache的命令,如图:
这是我的安装目录
安装好之后,启动服务,可以在服务中找到
Memcache 服务手动点击服务,也可以在cmd命令行提示符中,输入命令:net start "Memcached server"
3.服务安装好之后,便可以代码了:
写公共类:打开vs-----新建项目-----新建类库(manager),在项目中添加Memcached.ClientLibrary.dll引用(dll文件可以从网上下载),首先在项目添加缓冲池,添加方法,这里不一一介绍,上代码:(先添加了一个新类,类名:ComClass),完成之后点击生成。
public class ComClass
{
private static readonly MemcachedClient mc = null;
public static bool iscache(string key)
{
return mc.KeyExists(key);
}
static ComClass()
{
string[] serverlist = { "192.168.157.74:11211" };//11211是memcached默认的端口号
SockIOPool pool = SockIOPool.GetInstance("ss");//初始化缓冲池
pool.SetServers(serverlist);
pool.InitConnections = 3;//初始化链接数
pool.MinConnections = 3;//最少链接数
pool.MaxConnections = 5;//最大链接数
pool.SocketConnectTimeout = 1000;//Socket链接超时时间
pool.SocketTimeout = 3000;//Socket超时时间
pool.MaintenanceSleep = 30;//维护线程休息时间
pool.Failover = true;//失效转移(一种备份操作模式)
pool.Nagle = false;//是否用nagle算法启动
pool.Initialize();
//获得客户端实例
mc = new MemcachedClient();
mc.PoolName = "ss";
mc.EnableCompression = false;
}
public static bool add(string key,object value)
{
return mc.Add(key, value, 0);
}
/// <summary>
/// 向Memcache存储数据
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
public static bool set (string key,object value)
{
return mc.Set(key, value);
}
public static bool set(string key,object value,DateTime time)
{
return mc.Set(key, value, time);
}
/// <summary>
/// 获取Memcache中的数据
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public static object get(string key)
{
return mc.Get(key);
}
删除
public static bool dalete(string key)
{
if(mc.KeyExists(key))
{
return mc.Delete(key);
}
return false;
}
}
在网站中调用
Memcache ,这里只写一个简单示例:新建网站(get)---添加引用(刚才新建的项目的名称manager),新建web应用程序
在网站中注意添加引用即可:上代码
前台界面
后台代码展示:
using System;
using System.Data;
using manager;
namespace get
{
public partial class get : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{ }
public void getcatch()
{
Label1.Visible = false;
string key = "mm";
object obj = new object();
if(ComClass.iscache(key))
{
obj = ComClass.get(key);
DataTable u = (obj) as DataTable;
if(u!=null&&u.Rows.Count>0)
{
foreach (DataRow row in u.Rows)
{
TextBox1.Text = row["姓名"].ToString();
TextBox2.Text = row["说明"].ToString();
}
}
else
{
TextBox1.Text = "";//姓名
TextBox2.Text = "";//备注
Label1.Visible = true;
}
}
}
//获取缓存
protected void btnget_Click(object sender, EventArgs e)
{
getcatch();
}
//更新缓存
protected void btnupdate_Click(object sender, EventArgs e)
{
DataTable dt = new DataTable();
DataColumn dtc = new DataColumn("姓名", typeof(string));
dt.Columns.Add(dtc);
dtc = new DataColumn("说明", typeof(string));
dt.Columns.Add(dtc);
DataRow dr = dt.NewRow();
dr["姓名"] = TextBox3.Text;
dr["说明"] = TextBox4.Text;
dt.Rows.Add(dr);
bool b = ComClass.set("mm", dt, DateTime.Now.AddDays(1));
if(b)
{
TextBox3.Text = "";//姓名
TextBox4.Text = "";//备注
}
}
//清除缓存
protected void btnclear_Click(object sender, EventArgs e)
{
ComClass.dalete("mm");
}
}
}
另外要注意,引用刚才添加的类库,那就一定要注意一旦类库那边有什么改动,这边就需要重新生成。
这时做的网站就是用到了Memcache 进行缓存,另外,数据库交互也可以实现,Memcache 中的内容并不是只有一个网站可以使用,可以两个或多个网站同时调用。写法一样。