字典缓存 DictionaryCache 设计于2008年,在.NET2.0/.NET4.0时代是X组件内存缓存之王。

DictionaryCache 设计理念很简单,从缓存里面取值,如果目标键值不存在,就执行委托得到所需数据,并缓存起来。

Nuget包:NewLife.Core

源码地址:https://github.com/NewLifeX/X/blob/master/NewLife.Core/Collections/DictionaryCache.cs


快速用法

GetItem 是最常见用法,试图从缓存内获取指定key的值,如果key不存在就执行委托更新数据。

/// <summary>扩展获取数据项,当数据项不存在时,通过调用委托获取数据项。线程安全。</summary>
/// <param name="key">键</param>
/// <param name="func">获取值的委托,该委托以键作为参数</param>
/// <returns></returns>
public virtual TValue GetItem(TKey key, Func<TKey, TValue> func);


完整用法

字典缓存有一些基础属性,用于设置缓存行为特性。

/// <summary>过期时间。单位是秒,默认0秒,表示永不过期</summary>
public Int32 Expire { get; set; }

/// <summary>定时清理时间,默认0秒,表示不清理过期项</summary>
public Int32 Period { get; set; }

/// <summary>容量。容量超标时,采用LRU机制删除,默认10_000</summary>
public Int32 Capacity { get; set; } = 10_000;

/// <summary>是否允许缓存控制,避免缓存穿透。默认false</summary>
public Boolean AllowNull { get; set; }

/// <summary>查找数据的方法</summary>
public Func<TKey, TValue> FindMethod { get; set; }

前面GetItem加进去的缓存,实际上都有有效期(Expire指定),内部会定时清理(Period控制)。

如果容量超标,还会根据LRU策略进行剔除。

在某些情况下,为了防止缓存穿透,可能还需要AllowNull把空值给缓存下来。


如果通过FindMethod指定了取数委托,则可以直接使用索引器取缓存。

/// <summary>重写索引器。取值时如果没有该项则返回默认值;赋值时如果已存在该项则覆盖,否则添加。</summary>
/// <param name="key"></param>
/// <returns></returns>
public TValue this[TKey key] { get => GetOrAdd(key); set => Set(key, value); }

/// <summary>获取 GetOrAdd</summary>
/// <param name="key"></param>
/// <returns></returns>
public virtual TValue GetOrAdd(TKey key);


常见用途是,FindMethod 指向数据库查询方法,然后字典缓存自身向上级提供数据,马上就实现了一个数据缓存层,可根据主键查找数据。主键不存在时,走数据库查询拿到数据,更新缓存。主键存在时,在有效期之内,都会通过缓存返回数据,而不会走数据库查询。

作者:大石头 发布:2021-02-18 23:56:26 浏览:3,034)