分布式缓存--Memcached

(一)概念:


    memcache是一套分布式的高速缓存系统,实现了从单机到分布式

    memcache实现了从单机到分布式,同时也实现了多台机器共享用户登录状态

    这个其实很好理解的:现在有三台机器组成了一个WEB应用集群,其中一台机器用户登录,然后其他两外两台机器共享登录状态。我们在淘宝的时候,每次点击一种物品链接的时候,这个链接可能或发送到全国各地,那么这些服务器是怎样获取用户的信息的?其实解决这个问题我们有三种解决方案:

   1、Asp.Net进程外的Session。

   2、用数据库存数当前的登陆状态。(其实个人觉得,如果要用这种方式,那么每个服务器都要是可以访问到其他数据库中的信息的。)

   3、Memcache。


(二)原理:

  

   其实memcache是一种windows服务,客户端发来的请求,都会被Socket服务器端接受到。存储使用值对存储的

   我们用一张图来表示一下:

 

技术分享


memcached中通过Socket服务端,接受客户端i按揭,并发来存储、获取数据的命令。

memcached


(三)使用好处:


   1、解决高并发访问数据库带来的死锁。

   2、多用户端共享缓存。


(四)使用方式:

 

1、Windows中使用


步骤:


下载
拷贝
安装:cmd→Memcached.exe-d
启动:cmd→Memcached.exe-d start(restart重启,stop关闭服务)

检查:
telnetServerIP
卸载:Memcached.exe-duninstall


Window中使用--对数据操作:

添加新记录:add
删除记录:deletekeyname
添加更新:set
更新记录:replace
查看记录:get


2、在C#代码中的使用:


在项目中的主要代码是:

<span style="font-family:SimSun;font-size:18px;">String[] serverlist = { "192.168.1.100:11211",
"192.168.1.101:11211"  };
// initialize the pool for memcache servers
SockIOPool pool = SockIOPool.GetInstance("test");
pool.SetServers(serverlist);
pool.Initialize();
mc = new MemcacheClient();
mc.PoolName = "test";
mc.EnableCompression = false;
pool.Shutdown();//关闭连接池
</span>


3、完整代码实现:


(1)、引入dll文件:

技术分享

(2)、底层写入方法:

<span style="font-family:SimSun;font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Enyim.Caching;
using Enyim.Caching.Memcached;

using Enyim.Caching.Configuration;


namespace ITOO.Library.Core.Memcache
{
    public static class MemcacheHelper
    {
        private static MemcachedClient mc;

        static MemcacheHelper()
        {
            mc=new MemcachedClient();
        }

        /// <summary>
        /// 当缓存中没有数据的时候将数据写入缓存
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public static bool Add(string key, object value)
        {
            return mc.Store(StoreMode.Add, key, value);
        }
        /// <summary>
        /// 当缓存中没有数据的时候将数据写入缓存(含过期时间)
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        /// <param name="expiresAt">过期时间</param>
        /// <returns></returns>
        public static bool Add(string key, object value, DateTime expiresAt)
        {
            return mc.Store(StoreMode.Add, key, value,expiresAt);
        }


        /// <summary>
        /// 替换缓存中的数据
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public static bool Replace(string key, object value)
        {
            return mc.Store(StoreMode.Replace, key, value);
        }
        /// <summary>
        /// 替换缓存中的数据(含过期时间)
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        /// <param name="expiresAt">过期时间</param>
        /// <returns></returns>
        public static bool Replace(string key, object value, DateTime expiresAt)
        {
            return mc.Store(StoreMode.Replace, key, value, expiresAt);
        }

        /// <summary>
        /// 尝试获取缓存
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public static bool TryGet(string key, out object value)
        {
            return mc.TryGet(key, out value);
        }

        /// <summary>
        /// 获取缓存
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <returns></returns>
        public static T Get<T>(string key)
        {
            return mc.Get<T>(key);
        }
        /// <summary>
        /// 获取缓存
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public static object Get(string key)
        {
            return mc.Get(key);
        }
        /// <summary>
        /// 删除缓存
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public static bool Remove(string key)
        {
            return mc.Remove(key);
        }


        /// <summary>
        /// 获取一组缓存
        /// </summary>
        /// <param name="keys"></param>
        /// <returns></returns>
        public static IDictionary<string, object> Get(IEnumerable<string> keys)
        {
            return mc.Get(keys);
        }

        public static void Remove()
        {
            throw new NotImplementedException();
        }
    }
}</span>

这个是放在底层中的方法,这个方法中定义了memcache中的部分方法,我们可以通过调用这些方法来实现加入缓存和访问缓存。

(3)、测试代码为:

<span style="font-family:SimSun;font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ITOO.Library.Core.Memcache;
using Memcached.ClientLibrary;

namespace ITOO.Library.Test
{
    public class test
    {
        public static void Main(string[] arg)
        {
            //使用C#中使用
            //MemcacheHelper.Add("syq", "我是C#", DateTime.Now.AddMinutes(20));
            //Console.WriteLine(MemcacheHelper.Get("syq"));
            //MemcacheHelper.Remove("syq");
            //MemcacheHelper.Add("syq", "我是C#", DateTime.Now.AddMinutes(20));
            //Console.WriteLine(MemcacheHelper.Get("syq"));
            //MemcacheByCsharp.Set("syq", "我是C#", DateTime.Now.AddMinutes(20));
            //Console.WriteLine(MemcacheByCsharp.Get("syq"));

            #region 使用底层的MemcacheHelper
            ////使用底层的MemcacheHelper
            MemcacheHelper.Add("syq1", "我是底层", DateTime.Now.AddMinutes(20));
            Console.WriteLine(MemcacheHelper.Get("syq1")); 
            #endregion

            

        }
    }
}
</span>

这个测试方法是直接进行底层方法调用的,这样是加入了底层的。

总结:


其实我们Memecache实现了从单机到分布式,解决了在BS中实现的多机分享数据的问题,很大程度上使用户操作更加简单、快捷。以上只是一个Memecache的一个小Demo,后面会加载MVC中使用的。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。