澳门新萄京官方网站-www.8455.com-澳门新萄京赌场网址

爬虫学习笔记,Cache之数据缓存

2019-06-08 作者:www.8455.com   |   浏览(173)

      在成功了DNS解析模块然后,我发觉到了DNS缓存机制也很有须要。在Redis,Memcache,和.Net自带的Cache之间,考虑到布署难题,最后选项了后世,以前在攻读Web及支付的进度中用过System.Web.Caching.Cache.aspx)这一个类库,然而这一次的爬虫程序笔者筹算铺排为桌面软件,所以接纳了System.Runtime.Caching.MemoryCache(早先时期如有供给也会加盟System.Web.Caching.Cache来适配Web端程序)。

      MemoryCache的利用英特网介绍的非常少,可是这么些是.NET四.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的缓存辅助类 /// 爬虫学习笔记,Cache之数据缓存。 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.IsNullOr惠特eSpace(key)) throw new ArgumentException("违规的key!"); if (!MemoryCache.Default.Contains(key)) 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)) 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; } } }

添加 Cache[Key]=object  or Cache.Insert

 

添加 Cache[Key]=object or Cache.Insert

移除 Cache.Remove(key)

/// <summary>
    /// 缓存处理器接口类
    /// </summary>
    public interface ICacheManager
    {
        /// <summary>
        /// 以目的的样式获得缓存中的钦赐缓存项。
        /// </summary>
        /// <typeparam name="T">Type</typeparam>
        /// <param name="key"> 要获得的缓存项的唯1标记符。</param>
        /// <returns> 由 key 标志的缓存项.</returns>
        T Get<T>(string key);

移除 Cache.Remove

1、将值直接写入Cache

        /// <summary>
        /// 向缓存中插入缓存项,同期钦定基于时间的晚点详细音讯。
        /// </summary>
        /// <param name="key">该缓存项的唯一标志符。</param>
        /// <param name="data">要插入的目的。</param>
        /// <param name="cacheTime">缓存项的原则性的逾期日期和时间。</param>
        void Set(string key, object data, int cacheTime);

一、将值直接写入Cache

 代码如下

        /// <summary>
        ///   检查缓存中是否已存在该缓存项。
        /// </summary>
        /// <param name="key">该缓存项的唯一标识符。</param>
        /// <returns> 假如缓存中带有具备与 key 一样的键值的缓存项,则为 true;否则为 false。</returns>
        bool IsSet(string key);

代码如下

复制代码

        /// <summary>
        /// 从缓存中移除缓存项。
        /// </summary>
        /// <param name="key">/该缓存项的独一无二标记符。</param>
        void Remove(string key);

复制代码

HttpContext.Current.Cache["One"] = "1";

        /// <summary>
        /// 通过正则表明式清除缓存
        /// </summary>
        /// <param name="pattern">pattern</param>
        void RemoveByPattern(string pattern);

HttpContext.Current.Cache["One"] = "1";

利用'相对逾期'方式管理缓存,过期光阴为:9999年10月二二十日(不推荐使用该方法管理缓存,并且应在适当的时候清空缓存Key)

        /// <summary>
        /// 清除缓存
        /// </summary>
        void Clear();
    }

采纳'相对逾期'形式管理缓存,过期时间为:999九年一月二二日(不推荐应用该办法管理缓存,并且应在妥善的时候清空缓存Key)

2、使用Insert(String, Object)插入Cache

 

2、使用Insert(String, Object)插入Cache

 代码如下

/// <summary>
    /// 全局数据缓存MemoryCacheManager类,使用.net  缓存框架实现多少缓存
    /// </summary>
    public partial class MemoryCacheManager : ICacheManager
    {
        /// <summary>
        ///   表示3个对象缓存并提供用于访问该目的缓存的基方法和总体性。
        /// </summary>
        protected ObjectCache Cache
        {
            get
            {
                return MemoryCache.Default;
            }
        }
       
        /// <summary>
        /// 在派生类中重写时,以指标的款式获得缓存中的钦命缓存项。
        /// </summary>
        /// <typeparam name="T">Type</typeparam>
        /// <param name="key"> 要赢得的缓存项的唯①标识符。</param>
        /// <returns> 由 key 标志的缓存项.</returns>
        public T Get<T>(string key)
        {
            return (T)Cache[key];
        }

代码如下

复制代码

        /// <summary>
        /// 在派生类中重写时,向缓存中插入缓存项,同期钦点基于时间的超时详细消息。
        /// </summary>
        /// <param name="key">该缓存项的唯一标识符。</param>
        /// <param name="data">要插入的靶子。</param>
        /// <param name="cacheTime">缓存项的固定的晚点日期和岁月。</param>
        public void Set(string key, object data, int cacheTime)
        {
            if (data == null)
                return;

复制代码

string cacheKey = "Two";
object cacheValue = HttpContext.Current.Cache.Get(cacheKey);

            //  定义一个富含该缓存项的逐出详细音讯的对象。此指标提供比轻松绝对过期越来越多的逐出选项。
            var policy = new CacheItemPolicy();
            policy.AbsoluteExpiration = DateTime.Now TimeSpan.FromMinutes(cacheTime);
            Cache.Add(new CacheItem(key, data), policy);
        }

string cacheKey = "Two";
object cacheValue = HttpContext.Current.Cache.Get;

if(cacheValue == null)
{
    cacheValue = WebConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString;

        /// <summary>
        ///   在派生类中重写时,检查缓存中是还是不是已存在该缓存项。
        /// </summary>
        /// <param name="key">该缓存项的独步一时标记符。</param>
        /// <returns> 倘诺缓存中含有具备与 key 同样的键值的缓存项,则为 true;不然为 false。</returns>
        public bool IsSet(string key)
        {
            return (Cache.Contains(key));
        }

if(cacheValue == null)
{
cacheValue = WebConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString;

    HttpContext.Current.Cache.Insert(cacheKey, cacheValue);
}

        /// <summary>
        ///  在派生类中重写时,从缓存中移除缓存项。
        /// </summary>
        /// <param name="key">/该缓存项的唯一标记符。</param>
        public void Remove(string key)
        {
            Cache.Remove(key);
        }

HttpContext.Current.Cache.Insert(cacheKey, cacheValue);
}

//呈现钦定缓存的Key 与 Value
this.ShowMessage(cacheKey, cacheValue.ToString());

        /// <summary>
        /// 通过正则相称从缓存中移除缓存项。
        /// </summary>
        /// <param name="pattern">正则表明式</param>
        public void RemoveByPattern(string pattern)
        {
            var regex = new Regex(pattern, RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.IgnoreCase);
            var keysToRemove = new List<String>();

//突显钦点缓存的Key 与 Value
this.ShowMessage(cacheKey, cacheValue.ToString;

3、使用Insert(String, Object, CacheDependency, DateTime, TimeSpan)插入Cache

            foreach (var item in Cache)
                if (regex.IsMatch(item.Key))
                    keysToRemove.Add(item.Key);

3、使用Insert(String, Object, CacheDependency, DateTime, TimeSpan)插入Cache

 代码如下

            foreach (string key in keysToRemove)
            {
                Remove(key);
            }
        }

代码如下

复制代码

        /// <summary>
        ///清除缓存
        /// </summary>
        public void Clear()
        {
            foreach (var item in Cache)
                Remove(item.Key);
        }
    }

复制代码

string cacheKey = "__cache__students";

 

string cacheKey = "__cache__students";

DataSet dataSet = this.Cache.Get(cacheKey) as DataSet;

/// <summary>
    ///缓存增添类
    /// </summary>
    public static class CacheExtensions
    {
        /// <summary>
        /// 向缓存中插入缓存项或猎取缓存中的钦点缓存项
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <param name="cacheManager">使用的缓存管理器</param>
        /// <param name="key">该缓存项的不二法门标志符</param>
        /// <param name="acquire">委托项目</param>
        /// <returns></returns>
        public static T Get<T>(this ICacheManager cacheManager, string key, Func<T> acquire)
        {
            return Get(cacheManager, key, 60, acquire);
        }
        /// <summary>
        /// 向缓存中插入缓存项或获得缓存中的钦点缓存项
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <param name="cacheManager">使用的缓存管理器</param>
        /// <param name="key">该缓存项的独步一时标志符</param>
        /// <param name="cacheTime">缓存项的固化的超时日期和岁月</param>
        /// <param name="acquire">委托项目</param>
        /// <returns></returns>
        public static T Get<T>(this ICacheManager cacheManager, string key, int cacheTime, Func<T> acquire)
        {
            if (cacheManager.IsSet(key))
            {
                // 以目的的款型获得缓存中的钦赐缓存项。
                return cacheManager.Get<T>(key);
            }
            else
            {
                var result = acquire();
                     //向缓存中插入缓存项,同不时间钦赐基于时间的超时详细音信。
                    cacheManager.Set(key, result, cacheTime);
                return result;
            }
        }
    }

DataSet dataSet = this.Cache.Get as DataSet;

if(dataSet == null)
{
    dataSet = new DataSet();

 

if(dataSet == null)
{
dataSet = new DataSet();

    //加载XML并填充至DataSet
    dataSet.ReadXml(this.Server.MapPath(@"XMLFile.xml"));

 

//加载XML并填充至DataSet
dataSet.ReadXml(this.Server.MapPath(@"XMLFile.xml"));

    //参加缓存,并设定'相对过期时间'为陆分钟
    this.Cache.Insert(cacheKey, dataSet, null, DateTime.Now.AddMinutes(5), System.Web.Caching.Cache.NoSlidingExpiration);
}

 

//参与缓存,并设定'绝对过期时间'为陆分钟
this.Cache.Insert(cacheKey, dataSet, null, DateTime.Now.AddMinutes, System.Web.Caching.Cache.NoSlidingExpiration);
}

//绑定DataGrid数据
grdDefault.DataSource = dataSet;
grdDefault.DataBind();

 

//绑定DataGrid数据
grdDefault.DataSource = dataSet;
grdDefault.DataBind();

该格局较主要的五个参数为absoluteExpiration及slidingExpiration
absoluteExpiration  DateTime类型,代表绝对过期时间
slidingExpiration  提姆eSpan类型,代表滑动过期时间
absoluteExpiration与slidingExpiration不能够同时选取
诸如:设定了absoluteExpiration参数时,slidingExpiration必须设定为System.Web.Caching.Cache.NoSlidingExpiration
反之:设定了slidingExpiration参数时, absoluteExpiration必须设定为System.Web.Caching.Cache.NoAbsoluteExpiration

 

该格局较重要的多少个参数为absoluteExpiration及slidingExpiration
absoluteExpiration DateTime类型,代表相对过期时间
slidingExpiration TimeSpan类型,代表滑动过期时间
absoluteExpiration与slidingExpiration不能够同期选用
比如:设定了absoluteExpiration参数时,slidingExpiration必须设定为System.Web.Caching.Cache.NoSlidingExpiration
反之:设定了slidingExpiration参数时,

 4、使用Insert(String, Object, CacheDependency, DateTime, TimeSpan, CacheItemPriority,

 

4、使用Insert(String, Object, CacheDependency, DateTime, TimeSpan, CacheItemPriority,

 代码如下

代码如下

复制代码

复制代码

CacheItemRemovedCallback)插入Cache

CacheItemRemovedCallback)插入Cache

public partial class PriorityAndCallbackDemo : System.Web.UI.Page
{
    #region 静态字段
    static bool CacheItemRemoved = false;
    static CacheItemRemovedReason Reason;
    static string CacheItemKey = "fw__cache__students";
    #endregion

public partial class PriorityAndCallbackDemo : System.Web.UI.Page
{
#region 静态字段
static bool CacheItemRemoved = false;
static CacheItemRemovedReason Reason;
static string CacheItemKey = "fw__cache__students";
#endregion

    #region 事件管理
    //页面加载
    protected void Page_Load(object sender, EventArgs e)
    {
        //缓存项已移除
        if(PriorityAndCallbackDemo.CacheItemRemoved)
        {
            ltMessage.Text = string.Format("Key={0}已从缓存移出,原因为:{壹}", PriorityAndCallback德姆o.CacheItemKey, PriorityAndCallback德姆o.Reason.ToString());
        }
    }

#region 事件管理
//页面加载
protected void Page_Load(object sender, EventArgs e)
{
//缓存项已移除
if(PriorityAndCallbackDemo.CacheItemRemoved)
{
ltMessage.Text = string.Format("Key={0}已从缓存移出,原因为:{一}", PriorityAndCallback德姆o.CacheItemKey, PriorityAndCallbackDemo.Reason.ToString;
}
}

    //'增加缓存'按键 点击事件 处理
    protected void btnAddCache_Click(object sender, EventArgs e)
    {
        DataSet dataSet = this.Cache.Get(PriorityAndCallbackDemo.CacheItemKey) as DataSet;

//'加多缓存'按键 点击事件 管理
protected void btnAddCache_Click(object sender, EventArgs e)
{
DataSet dataSet = this.Cache.Get(PriorityAndCallbackDemo.CacheItemKey) as DataSet;

        if(dataSet == null)
        {
            dataSet = new DataSet();
            dataSet.ReadXml(this.Server.MapPath(@"XMLFile.xml"));

if(dataSet == null)
{
dataSet = new DataSet();
dataSet.ReadXml(this.Server.MapPath(@"XMLFile.xml"));

            //使用 Web.config 作为缓存过期依赖项
            CacheDependency dependency = new CacheDependency(this.Server.MapPath(@"Web.config"), DateTime.Now);

//使用 Web.config 作为缓存过期依赖项
CacheDependency dependency = new CacheDependency(this.Server.MapPath(@"Web.config"), DateTime.Now);

            //到场缓存,设定优先级为暗许品级
            this.Cache.Insert(PriorityAndCallbackDemo.CacheItemKey, dataSet, dependency, DateTime.Now.AddMinutes(1), System.Web.Caching.Cache.NoSlidingExpiration, CacheItemPriority.Default, new CacheItemRemovedCallback(this.CacheItemRemovedHandler));
        }

//参预缓存,设定优先级为暗中同意等第
this.Cache.Insert(PriorityAndCallbackDemo.CacheItemKey, dataSet, dependency, DateTime.Now.AddMinutes, System.Web.Caching.Cache.NoSlidingExpiration, CacheItemPriority.Default, new CacheItemRemovedCallback(this.CacheItemRemovedHandler));
}

        //绑定GridView数据
        grdDefault.DataSource = dataSet;
        grdDefault.DataBind();
    }

//绑定GridView数据
grdDefault.DataSource = dataSet;
grdDefault.DataBind();
}

    //'移除缓存'开关 点击事件 管理
    protected void btnRemoveCache_Click(object sender, EventArgs e)
    {
        if(this.Cache[PriorityAndCallbackDemo.CacheItemKey] != null)
        {
            this.Cache.Remove(PriorityAndCallbackDemo.CacheItemKey);
        }
    }
    #endregion

//'移除缓存'按键 点击事件 管理
protected void btnRemoveCache_Click(object sender, EventArgs e)
{
if(this.Cache[PriorityAndCallbackDemo.CacheItemKey] != null)
{
this.Cache.Remove(PriorityAndCallbackDemo.CacheItemKey);
}
}
#endregion

    #region 私有办法
    //缓存项移除事件处理
    private void CacheItemRemovedHandler(string key, object value, CacheItemRemovedReason relason)
    {
        PriorityAndCallbackDemo.CacheItemRemoved = true;
        PriorityAndCallbackDemo.Reason = relason;
    }
    #endregion
}

#region 私有措施
//缓存项移除事件处理
private void CacheItemRemovedHandler(string key, object value, CacheItemRemovedReason relason)
{
PriorityAndCallbackDemo.CacheItemRemoved = true;
PriorityAndCallbackDemo.Reason = relason;
}
#endregion
}

该方式较主要的五个参数为CacheItemPriority及CacheItemRemovedCallback
CacheItemPriority  缓存项优先级,当服务器内部存储器缺乏时,优先级越高的项越不轻易被移除
CacheItemRemovedCallback  该参数为委托项目,当缓存项被移除时所调用,包涵Reason参数用于表示缓存项被移除的来头

该方法较重要的多个参数为CacheItemPriority及CacheItemRemovedCallback
CacheItemPriority 缓存项优先级,当服务器内部存款和储蓄器非常不足时,优先级越高的项越不便于被移除
CacheItemRemovedCallback 该参数为委托项目,当缓存项被移除时所调用,包括Reason参数用于表示缓存项被移除的案由

【作者是怎么用的】

先是知道缓存战术。可调过期攻略 和 相对过期攻略。注意,两则不能够同有时间利用

首先知道缓存攻略。可调过期战术 和 相对逾期战术。注意,两则无法而且选择  

行使可调过期攻略,须要将absoluteExpiration=DateTime.马克斯Value ,TimeSpan .FromMinutes设置项目唯有在11分钟内不被接纳才会被移除

选用可调过期战术,需求将absoluteExpiration=DateTime.马克斯Value ,TimeSpan .FromMinutes(10)设置项目唯有在拾分钟内不被选用才会被移除

代码如下

 代码如下

复制代码

复制代码

Cache.Insert("data", "123", null , DateTime.MaxValue, TimeSpan.FromMinutes;

Cache.Insert("data", "123", null , DateTime.MaxValue, TimeSpan.FromMinutes(10));

纯属战略,如天气报告,将音信保存60分钟

相对攻略,如天气报告,将音讯保存60分钟

代码如下

 代码如下

复制代码

复制代码

Cache.Insert("data", "123", null , DateTime.Now.AddMinutes, TimeSpan.Zero);

Cache.Insert("data", "123", null , DateTime.Now.AddMinutes(60), TimeSpan.Zero);

缓存依赖。

缓存信赖。

即3个缓存的失效注重别的二个object。这里的object能够指其它三个缓存,大概1个文书,或许....

即一个缓存的失效重视别的八个object。这里的object能够指此外三个缓存,或然1个文件,可能....

类:CacheDependency 命名空间 System.Web.Caching.CacheDependency依赖于别的缓存项目

类:CacheDependency 命名空间 System.Web.Caching.CacheDependency注重于别的缓存项目

代码如下

 代码如下

复制代码

复制代码

System.Web.Caching.CacheDependency cacheDependency = new System.Web.Caching.CacheDependency (null, new string [] { "time" });
Cache.Insert( "number", num, cacheDependency);

System.Web.Caching.CacheDependency cacheDependency = new System.Web.Caching.CacheDependency (null, new string [] { "time" });
Cache.Insert( "number", num, cacheDependency);
 
依靠于文件或文件夹
 
System.Web.Caching. CacheDependency cacheDependency = new System.Web.Caching.CacheDependency ( "test.xml");
当test.xml文件删除、更新时自动从缓存中移除
 
System.Web.Caching.CacheDependency cacheDependency = new System.Web.Caching.CacheDependency(null, new string[] { "time" });
Cache.Insert("test", "123", cacheDependency);

借助于于文件或文件夹

 
移除项目回调
 Cache.Insert("test", "123", null , DateTime.Now.AddSeconds(10), TimeSpan.Zero, new CacheItemUpdateCallback(Test));
 
 
 private void Test(string key, CacheItemUpdateReason reason, out object expensiveObject, out CacheDependency dependency, out DateTime absoluteExpiration, out TimeSpan slidingExpiration)
    {
 
    }  

System.Web.Caching. CacheDependency cacheDependency = new System.Web.Caching.CacheDependency ( "test.xml");
当test.xml文件删除、更新时自动从缓存中移除

System.Web.Caching.CacheDependency cacheDependency = new System.Web.Caching.CacheDependency(null, new string[] { "time" });
Cache.Insert("test", "123", cacheDependency);

移除项目回调
Cache.Insert("test", "123", null , DateTime.Now.AddSeconds, TimeSpan.Zero, new CacheItemUpdateCallback;

private void Test(string key, CacheItemUpdateReason reason, out object expensiveObject, out CacheDependency dependency, out DateTime absoluteExpiration, out TimeSpan slidingExpiration)
{

}

本文由澳门新萄京官方网站发布于www.8455.com,转载请注明出处:爬虫学习笔记,Cache之数据缓存

关键词: