很久没有写博客了,自从年后到如今要么就是加班 要么仍是在加班 基本都是到夜里1点多 通宵的干,事情太多,项目太急 。可贵今天闲暇一段时间来,看看书,写一写博客,没事就再从新的研究一下关于Memcached 的使用。算法
一.关于Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它经过在内存中缓存数据和对象来减小读取数据库的次数,从而提升动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的HashMap。其中的守护进程(daemon )是用经过C语言进行编写,可是客户端能够用任何语言来编写,并经过memcached协议与守护进程通讯。好比.NET JAVA PHP Python 等开发语言都是能够进行结合到Memcached 进行使用的。其中Memcached 存储的原理是基于Key-Value 的形式进行保存到缓存里面的。
数据库
二.关于如何安装 Memcached 在Windows 或者LINUX 我就不一一的就进行介绍了,下面我主要介绍如何进行使用Memcached 我我的主要是使用.NET C Sharp 进行开发的,因此下面我就演示一下如何使用C Sharp 如何来进行作缓存的处理。缓存
三.咱们须要首先创建一个项目我这边按照控制台应用程序为例,进行管理NuGet 添加 Memcached.Client 程序集 ISharpCode.SharpZipLib.dll 和Log4net 这些程序集。下面你就能够进行操做和使用这3个程序集里面内部封装的东西了。服务器
四.我我的比较喜欢就行将内部的方法进行从新封装进行重写 这样会更加的方便个人使用。分布式
1.Memcached 缓存处理类ide
using System;
/****************************************************
@做者:LowKeyC
@说明: Memcached 缓存处理类
@版本号:V1.0
@建立日期:2018年5月25日
*****************************************************/
namespace Memcached.Lib
{
/// <summary>
/// 缓存处理类
/// </summary>
public static class CacheHelper
{
#region 缓存供给者对象 +static ICacheProvider CacheProvider
private static ICacheProvider _cacheProvider;
/// <summary>
/// 缓存供给者对象
/// </summary>
public static ICacheProvider CacheProvider
{
get
{
if (_cacheProvider != null)
return _cacheProvider;
lock ("CacheProvider")
{
if (_cacheProvider != null)
return _cacheProvider;
return (_cacheProvider = new MemcachedProvider());
}
}
}
#endregion
#region 获取缓存数据 +static object Get(string key)
public static object Get(string key)
{
return CacheProvider.Get(key);
}
#endregion
#region 获取缓存数据 +static T Get<T>(string key) where T : class
public static T Get<T>(string key) where T : class
{
return CacheProvider.Get<T>(key);
}
#endregion
#region 设置数据缓存 +static void Set(string key, object value, DateTime absoluteExpiration)
/// <summary>
/// 设置数据缓存
/// </summary>
/// <param name="key">键</param>
/// <param name="value">缓存对象</param>
/// <param name="absoluteExpiration">绝对过时时间</param>
public static void Set(string key, object value, DateTime absoluteExpiration)
{
CacheProvider.Set(key, value, absoluteExpiration);
}
#endregion
#region 设置数据缓存 +static void Set(string key, object value, TimeSpan slidingExpiration)
/// <summary>
/// 设置数据缓存
/// </summary>
/// <param name="key">键</param>
/// <param name="value">缓存对象</param>
/// <param name="slidingExpiration">最后一次访问所插入对象时与该对象到期时之间的时间间隔</param>
public static void Set(string key, object value, TimeSpan slidingExpiration)
{
CacheProvider.Set(key, value, slidingExpiration);
}
#endregion
#region 移除指定键的缓存数据 +static void Remove(string key)
/// <summary>
/// 移除指定键的缓存数据
/// </summary>
/// <param name="key">键</param>
public static void Remove(string key)
{
CacheProvider.Remove(key);
}
#endregion
#region 清除所有缓存数据 +static void Clear()
/// <summary>
/// 清除所有缓存数据
/// </summary>
/// <remarks>
/// </remarks>
public static void Clear()
{
CacheProvider.Clear();
}
#endregion
#region static void Clear(string pattern)
/// <summary>
/// 清除通配键的缓存数据
/// </summary>
/// <param name="pattern">键</param>
public static void Clear(string pattern)
{
CacheProvider.Clear(pattern);
}
#endregion
}
}
2.基于HttpRuntime的缓存供给者 memcached
using System;
using System.Text.RegularExpressions;
using System.Web;
/****************************************************
@做者:LowKeyC
@说明: 基于HttpRuntime的缓存供给者
@版本号:V1.0
@建立日期:2018年5月25日
*****************************************************/
namespace Memcached.Lib
{
/// <summary>
/// 基于HttpRuntime的缓存供给者
/// </summary>
public class DefaultCacheProvider : ICacheProvider
{
#region 获取缓存数据 +object Get(string key)
/// <summary>
/// 获取缓存数据
/// </summary>
/// <param name="key">键</param>
/// <returns>System.Object.</returns>
public object Get(string key)
{
var cache = HttpRuntime.Cache;
return cache[key];
}
#endregion
#region 获取缓存数据 +T Get<T>(string key) where T : class
/// <summary>
/// 获取缓存数据
/// </summary>
/// <typeparam name="T">数据类型</typeparam>
/// <param name="key">键</param>
/// <returns>指定数据类型的对象</returns>
public T Get<T>(string key) where T : class
{
var obj = Get(key);
return obj as T;
}
#endregion
#region 设置数据缓存 +void Set(string key, object value, DateTime absoluteExpiration)
/// <summary>
/// 设置数据缓存
/// </summary>
/// <param name="key">键</param>
/// <param name="value">缓存对象</param>
/// <param name="absoluteExpiration">绝对过时时间</param>
public void Set(string key, object value, DateTime absoluteExpiration)
{
var cache = HttpRuntime.Cache;
cache.Insert(key, value, null, absoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration);//TimeSpan.Zero);
}
#endregion
#region 设置数据缓存 +void Set(string key, object value, TimeSpan slidingExpiration)
/// <summary>
/// 设置数据缓存
/// </summary>
/// <param name="key">键</param>
/// <param name="value">缓存对象</param>
/// <param name="slidingExpiration">最后一次访问所插入对象时与该对象到期时之间的时间间隔</param>
public void Set(string key, object value, TimeSpan slidingExpiration)
{
var cache = HttpRuntime.Cache;
cache.Insert(key, value, null, DateTime.MaxValue, slidingExpiration);
}
#endregion
#region 移除指定键的缓存数据 +void Remove(string key)
/// <summary>
/// 移除指定键的缓存数据
/// </summary>
/// <param name="key">键</param>
public void Remove(string key)
{
var cache = HttpRuntime.Cache;
cache.Remove(key);
}
#endregion
#region 清除所有缓存数据 +void Clear()
/// <summary>
/// 清除所有缓存数据
/// </summary>
public void Clear()
{
var cache = HttpRuntime.Cache;
var cacheEnum = cache.GetEnumerator();
while (cacheEnum.MoveNext())
{
cache.Remove(cacheEnum.Key.ToString());
}
}
#endregion
#region 清除通配键的缓存数据 +void Clear(string pattern)
/// <summary>
/// 清除通配键的缓存数据
/// </summary>
/// <param name="pattern">键</param>
public void Clear(string pattern)
{
var cache = HttpRuntime.Cache;
var cacheEnum = cache.GetEnumerator();
while (cacheEnum.MoveNext())
{
var key = cacheEnum.Key.ToString();
if (Regex.IsMatch(key, pattern))
cache.Remove(key);
}
}
#endregion
public void Dispose()
{
}
}
}
3.缓存供给者约束接口性能
using System;
/****************************************************
@做者:LowKeyC
@说明: 缓存供给者约束接口
@版本号:V1.0
@建立日期:2018年5月25日
*****************************************************/
namespace Memcached.Lib
{
/// <summary>
/// 缓存供给者约束接口
/// </summary>
public interface ICacheProvider : IDisposable
{
#region 获取缓存数据 +object Get(string key)
/// <summary>
/// 获取缓存数据
/// </summary>
/// <remarks>
/// 2013-11-23 22:03 Created By iceStone
/// </remarks>
/// <param name="key">键</param>
/// <returns>System.Object.</returns>
object Get(string key);
#endregion
#region 获取缓存数据 +T Get<T>(string key) where T : class
/// <summary>
/// 获取缓存数据
/// </summary>
/// <typeparam name="T">数据类型</typeparam>
/// <param name="key">键</param>
/// <returns>指定数据类型的对象</returns>
T Get<T>(string key) where T : class;
#endregion
#region 设置数据缓存 +void Set(string key, object value, DateTime absoluteExpiration)
/// <summary>
/// 设置数据缓存
/// </summary>
/// <param name="key">键</param>
/// <param name="value">缓存对象</param>
/// <param name="absoluteExpiration">绝对过时时间</param>
void Set(string key, object value, DateTime absoluteExpiration);
#endregion
#region 设置数据缓存 +void Set(string key, object value, TimeSpan slidingExpiration)
/// <summary>
/// 设置数据缓存
/// </summary>
/// <param name="key">键</param>
/// <param name="value">缓存对象</param>
/// <param name="slidingExpiration">最后一次访问所插入对象时与该对象到期时之间的时间间隔</param>
void Set(string key, object value, TimeSpan slidingExpiration);
#endregion
#region 移除指定键的缓存数据 +void Remove(string key)
/// <summary>
/// 移除指定键的缓存数据
/// </summary>
/// <param name="key">键</param>
void Remove(string key);
#endregion
#region 清除所有缓存数据 +void Clear()
/// <summary>
/// 清除所有缓存数据
/// </summary>
void Clear();
#endregion
#region 清除通配键的缓存数据 +void Clear(string pattern)
/// <summary>
/// 清除通配键的缓存数据
/// </summary>
/// <param name="pattern">键</param>
void Clear(string pattern);
#endregion
}
}
4. 而后在进行具体使用的地方进行调用便可,缓存操做助手类。 网站
using System;
using System.Collections.Generic;
using System.Text;
using Memcached.Client;
/****************************************************
@做者:LowKeyC
@说明: 缓存操做助手类
@版本号:V1.0
@建立日期:2018年5月25日
*****************************************************/
namespace Memcached.Lib
{
/// <summary>
/// 缓存操做助手类
/// </summary>
public class MemcachedProvider : ICacheProvider
{
static MemcachedClient client;
static SockIOPool pool;
static MemcachedProvider()
{
//建立链接池对象
pool = SockIOPool.GetInstance("xxx");
#region 设置链接池各项经常使用参数
//设置缓存服务地址
pool.SetServers(new[] { "IP+端口" });
//设置链接池初始数目、最小链接数目和链接数目
pool.InitConnections = 3;
pool.MinConnections = 3;
pool.MaxConnections = 50;
//设置Socket链接超时时间、Socket链接超时时间
pool.SocketConnectTimeout = 1000;
pool.SocketTimeout = 3000;
//设置维护线程运行的睡眠时间。若是设置为0,那么维护线程将不会启动
pool.MaintenanceSleep = 30;
//若是设置为false,则获得一个套接字若是存在的话。不然返回NULL,若是它没法链接到请求的服务器。
pool.Failover = true;
//若是为false,对全部建立的套接字关闭Nagle的算法
pool.Nagle = false;
#endregion
//初始化链接池
pool.Initialize();
client = new MemcachedClient();
client.EnableCompression = true; //是否启用压缩数据
client.PoolName = "micua";//此处须要与链接池名称相同,注意!!!
}
public object Get(string key)
{
var cache = client.Get(key) as _CacheItem;
if (cache == null) return null;
if (cache.SlidingExpiration != TimeSpan.Zero)
client.Set(key, cache, DateTime.Now.Add(cache.SlidingExpiration));
return cache.Data;
}
public T Get<T>(string key) where T : class
{
return Get(key) as T;
}
public void Set(string key, object value, DateTime absoluteExpiration)
{
var cache = new _CacheItem { Data = value, SlidingExpiration = TimeSpan.Zero };
client.Set(key, cache, absoluteExpiration);
}
public void Set(string key, object value, TimeSpan slidingExpiration)
{
var cache = new _CacheItem { Data = value, SlidingExpiration = slidingExpiration };
client.Set(key, cache, DateTime.Now.Add(slidingExpiration));
}
public void Remove(string key)
{
client.Delete(key);
}
public void Clear()
{
client.FlushAll();
}
public void Clear(string pattern)
{
client.FlushAll();
}
public void Dispose()
{
pool.Shutdown();
}
}
[Serializable]
class _CacheItem
{
public object Data { get; set; }
public TimeSpan SlidingExpiration { get; set; }
}
}
以上内容基本都是原创,部分引用了维基百科,和其余博客的观点。 spa
2018/05/13 01:23:13 创做