애플리케이션 속도를 높이는 한 가지 방법은 데이터베이스 옆에 캐싱 레이어를 추가하는 것입니다. 종종 우리는 데이터베이스에서 데이터를 읽고, 직렬화하고, 캐시에 저장하는 도우미 메서드를 작성합니다. NCache Entity Framework Core와 통합되어 몇 줄의 코드로 엔터티를 캐시합니다. 다음을 사용하여 캐시 배제 전략을 구현하는 방법을 살펴보겠습니다. NCache 및 엔터티 프레임워크 코어.
Entity Framework Core에는 기본 제공 캐싱 메커니즘이 없습니다. 우리는 스스로 굴려야합니다. 하지만, NCache 쿼리 결과를 쉽게 캐시할 수 있는 편리한 확장 방법 세트가 있습니다.
이번 통합을 통해 우리는 다음의 모든 확장성과 복제 기능을 활용합니다. NCache Entity Framework 애플리케이션에서.
샘플 ASP를 만들어 보겠습니다..NET Core 6.0 애플리케이션은 Entity Framework Core 쿼리를 캐시하여 카탈로그에 최고 등급의 영화 10개를 표시합니다.
등록하는 방법 NCache Entity Framework 코어 포함
시작하기 전에 다음 사항을 확인하세요. NCache 설치되었습니다. Enterprise 또는 Professional 버전이 필요합니다.
ASP를 만든 후.NET Core 웹 API 애플리케이션인 경우 EntityFrameworkCore를 설치해 보겠습니다.NCache NuGet 패키지. Professional 버전을 사용하는 경우 EntityFrameworkCore를 설치합니다.NCache.Professional NuGet 패키지 대신.
등록하려면 NCache Entity Framework를 사용하여 애플리케이션의 Program.cs 파일에 다음과 같이 작성해 보겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
using Alachisoft.NCache.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; var builder = WebApplication.CreateBuilder(args); builder.Services.AddDbContext(options => { var config = builder.Configuration; var connectionString = config.GetConnectionString("Default"); // Configure NCache with Entity Framework // We need a cacheId and database type NCacheConfiguration.Configure(cacheId: "demoCache", DependencyType.SqlServer); NCacheConfiguration.ConfigureLogger(); options.UseSqlServer(connectionString); }); builder.Services.AddControllers(); var app = builder.Build(); app.MapControllers(); app.Run(); |
일반 ASP처럼 보이지만.NET Core Entity Framework Core를 사용하는 애플리케이션(Configure() 및 ConfigureLogger() 두 가지 메서드 제외) NCache구성.
Configure() 메소드를 사용하여 캐시Id와 데이터베이스 유형을 지정합니다. 우리는 기본 캐시 인스턴스인 데모Cache와 종속성 유형.SqlServer를 사용하고 있습니다. 물론 구성 파일에서 캐시Id를 읽어야 합니다.
이 예에서는 캐시Id와 데이터베이스 유형만 사용하지만 다음을 전달할 수도 있습니다. 추가 구성 옵션 재시도 및 시간 초과와 같습니다.
그리고 ConfigureLogger()는 ASP에서 기본 로깅 추상화를 설정합니다..NET Core.
Entity Framework Core 결과를 삽입하고 캐시하는 방법 NCache
등록 후 NCache Entity Framework Core로 이동하여 영화 캐싱을 시작하는 방법을 읽고 있습니다.
Entity Framework 핵심 결과 캐싱
MoviesController 클래스를 만들어 최고의 영화 10편을 읽고 캐시해 보겠습니다. NCache. 이와 같이,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
using Alachisoft.NCache.EntityFrameworkCore; using Microsoft.AspNetCore.Mvc; namespace Movies.Controllers; [ApiController] [Route("[controller]")] public class MoviesController : ControllerBase { private readonly DatabaseContext _database; public MoviesController(DatabaseContext database) { _database = database; } [HttpGet] public async Task<IEnumerable> Get() { return await _database .Movies .OrderByDescending(m => m.Rating) .ThenBy(m => m.ReleaseYear) .Take(10) .FromCacheAsync(new CachingOptions { StoreAs = StoreAs.Collection }); } } |
NCache 기존 Entity Framework Core 메서드 위에 새로운 확장 메서드를 제공합니다.
등급 및 출시 연도별로 정렬된 10개의 영화를 검색하는 LINQ 쿼리 후에 FromCacheAsync()라는 새 메서드를 추가합니다.
FromCacheAsync()
LINQ 쿼리 결과를 캐시하고 반환합니다. 캐시에 이 결과가 없으면 데이터베이스로 이동한 다음 캐시합니다. 캐시 서버에 연결할 수 없는 경우, NCache 우리 데이터베이스에서 결과를 반환합니다. 그런 다음 결과로 캐시를 채우려고 계속 재시도합니다.
FromCacheAsync()를 사용할 때 CachingOptions 매개변수를 전달하여 다음을 알려줍니다. NCache 별도의 항목 대신 쿼리 결과를 전체적으로 캐시합니다. 있다 더 많은 옵션 만료 및 우선순위를 지정합니다.
FromCacheAsyn()에는 동기식 대안이 있습니다. FromCache()
. 비동기 버전과 달리 FromCache()는 새 항목의 캐시 키를 출력 매개변수로 반환합니다.
LoadIntoCache 및 FromCacheOnly
FromCache() 및 FromCacheAsync() 외에도 NCache LoadIntoCache() 및 FromCacheOnly()라는 또 다른 두 가지 메서드가 있습니다.
LoadIntoCache()는 모든 호출에서 캐시된 결과를 덮어씁니다. 모든 호출에서 캐시 누락이 있는 FromCache()처럼 작동합니다. 이 방법은 자주 변경되는 데이터와 항상 새로운 데이터 복사본이 필요한 시나리오에 가장 적합합니다.
FromCacheOnly()는 기본 데이터베이스를 호출하지 않습니다. 항상 캐시 서버로 이동합니다. FromCacheOnly()는 Sum, Min, Max와 같은 집계 함수를 지원합니다. 그러나 그것은 또한 몇 가지 한계. 예를 들어 FromCacheOnly()는 LINQ 식에서 여러 프로젝션이나 조인을 지원하지 않습니다.
물론 이 마지막 두 가지 방법에는 비동기 대안도 있습니다.
항목 삽입
LINQ 쿼리 결과를 캐시한 후 항목을 삽입하는 방법을 살펴보겠습니다.
. MoviesController
클래스에서는 동영상을 추가하는 새로운 메서드를 작성해 보겠습니다. 이와 같이,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
// In the same MoviesController.cs file [HttpPost] public async Task Post([FromBody] AddMovie request) { var newMovie = new Movie( name: request.Name, releaseYear: request.ReleaseYear, rating: request.Rating); _database.Movies.Add(newMovie); await _database.SaveChangesAsync(); var options = new CachingOptions { StoreAs = StoreAs.SeperateEntities }; Cache cache = _database.GetCache(); cache.Insert(newMovie, out _, options); } |
일반적으로 SaveChangesAsync()를 사용하여 동영상을 삽입한 후 GetCache()를 사용하여 캐시에 대한 참조를 얻습니다. 그런 다음 동일한 개체 참조를 사용하여 CachingOptions를 전달하는 Insert()를 사용하여 새 동영상을 삽입합니다. 우선순위, 쿼리 식별자, 만료 시간도 전달할 수 있습니다.
캐시에 이미 항목이 포함된 경우 Insert()를 사용하면 해당 항목이 대신 업데이트됩니다.
새 항목을 검색한 다음 캐시하기 위해 데이터베이스로 다시 이동하지 않고 SaveChangesAsync()를 호출한 직후 캐시에 새 항목을 삽입했습니다. 그러면 삽입하려는 각 개체마다 데이터베이스에 대한 한 번의 왕복이 절약됩니다.
결론
그것이 우리가 사용할 수있는 방법입니다 NCache Entity Framework Core 애플리케이션에서. 기존 LINQ 쿼리를 몇 가지 변경하여 엔터티 캐싱을 시작할 수 있습니다. Entity Framework 구성만 확장하면 됩니다.
FromCache() 및 그 대안을 사용하십시오. 이번 포스팅에서는 항목을 캐시하고 삽입했지만, 제거 키 이름, 쿼리 식별자 또는 객체 참조를 통해 캐시의 항목을 가져옵니다.
복잡한 LINQ 쿼리의 경우 FromCache()를 사용하자는 점을 기억하세요. 자주 업데이트되는 데이터에는 LoadIntoCache()를 사용해보자. 읽기 전용 데이터의 경우 FromCacheOnly()입니다.
이 게시물에서 우리가 따랐던 캐시 배제 전략 외에도, NCache Read-Through 및 Write-Through와 같은 다른 캐싱 전략 및 패턴을 지원합니다. ASP와 통합됩니다..NET Core 세션 상태 캐싱을 지원하는 프레임워크입니다.
이 게시물에서 작성한 코드를 따르려면 내 NCache 데모 저장소 GitHub에.