>백엔드 개발 >C#.Net 튜토리얼 >MemoryCache 문제 해결 솔루션

MemoryCache 문제 해결 솔루션

巴扎黑
巴扎黑원래의
2017-09-01 14:32:163015검색

이 글에서는 .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를 사용하여 메모리 캐시 기능을 구현하고 코드를 수정하여 비호환성 문제를 해결할 수 있다는 것입니다. 아래에서는 할 말이 많지 않으니, 자세한 소개를 살펴보겠습니다.

Solution


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을 찾을 수 없다는 메시지가 표시됩니다. 캐싱 네임스페이스로 인해 원본 코드를 직접 컴파일하여 사용할 수 없습니다. 🎜

🎜🎜2. 기본적으로 .NET Core에서 구현되는 MemoryCache 클래스와 새로운 메모리 캐시 API🎜🎜🎜🎜를 제공하는 Microsoft.Extensions.Caching.Memory 네임스페이스에 대한 참조를 추가합니다. rrreee🎜3 .코드를 다시 작성하고 새 API를 사용하여 메모리 캐시 기능을 구현합니다🎜🎜캐시 객체 초기화 방법을 다시 작성하기 전: 🎜🎜🎜🎜rrreee🎜캐시 ​​객체 초기화 방법을 다시 작성한 후: 🎜🎜🎜🎜 rrreee🎜메모리 캐시 값 읽는 방법 변경: 🎜🎜 🎜🎜rrreee🎜다시 쓰기 후: 🎜🎜🎜🎜rrreee🎜메모리 캐시 내용 방법 설정 변경: 🎜🎜🎜🎜rrreee🎜수정 후: 🎜🎜🎜 🎜 rrreee🎜🎜🎜결론🎜🎜🎜 🎜🎜 사용 Microsoft.Extensions.Caching.Memory 아래의 새 API가 이전 코드를 다시 작성한 후에는 모든 원래 메모리 캐시 시간 제한 전략에 해당하는 새 API가 있음을 알 수 있습니다. AbsoluteExpiration, SlidingExpiration 등을 포함합니다. 🎜🎜그래서 우리는 새로운 .NET Core API를 쉽게 사용하여 간단한 변경만으로 기존 코드 대부분을 재사용하고 마이그레이션하여 계속 작업할 수 있습니다. 🎜🎜🎜🎜마이그레이션 후의 전체 코드는 다음과 같습니다. 🎜🎜🎜🎜🎜🎜rrreee

위 내용은 MemoryCache 문제 해결 솔루션의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.