memcache是一套分布式的高速缓存系统,实现了从单机到分布式。
memcache实现了从单机到分布式,同时也实现了多台机器共享用户登录状态。
这个其实很好理解的:现在有三台机器组成了一个WEB应用集群,其中一台机器用户登录,然后其他两外两台机器共享登录状态。我们在淘宝的时候,每次点击一种物品链接的时候,这个链接可能或发送到全国各地,那么这些服务器是怎样获取用户的信息的?其实解决这个问题我们有三种解决方案:
1、Asp.Net进程外的Session。
2、用数据库存数当前的登陆状态。(其实个人觉得,如果要用这种方式,那么每个服务器都要是可以访问到其他数据库中的信息的。)
3、Memcache。
其实memcache是一种windows服务,客户端发来的请求,都会被Socket服务器端接受到。存储使用键值对存储的。
我们用一张图来表示一下:
memcached中通过Socket服务端,接受客户端i按揭,并发来存储、获取数据的命令。
memcached
1、解决高并发访问数据库带来的死锁。
2、多用户端共享缓存。
步骤:
<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>
<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>
<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>
原文地址:http://blog.csdn.net/qiumuxia0921/article/details/44599463