代码改变世界

初识 Memcached【一】

2013-04-18 16:19  音乐让我说  阅读(592)  评论(0编辑  收藏  举报

关于 Memcached 大家都已经比较熟悉了,来自百度百科介绍如下:

Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。

今天研究了一下,也算是简单的测试通过了,下面介绍自己的步骤,有什么不到位的,或者有误的,还请大牛即使指正,谢谢!

1. 首先去 Memcached 的官网下载最新的源代码,地址:http://memcached.org/,目前最新的版本是:Memcached 1.4.15。

2. 用C++或者tc编译源代码,然后生成exe文件。我这里有编译好的文件,不过版本是 1.2.5,点击这里下载

3. 解压缩文件到 c:\memcached

4. 命令行输入 'c:\memcached\memcached.exe -d install'

5. 命令行输入 'c:\memcached\memcached.exe -d start' ,该命令启动 memcached ,默认监听端口为 11211,通过 memcached.exe -h 可以查看其帮助。

6. 下载 memcached .net client lib,下载地址:http://sourceforge.net/projects/memcacheddotnet/,我下载的版本是:memcacheddotnet_clientlib-1.1.5

7. 解压后,就可以看到源代码了,用 VS 打开,编译后在 Release 文件夹下把下面的 DLL 文件 Copy 出来。

8. 重新新建一个测试项目,比如 Web 应用程序。添加对上面那 4 个 DLL 的引用。

9. 在 index.aspx 和 index.aspx.cs 中撰写测试代码,比如我的是:

View Code
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="index.aspx.cs" Inherits="DearBruce.MemcachedTest.WebApp.index" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <style type="text/css">
        div{ margin: 20px;}
    </style>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Button ID="btnInitSockIOPool" runat="server" Text="初始化池、Socket" OnClick="btnInitSockIOPool_Click" />
    </div>
    <div>
        <asp:TextBox ID="txtUserInput" runat="server" Width="300px" />

        <asp:Button ID="btnSetValueToMemcached" runat="server" Text="设置值到 Memcached" OnClick="btnSetValueToMemcached_Click" />
        
    </div>
    <div>
        <asp:Button ID="btnGetValueFromMemcached" runat="server" Text="从 Memcached 得到值" OnClick="btnGetValueFromMemcached_Click" />
    </div>
    <div>
        <asp:Button ID="btnDeleteValueFromMemcached" runat="server" Text="从 Memcached 移除值" OnClick="btnDeleteValueFromMemcached_Click" />
    </div>
    <div>
        <asp:Button ID="btnClosePool" runat="server" Text="关闭池、Socket" OnClick="btnClosePool_Click" />
    </div>
    <div>
        <asp:Literal ID="ltMessage" runat="server" ViewStateMode="Disabled" />
    </div>
    </form>
</body>
</html>
View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Memcached.ClientLibrary;

namespace DearBruce.MemcachedTest.WebApp
{
    public partial class index : System.Web.UI.Page
    {
        private const string MemcachedKey = "TestKey";

        protected void Page_Load(object sender, EventArgs e)
        {
            if(!IsPostBack)
            {
                
            }
        }

        protected void InitSockIOPool()
        {
            string[] serverlist = { "127.0.0.1:11211" };

            //初始化池
            SockIOPool pool = SockIOPool.GetInstance();
            pool.SetServers(serverlist);

            pool.InitConnections = 3;
            pool.MinConnections = 3;
            pool.MaxConnections = 5;

            pool.SocketConnectTimeout = 1000;
            pool.SocketTimeout = 3000;

            pool.MaintenanceSleep = 30;
            pool.Failover = true;

            pool.Nagle = false;
            pool.Initialize();
        }

        protected void btnSetValueToMemcached_Click(object sender, EventArgs e)
        {
            string txtUserInput = this.txtUserInput.Text;
            if (string.IsNullOrEmpty(txtUserInput))
            {
                ShowMessage("请输入要设置的值!");
                return;
            }

            // 获得客户端实例
            MemcachedClient mc = new MemcachedClient();
            mc.EnableCompression = false;


            mc.Set(MemcachedKey, txtUserInput);
            ShowMessage("设置成功!");
        }

        protected void btnGetValueFromMemcached_Click(object sender, EventArgs e)
        {
            MemcachedClient mc = new MemcachedClient();
            if (mc.KeyExists(MemcachedKey))
            {
                ShowMessage("您输入的值为:" + mc.Get(MemcachedKey).ToString());
            }
            else
            {
                ShowMessage(string.Format("Memcached 中不存在键为 \"{0}\" 的项!", MemcachedKey));
            }
        }

        protected void btnDeleteValueFromMemcached_Click(object sender, EventArgs e)
        {
            MemcachedClient mc = new MemcachedClient();
            mc.Delete(MemcachedKey);  //移除缓存中key为test的项目

        }

        protected void btnInitSockIOPool_Click(object sender, EventArgs e)
        {
            InitSockIOPool();
        }

        protected void btnClosePool_Click(object sender, EventArgs e)
        {
            SockIOPool.GetInstance().Shutdown();  //关闭池, 关闭sockets
        }

        protected void ShowMessage(string message)
        {
            this.ltMessage.Text += message;
        }
    }
}

 

10. 运行,测试,成功!

其它 .NET 客户端介绍 

EnyimMemcached

可参考地址:

http://www.cnblogs.com/dudu/p/performance-monitor-enyim-memcached.html

http://zhoufoxcn.blog.51cto.com/792419/528212/

 

可参考网址:

memcached罢工引发的血案-博客园评论超时问题处理过程

memcached - Google Code

Discuz!NT中集成Memcached分布式缓存 - daizj - 戴振军 - 博客园

谢谢浏览!