ホームページ  >  記事  >  バックエンド開発  >  MemoryCache の問題の解決策

MemoryCache の問題の解決策

巴扎黑
巴扎黑オリジナル
2017-09-01 14:32:162998ブラウズ

この記事では、主に .NET Core 2.0 の移行のヒントとメモリ キャッシュの問題の修復と解決策に関する関連情報をサンプル コードを通じて詳しく紹介します。この記事は、あらゆる人の学習や作業に必要な学習の参考になります。お友達の皆さん、ぜひ編集者をフォローして一緒に学んでください。

はじめに

従来の .NET Framework プロジェクトでは、System.Runtime.Caching 名前空間が一般的に使用されるツールであり、その中で MemoryCache クラスがよく使用されることを誰もが知っているはずです。メモリキャッシュを実装します。 System.Runtime.Caching命名空间是常用的工具了,其中MemoryCache类则常被用于实现内存缓存。

.NET Core 2.0暂时还不支持System.Runtime.Caching dll,这也就意味着MemoryCache相关代码不再起作用了。

但是好消息是,我们可以使用.NET Core 2.0的新API实现内存缓存功能,简单修改代码,解决不兼容问题。下面话不多说了,来一起看看详细的介绍吧。

解决方案

1.将旧代码导入项目中,如下:


using System;
using System.Runtime.Caching;

namespace TestWebApp.Service
{
 public class MemoryCacheService
 {
  static ObjectCache cache = MemoryCache.Default;
  /// <summary>
  /// 获取缓存值
  /// </summary>
  /// <param name="key"></param>
  /// <returns></returns>
  private object GetCacheValue(string key)
  {
   if (key != null && cache.Contains(key))
   {
    return cache[key];
   }
   return default(object);
  }
  /// <summary>
  /// 添加缓存内容
  /// </summary>
  /// <param name="key"></param>
  /// <param name="value"></param>
  public static void SetChacheValue(string key, object value)
  {
   if (key != null)
   {
    CacheItemPolicy policy = new CacheItemPolicy
    {
     SlidingExpiration = TimeSpan.FromHours(1)
     
    };
    cache.Set(key, value, policy);
   }
  }
 }
}

导入后你会发现VS会提示无法找到System.Runtime.Caching命名空间,原有的代码无法直接编译使用。

2.添加对Microsoft.Extensions.Caching.Memory命名空间的引用,它提供了.NET Core默认实现的MemoryCache类,以及全新的内存缓存API


using Microsoft.Extensions.Caching.Memory;

3.改写代码,使用新的API实现内存缓存功能

初始化缓存对象方式改写前:


static ObjectCache cache = MemoryCache.Default;

初始化缓存对象方式改写后:


static MemoryCache cache = new MemoryCache(new MemoryCacheOptions());

读取内存缓存值方式变化:


private object GetCacheValue(string key)
{
 if (key != null && cache.Contains(key))
 {
  return cache[key];
 }
 return default(object);
}

改写后:


private object GetCacheValue(string key)
{
 object val = null;
 if (key != null && cache.TryGetValue(key, out val))
 {
  return val;
 }
 else
 {
  return default(object);
 }
}

设定内存缓存内容方式变化:


public static void SetChacheValue(string key, object value)
{
 if (key != null)
 {
  CacheItemPolicy policy = new CacheItemPolicy
  {
   SlidingExpiration = TimeSpan.FromHours(1)
  };
  cache.Set(key, value, policy);
 }
}

修改后:


public static void SetChacheValue(string key, object value)
{
 if (key != null)
 {
  cache.Set(key, value, new MemoryCacheEntryOptions
  {
   SlidingExpiration = TimeSpan.FromHours(1)
  });
 }
}

结论

在使用了Microsoft.Extensions.Caching.Memory

.NET Core 2.0 はまだ System.Runtime.Caching dll をサポートしていません。つまり、MemoryCache 関連のコードは機能しなくなります。

しかし、良いニュースは、.NET Core 2.0 の新しい API を使用してメモリ キャッシュ機能を実装し、コードを変更するだけで非互換性の問題を解決できることです。以下では多くを語る必要はありません。詳細な紹介を見てみましょう。

解決策


1. 次のように古いコードをプロジェクトにインポートします: 🎜🎜🎜🎜
using Microsoft.Extensions.Caching.Memory;
using System;

namespace TestMemoryCacheWebApp.Services
{
 public class MemoryCacheService
 {
  static MemoryCache cache = new MemoryCache(new MemoryCacheOptions());
  /// <summary>
  /// 获取缓存值
  /// </summary>
  /// <param name="key"></param>
  /// <returns></returns>
  private object GetCacheValue(string key)
  {
   object val = null;
   if (key != null && cache.TryGetValue(key, out val))
   {

    return val;
   }
   else
   {
    return default(object);
   }
  }
  /// <summary>
  /// 添加缓存内容
  /// </summary>
  /// <param name="key"></param>
  /// <param name="value"></param>
  public static void SetChacheValue(string key, object value)
  {
   if (key != null)
   {
    cache.Set(key, value, new MemoryCacheEntryOptions
    {
     SlidingExpiration = TimeSpan.FromHours(1)
    });
   }
  }
 }
}
🎜 インポート後、VS は System.Runtime が見つからないことを示すメッセージを表示します。 Caching 名前空間では、元のコードをコンパイルして直接使用することはできません。 🎜

🎜🎜2. Microsoft.Extensions.Caching.Memory 名前空間への参照を追加します。これは、.NET Core によってデフォルトで実装される MemoryCache クラスと、新しいメモリ キャッシュ API を提供します🎜🎜🎜🎜 rrreee🎜3 .コードを書き換え、新しい API を使用してメモリ キャッシュ機能を実装します🎜🎜キャッシュ オブジェクトの初期化メソッドを書き換える前: 🎜🎜🎜🎜rrreee🎜キャッシュ オブジェクトの初期化メソッドを書き換えた後: 🎜🎜🎜🎜 rrreee🎜メモリキャッシュ値の読み取り方法の変更:🎜🎜 🎜🎜rrreee🎜書き換え後:🎜🎜🎜🎜rrreee🎜 メモリキャッシュの内容の設定方法の変更:🎜🎜🎜🎜rrreee🎜 変更後:🎜🎜🎜 🎜 rrreee🎜🎜🎜結論🎜🎜🎜 🎜🎜 の使用 Microsoft.Extensions.Caching.Memory の下の新しい API で古いコードを書き換えると、元のすべてのメモリ キャッシュ タイムアウト戦略に対応する新しい API があることがわかります。 、AbsoluteExpiration、SlidingExpiration などを含みます。 🎜🎜そのため、新しい .NET Core API を簡単に使用して、既存の古いコードのほとんどを簡単な変更で再利用し、移行して引き続き動作させることができます。 🎜🎜🎜🎜移行後の完全なコードは次のとおりです: 🎜🎜🎜🎜🎜🎜rrreee

以上がMemoryCache の問題の解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。