关于Memcached 你了解多少?
好久没有写博客了,自从年后到现在要么就是加班 要么还是在加班 基本都是到夜里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 缓存处理类
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的缓存供给者
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; }
}
}
以上内容基本都是原创,部分引用了维基百科,和其他博客的观点。
2018/05/13 01:23:13 创作
关于Memcached 你了解多少?的更多相关文章
- 支持 .NET Core 的 Memcached 客户端 EnyimMemcachedCore
1. 介绍 EnyimMemcachedCore 是一个支持 .NET Core 的 Memcached 客户端,是从 EnyimMemcached 迁移至 .NET Core的,源代码托管在 Git ...
- Key/Value之王Memcached初探:二、Memcached在.Net中的基本操作
一.Memcached ClientLib For .Net 首先,不得不说,许多语言都实现了连接Memcached的客户端,其中以Perl.PHP为主. 仅仅memcached网站上列出的语言就有: ...
- ASP.Net MVC4+Memcached+CodeFirst实现分布式缓存
ASP.Net MVC4+Memcached+CodeFirst实现分布式缓存 part 1:给我点时间,允许我感慨一下2016年 正好有时间,总结一下最近使用的一些技术,也算是为2016年画上一个完 ...
- 缓存、队列(Memcached、redis、RabbitMQ)
本章内容: Memcached 简介.安装.使用 Python 操作 Memcached 天生支持集群 redis 简介.安装.使用.实例 Python 操作 Redis String.Hash.Li ...
- 企业做数据缓存是使用Memcached还是选Redis?
企业是使用Memcached还是选Redis? 在构建一款现代且由数据库驱动的Web应用程序并希望使其拥有更为出色的性能表现时,这个问题总会时不时出现.并给每一位开发人员带来困扰.在考虑对应用程序的性 ...
- NoSql1 在Linux(CentOS)上安装memcached及使用
前言: 今天是初五,生活基本要从过年的节奏中回归到正常的生活了,所以想想也该想想与工作有关的事情了.我之前在工作中会经常使用memcached和redis,但是自己一直没有时间系统的好好看 ...
- Memcached简介
在Web服务开发中,服务端缓存是服务实现中所常常采用的一种提高服务性能的方法.其通过记录某部分计算结果来尝试避免再次执行得到该结果所需要的复杂计算,从而提高了服务的运行效率. 除了能够提高服务的运行效 ...
- Linux 服务器 安装 memcached
linux centos 一.memcached的安装 1.下载 memcached-1.4.33.tar.gz.libevent-2.0.22-stable.tar.gz 安装 memcached ...
- Memcached和Redis比较
一.存储 Memcached基本只支持简单的key-value存储方式.Redis除key-value之外,还支持list,set,sorted set,hash等数据结构:Redis支持数据的备份, ...
- 搭建LNAMP环境(七)- PHP7源码安装Memcached和Memcache拓展
上一篇:搭建LNAMP环境(六)- PHP7源码安装MongoDB和MongoDB拓展 一.安装Memcached 1.yum安装libevent事件触发管理器 yum -y install libe ...
随机推荐
- Excel截取特定字符后面的值
应该用到三个字符串函数:LEFT.RIGHT.MID 1.LEFT函数: 用法:LEFT(要提取字符所在单元格,从左侧开始提取的个数) 例如:=LEFT(A1,2) 意思是从A1单元格提取前两个字符. ...
- (matlab)plot画图的颜色线型(转)
http://wenku.baidu.com/link?url=SVVMVH8QlDIu2hVKDtoBYs6l0CnQvFnFHJJ9yexmYVKQqhz47qIr7aK7LOf8nN0qNdy8 ...
- scrapy爬虫框架之Xpath选择器
问题: 本篇博文主要记录scrapy框架爬取伯乐在线文章的相关知识,在实践中学习对框架的理解.今天主要记录了xpath的相关用法以及语法规范. ----->>>点击进入爬取页面 一. ...
- 关于Calculator的第四次作业
一.魔法传送门: 问题描述:点我点我点我! 仓库地址:点我点我点我! 二.网上资料: sstream的介绍及应用 后缀表达式C++代码 中缀转前缀及后缀方法 C++计算器源代码 三.实现过程: 在看到 ...
- 关于markdown格式的测试..
标题 标题一 这是? 标题二 标题三 标题四 区块 1.这是一个列表项目 还是吗? 嵌套了? 空格了? 区块加列表 标题加二级列表 嘿嘿 无序列表 RED GREEN BLUE 有序列表 dog ca ...
- Keepalived + haproxy双机高可用方案
上一篇文章已经讲到了keepalived实现双机热备,且遗留了一个问题 master的网络不通的时候,可以立即切换到slave,但是如果只是master上的应用出现问题的时候,是不会 主动切换的. 上 ...
- eoLinker-AMS接口管理系统
多端阅读<eoLinker-AMS接口管理系统>: 在PC/MAC上查看:下载w3cschool客户端,进入客户端后通过搜索当前教程手册的名称并下载,就可以查看当前离线教程文档.下载eoL ...
- BZOJ1135:[POI2009]Lyz(线段树,Hall定理)
Description 初始时滑冰俱乐部有1到n号的溜冰鞋各k双.已知x号脚的人可以穿x到x+d的溜冰鞋. 有m次操作,每次包含两个数ri,xi代表来了xi个ri号脚的人.xi为负,则代表走了这么多人 ...
- 关于SpringApplication包无法导入报错问题
问题描述:一直再报红线,包始终无法导入,参考过好几个博友分享的解决方案,依然没有效果,对了补充一点SprinBoot版本为2.0.3. 问题解决:目前通过更换版本得到解决1.5.6或者1.5.8都可以 ...
- 集合之Vector
在java提高篇(二一)—–ArrayList.java提高篇(二二)—LinkedList,详细讲解了ArrayList.linkedList的原理和实现过程,对于List接口这里还介绍一个它的实现 ...