您的位置:首页 > 数据库 > Memcache

关于Memcache缓存

2016-03-22 15:34 816 查看
公司有两个主要使用的网站,对两个数据库有交叉的调用,访问速度该怎么提升就成了网站优化的一个关键因素。

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 中的内容并不是只有一个网站可以使用,可以两个或多个网站同时调用。写法一样。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: