プロフィール:プロフィール
キャッシュとは、高速なデータ交換が可能なメモリであり、メモリよりも先にCPUとデータを交換するため、高速です。CPUはディスクから読み取るよりも数桁速くメモリからデータを読み取り、メモリ内に存在するため、データベースアクセスの圧力が軽減されるため、キャッシュはほぼすべてのアイテムに使用されます。一般常用的有 MemoryCache、Redis今日就给大家带来MemoryCache 的使用绍介!
カテゴリー:Category
メモリキャッシュの有効期限は4種類ある
- Never Expiredシングル
- 絶対有効期限
- の有効期限に対する
- スライド有効期限
もちろん、これらの3つの有効期限からスライドウィンドウ+絶対有効期限などを導出することもできます。
公式サイトアドレス
我们也可以看到公式书类来详细了解 MemoryCache,这里就做过多解了
- MemoryCache 地址: https://docs.microsoft.com/zh-cn/dotnet/api/system.runtime.caching.memorycache?redirectedfrom=MSDN&view=dotnet-plat-ext-6.0
使用する。
前の質問に戻り、有効期限の設定方法を説明しましょう!
Never Expiredシングル
私のプログラムがリリースされた後も、キャッシュをクリーンアップしない限り、キャッシュは有効です!
/// <summary>
/// 永不过期时间
/// </summary>
static void NeverExpire()
{
_cache.Set("NeverExpire", "1");
}
絶対有効期限
絶対的な時間は“締め切り”と呼ばれます。
static void AbsoluteExpiration()
{
DateTime time = new DateTime(2022, 04, 01, 23, 59, 59);
_cache.Set("AbsoluteExpiration", "20220401235959", time);
}
の有効期限に対する
相対现在的期限切れ时间,就说我们设置キャッシュ后的一分内有效,可参考我们常见的ショートメッセージログイン,后端无论生成一个検证コード并预入redis,并设该 key 的期限切れ时间,其后就是検证了,发送手电话番号和検证コード到バックグラウンド, 从 redis 中取出对対応検证コード就行検证,如果正就把该検证コード削除,防止可可可以防可可以防可多回検证了
static void ExpirationTimeRelativeToThePresent()
{
_cache.Set("AbsoluteExpiration", "123456", new TimeSpan(0, 0, 60));
}
スライド有効期限
キャッシュが設定された時間内に使用されなかった場合は失効し、使用後にキャッシュの有効期限が再フラッシュされる
static void SlidingExpirationTime()
{
_cache.Set("SlidingExpirationTime", "3", new MemoryCacheEntryOptions()
{
SlidingExpiration = new TimeSpan(0, 0, 2),
AbsoluteExpiration = DateTimeOffset.Now.AddMilliseconds(1000)
});
}
公式サイトの定義を見てみましょう!

次に、2番目のパラメータMemoryCacheEntryOptionsを解釈して、キャッシュエントリの絶対有効期限を設定します。現在のキャッシュ設定から1000 秒後おそらく分。冗談はさておき、通常のシーンは通常5分、10分、実際のビジネスデザインを見てください)。像我们常游的英雄连盟手动,我们一日不ログイン,キャッシュ的 token失効,要再ログイン取得token,我们每日都在游动トリガー了スライディング有効期限时间,就不必要每回开始app 时ログインアカウント,但是一定时间再生了我们还是再ログイン我们的アカウント这是スライディング有効期限时间中绝对期限切れ时间!
キャッシュ値を取得
ConcurrentDictionary
static void GetCache()
{
//方式一
_cache.Get("NeverExpire").ToString();
//方式二
string value = "";
if (!_cache.TryGetValue("NeverExpire", out value))
{
throw new Exception("不存在该缓存或者已过期");
}
}
キャッシュ値をクリア
static void GetCache()
{
string value = "";
if (_cache.TryGetValue("NeverExpire", out value))
{
_cache.Remove("NeverExpire");
}
}
削除時に値が全く必要ないことがわかるかもしれませんし、一時変数を使用するのは少し痛いですか?
実際、C#もこの問題を考慮しているので、C#は7.0から破棄をサポートしており、破棄は書き込みとセマンティクスの改善だけでなく、メモリ割り当てを減らすこともできます。
上記のコードを単純化します。
static void GetCache()
{
if (_cache.TryGetValue("NeverExpire", out _))
{
_cache.Remove("NeverExpire");
}
}
完全なコード。
class Program
{
public static IMemoryCache _cache = new MemoryCache(new MemoryCacheOptions());
static void Main(string[] args)
{
_cache.Get("NeverExpire").ToString();
string value = "";
if (!_cache.TryGetValue("NeverExpire", out value))
{
throw new Exception("不存在该缓存或者已过期");
}
if (_cache.TryGetValue("NeverExpire", out value))
{
_cache.Remove("NeverExpire");
}
if (_cache.TryGetValue("NeverExpire", out _))
{
_cache.Remove("NeverExpire");
}
}
/// <summary>
/// 永不过期时间
/// </summary>
static void NeverExpire()
{
_cache.Set("NeverExpire", "1");
}
/// <summary>
/// 绝对过期时间
/// </summary>
static void AbsoluteExpiration()
{
DateTime time = new DateTime(2022, 04, 01, 23, 59, 59);
_cache.Set("AbsoluteExpiration", "20220401235959", time);
}
/// <summary>
/// 相对现在的过期时间
/// </summary>
///
static void ExpirationTimeRelativeToThePresent()
{
_cache.Set("AbsoluteExpiration", "123456", new TimeSpan(0, 0, 60));
}
/// <summary>
/// 滑动过期时间
/// </summary>
static void SlidingExpirationTime()
{
_cache.Set("key3", "3", new MemoryCacheEntryOptions()
{
SlidingExpiration = new TimeSpan(0, 0, 2),
AbsoluteExpiration = DateTimeOffset.Now.AddMilliseconds(1000)
});
}
}
最后大家如果喜欢我的文章,还烦烦烦给个注目并点个赞,希望 net生态圏好!