[爬虫学习笔记]MemoryCache缓存的用经济学习

     
在造成了DNS深入分析模块然后,作者发觉到了DNS缓存机制也很有需要。在Redis,Memcache,和.Net自带的Cache之间,思考到铺排难点,最后挑选了前者,在此之前在学习Web及支付的经过中用过System.Web.Caching.Cache.aspx卡塔尔国这一个类库,不过此番的爬虫程序我准备安排为桌面软件,所以选拔了System.Runtime.Caching.MemoryCache(早先时期如有供给也会到场System.Web.Caching.Cache来适配Web端程序)。

     
MemoryCache的应用互连网介绍的十分少,可是这一个是.NET4.0新引进的缓存对象,测度主即使替换原本公司库的缓存模块,使得.NET的缓存能够无处不在,而不用基于特定的Windows版本上选用。

     
出于方便寻思,大家将不再实例化新的MemoryCache对象,只对MemoryCache的私下认可示例Memory.Default举行增加和删除查操作。

基础篇

增加:

图片 1

追加缓存须要提供八个参数,CacheItem类表示缓存中的单个缓存项,

布局函数:
CacheItem(String, Object,
String)           
用缓存项的钦定键、值和区域最先化新的 CacheItem 实例。

七个参数分别为:键、值和区域。

CacheItemPolicy类则意味缓存项的超时音讯,只包括暗中认可的结构函数。

追加一条缓存:

var item = new CacheItem("习大大", "两学一做");
var policy = new CacheItemPolicy();
policy.SlidingExpiration = new TimeSpan(500);
//插入一条key为"习大大",value为"两学一做",500毫秒后自动销毁的缓存
MemoryCache.Default.Add(item, policy);
//重新设置policy的过期时间为当前时间+十分钟
policy.AbsoluteExpiration = DateTimeOffset.Now + TimeSpan.FromMinutes(10);
//注意,如果要使用Sliding时间,则Absolute必须为DateTimeOffset.MaxValue,反之,则Sliding必须为TimeSpan.Zero
policy.SlidingExpiration = TimeSpan.Zero;
//重新插入,覆盖前一条数据
MemoryCache.Default.Add(item, policy);

注意,如果要使用Sliding时间,则Absolute必须为DateTimeOffset.MaxValue,反之,则Sliding必须为TimeSpan.Zero 

查询:

缓存对象相符于字典集,查询能够一向运用memoryCache[key]来展开,比如大家查询一下前方插入的那条数据:

var idea = MemoryCache.Default["习大大"];

移除:

图片 2

参数

key:要移除的缓存项的唯意气风发标志符。

regionName:缓存中的多个增添了缓存项的命名区域。不要为该参数字传送递值。暗许情状下,此参数为null,因为
MemoryCache
类未贯彻区域。

返回值
Type: System.Object  要是在缓存中找到该项,则为已移除的缓存项;不然为 null。

剔除前边出席的那风华正茂项:

MemoryCache.Default.Remove("习大大");

进阶篇

接头了宗旨的用法之后,我们就足以对它做越来越包裹,使之使用起来特别方便:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Caching;

namespace Crawler.Common
{
///

/// 基于MemoryCache的缓存辅助类
///

public static class MemoryCacheHelper
{
private static readonly object _locker = new object();

public static bool Contains(string key)
{
return MemoryCache.Default.Contains(key);
}

///

/// 获取Catch元素
///

/// 所获取的元素的类型
/// 元素的键 /// 特定的元素值
public static T Get(string key卡塔尔(قطر‎ {
if (string.IsNullOrWhiteSpace(key卡塔尔(قطر‎卡塔尔国 throw new ArgumentException(“违规的key!”);
if (!MemoryCache.Default.Contains(key卡塔尔(英语:State of Qatar)卡塔尔(英语:State of Qatar) throw new ArgumentException(“获取战败,不设有该key!”);
if (!(MemoryCache.Default[key] is T卡塔尔) throw new ArgumentException(“未找到所需项目数据!”);
return (T)MemoryCache.Default[key];
}

///

/// 添加Catch元素
///

/// 元素的键 /// 元素的值 /// 元素过期时间(时间间隔) /// 元素过期时间(绝对时间) ///
public static bool Add(string key, object value, TimeSpan? slidingExpiration = null, DateTime? absoluteExpiration = null)
{
var item = new CacheItem(key, value);
var policy = CreatePolicy(slidingExpiration, absoluteExpiration);
lock (_locker)
return MemoryCache.Default.Add(item, policy);
}

///

/// 移出Cache元素
///

/// 待移出元素的类型
/// 待移除元素的键 /// 已经移出的元素
public static T Remove(string key) {
if (string.IsNullOrWhiteSpace(key卡塔尔(قطر‎卡塔尔 throw new ArgumentException(“不合规的key!”);
if (!MemoryCache.Default.Contains(key卡塔尔卡塔尔(قطر‎ throw new ArgumentException(“获取退步,不设有该key!”);
var value = MemoryCache.Default.Get(key);
if (!(value is T卡塔尔(英语:State of Qatar)卡塔尔国 throw new ArgumentException(“未找到所需项目数据!”);
return (T)MemoryCache.Default.Remove(key);
}

///

/// 移出多条缓存数据,默认为所有缓存
///

/// 待移出的缓存类型
/// ///
public static List RemoveAll(IEnumerable keyList = null)
{
if (keyList != null)
return (from key in keyList
where MemoryCache.Default.Contains(key)
where MemoryCache.Default.Get(key) is T
select (T)MemoryCache.Default.Remove(key)).ToList();
while (MemoryCache.Default.GetCount() > 0)
MemoryCache.Default.Remove(MemoryCache.Default.ElementAt(0).Key);
return new List();
}

///

/// 设置过期信息
///

/// /// ///
private static CacheItemPolicy CreatePolicy(TimeSpan? slidingExpiration, DateTime? absoluteExpiration)
{
var policy = new CacheItemPolicy();

if (absoluteExpiration.HasValue)
{
policy.AbsoluteExpiration = absoluteExpiration.Value;
}
else if (slidingExpiration.HasValue)
{
policy.SlidingExpiration = slidingExpiration.Value;
}

policy.Priority = CacheItemPriority.Default;

return policy;
}
}
}

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website