EF 핵심 확장 방법
NCache EF Core에서 쿼리를 캐싱하기 위한 동기 및 비동기 확장 방법을 제공합니다. 동기화 API는 IQueryable
인터페이스이며, 비동기 API는 이러한 메서드에 대한 작업 인스턴스를 반환합니다.
주의 사항
이 기능은 다음에서도 사용할 수 있습니다. NCache Professional.
다음 API를 활용하려면 애플리케이션에 다음 네임스페이스를 포함하세요.
Alachisoft.NCache.EntityFrameworkCore
NCache의 Entity Framework Core 캐싱 공급자에는 쿼리 캐싱을 위한 다음 API가 포함되어 있습니다.
동기식 API | 비동기 API |
---|---|
FromCache |
FromCacheAsync |
LoadIntoCache |
LoadIntoCacheAsync |
FromCacheOnly |
FromCacheOnlyAsync |
FromCache
확장 메서드는 트랜잭션 데이터(빈번한 읽기 및 쓰기 작업 포함)를 처리할 때 사용하는 데 이상적입니다. 예를 들어, 각 고유 항공편에 대한 새 항목에 대한 지속적인 데이터베이스 로깅이 필요한 항공편 기록을 유지 관리합니다. 또는 참조 데이터(읽기가 쓰기보다 더 빈번한 경우)의 경우 다음을 사용합니다. LoadIntoCache
및 FromCacheOnly
확장 방법. 제품 카탈로그에서와 마찬가지로 제품은 거의 수정되지 않고 데이터베이스에서 일관되게 읽혀지기 때문에 참조 데이터로 처리됩니다. 이러한 참조 데이터 확장 방법을 사용하려면 애플리케이션 내에서 쿼리 인덱스를 정의해야 합니다. 이는 다음을 추가하여 동적으로 수행할 수 있습니다. [QueryIndexable]
꼬리표.
EFCore를 사용하여 캐시 데이터 저장
In FromCache
, LoadIntoCache
, FromCacheOnly
및 Async 대응 항목의 경우 EF Core 캐싱 쿼리를 사용하여 후속 쿼리를 위해 캐시에 데이터를 저장할 수 있습니다.
두 가지 방법으로 캐시에 데이터를 저장할 수 있습니다. 삽입 호출을 사용하여 데이터 저장소의 단일 키에 대한 컬렉션으로 전체 데이터 세트를 저장합니다. 또는 여러 키에 대해 개별적으로 각 엔터티를 대량으로 추가할 수 있습니다. CachingOption을 사용하여 이 선택을 할 수 있습니다. StoreAs
로 설정 StoreAs.Collection
or StoreAs.SeperateEntities
. 지정하고 활성화할 수 있습니다. bulkInsertChunkSize
상당한 양의 개체(예: 100,000개)를 처리할 때. 이렇게 하면 데이터 세트의 크기에 관계없이 데이터가 청크 단위로 캐시에 로드되므로 데이터 저장 프로세스가 더 효율적이고 관리하기 쉬워집니다.
주의 사항
XNUMXD덴탈의 bulkInsertChunkSize
속성은 대량의 엔터티를 더 작은 청크로 나누고 캐시를 청크별로 업데이트합니다. 따라서 작업이 90초 제한 내에서 엔터티 청크를 캐시하여 취소 토큰이 트리거되는 것을 방지함으로써 연결 시간 초과를 해결할 수 있습니다. 기본적으로 bulkInsertChunkSize
1000입니다.
중대한
애플리케이션은 전체 대량이 캐시된 후에만 응답을 수신하므로 대규모 데이터 세트를 처리할 때 상당한 지연을 방지하려면 Async 확장 방법을 사용하는 것이 가장 좋습니다.
캐시에서
XNUMXD덴탈의 FromCache
메서드는 LINQ 쿼리에 대해 생성된 결과 집합 데이터를 캐시하고 이를 애플리케이션에 반환합니다. 데이터가 캐시에 존재하지 않으면 데이터 원본에서 데이터를 가져와 캐시에 저장합니다. 애플리케이션이 동일한 쿼리를 다시 수행하면 불필요한 데이터 소스 이동을 방지하여 캐시에서 필요한 데이터를 가져옵니다.
그러나 이 방법은 두 가지 수준(결과 세트 데이터 가져오기 및 캐시 업데이트)에서 수행되므로 특히 후자의 경우 실패 가능성이 높습니다. 다양한 이유로 캐시 업데이트에 실패할 수 있습니다. 예를 들어 데이터베이스 연결 실패, 네트워크 오류, 캐시/서버 다운, 데이터 직렬화 실패, 상태 전송 시나리오 등이 있습니다.
따라서, NCache 사용자에게 고용을 제공합니다 FromCache
와 더불어 errorEnabled
결과 세트와 관련되지 않은 문제에 대해 애플리케이션을 중지할지 여부를 결정할 수 있는 플래그입니다. 일반적으로 캐싱과 시스템 성능이 우선순위인 경우 사용자는 이 플래그를 True로 설정합니다(쿼리가 매번 데이터 소스를 처리하므로). 그러나 우선 순위가 애플리케이션 중지를 방해하는 경우 사용자는 이 플래그를 False로 설정합니다.
주의 사항
기본적으로 errorEnabled
플래그가 False로 설정되었습니다.
주의 사항
하더라도 errorEnabled
플래그가 False이면 이러한 업데이트 캐시 관련 예외가 다음 위치에서 사용 가능한 캐시 로그에 기록됩니다. %NCHome%/log-files
.
예
- 다음 예에서는 데이터베이스에서 지정된 고객 ID를 기반으로 고객 세부 정보를 가져와 지정된 캐싱 옵션을 사용하여 캐시에 별도의 엔터티로 저장합니다.
using (var context = new NorthwindContext())
{
var options = new CachingOptions
{
StoreAs = StoreAs.SeperateEntities
};
var resultSet = (from cust in context.Customers
where cust.CustomerId == someCustomerId
select cust).FromCache(options).ToList();
}
주의 사항
다음을 사용하여 캐시 활동을 모니터링할 수도 있습니다. NCache 모니터링합니다.
- 다음 예에서는 캐시에 컬렉션으로 저장된 쿼리 결과 세트 데이터에 대해 내부적으로 생성된 캐시 키를 반환합니다. 캐시에서 엔터티/결과 세트를 제거하는 등 향후 사용을 위해 이 키를 저장할 수 있습니다.
using (var context = new NorthwindContext())
{
var options = new CachingOptions
{
StoreAs = StoreAs.Collection
};
var resultSet = (from cust in context.Customers
where cust.CustomerId == someCustomerId
select cust).FromCache(out string cacheKey, options);
}
주의 사항
사용하여 내보내기 캐시 키 선택한 도구에서 특정 캐시의 캐시 키를 볼 수 있습니다.
FromCache에 대한 고려 사항
FromCache
다음 기능을 지원합니다:
Group By
Order By Ascending
Order By Descending
Sum
Min
Max
Average
Count
Contains
Like
FirstOrDefault
LINQ를 사용하는 동안 함수를 구현할 수 있습니다. FromCache
, 다음과 같이 :
- XNUMXD덴탈의
Like
EF Core의 연산자는 문자열 내에서 패턴 일치를 수행합니다. 일반적으로 다음과 같이 고용됩니다.Where
inSELECT
열 값 내의 특정 패턴이나 하위 문자열을 기반으로 행을 필터링하는 문입니다. 또한 문자열에서 하나 이상의 문자를 일치시키기 위해 와일드카드를 사용할 수 있습니다.
using (var context = new NorthwindContext())
{
var result = context.Customers
.Where(c => EF.Functions.Like(c.CompanyName, "Alfreds Futterkiste"))
.FromCache(options)
.ToList();
}
- XNUMXD덴탈의
Contains
연산자는 다음과 유사하게 사용할 수 있습니다.Like
주어진 기준 내에서 패턴 기반 검색을 사용하는 연산자입니다.
using (var context = new NorthwindContext())
{
var result = context.Customers
.Where(b => (b.CompanyName.Contains("Alfreds Futterkist")))
.FromCache(out cacheKey, options)
}
- XNUMXD덴탈의
FirstOrDefault
연산자는 아래와 같이 구현할 수 있습니다.
using (var context = new NorthwindContext())
{
var result = context.Products
.Where(b => b.UnitPrice > 1)
.FromCache(out cacheKey, options)
.FirstOrDefault();
}
- XNUMXD덴탈의
GroupBy
아래에 구현된 것처럼 FromCache에 대한 프로젝션과 함께 사용할 수 있습니다.
using (var context = new NorthwindContext())
{
var resultSet = context.Products
.Where(p => p.UnitPrice == 10)
.GroupBy(p => p.ProductName)
.Select(group => group.Key)
.FromCache(out cacheKey, options)
.ToList();
}
캐시에 로드
XNUMXD덴탈의 LoadIntoCache
API는 소스에서 결과 세트 데이터를 가져와 애플리케이션에 반환하지 않고 캐시합니다. 이 API는 후속 FromCache
새로운 데이터를 생성하기 위해 호출합니다. 그만큼 LoadIntoCache
이 방법은 고객 주문과 같이 자주 업데이트되는 데이터나 결제 세부정보와 같은 민감한 데이터에 특히 적합합니다. 이러한 시나리오에서 오래된 데이터를 사용하면 잘못된 비즈니스 트랜잭션이 발생할 수 있으므로 데이터의 새로운 복사본이 항상 캐시에 있어야 합니다. 이 확장 방법은 전체 작업 데이터 세트를 캐시에 로드합니다. 그런 다음 이 메서드는 데이터베이스를 쿼리하고 결과를 캐시에 저장한 후 애플리케이션에 반환합니다.
예
- 다음 예에서는 데이터베이스에서 고객 주문을 가져오고 결과 집합 데이터를 컬렉션으로 캐시에 로드합니다. 또한 나중에 사용할 수 있도록 저장할 수 있는 내부적으로 생성된 캐시 키를 반환합니다.
using (var context = new NorthwindContext())
{
var options = new CachingOptions
{
StoreAs = StoreAs.Collection
};
var resultSet = (from custOrder in context.Orders
where custOrder.Customer.CustomerId == someCustomerId
select custOrder).LoadIntoCache(out string cacheKey, options);
}
- 다음 예에서는 캐싱 옵션이 지정된 별도의 엔터티로 데이터베이스의 특정 주문 세부 정보를 캐시에 로드합니다.
using (var context = new NorthwindContext())
{
var options = new CachingOptions
{
StoreAs = StoreAs.SeperateEntities
};
var resultSet = (from custOrder in context.Orders
where custOrder.Customer.CustomerId == someCustomerId
select custOrder).LoadIntoCache(options);
}
- XNUMXD덴탈의
GroupBy
프로젝션과 함께 사용할 수 있습니다.LoadIntoCache
아래에 구현된 대로.
using (var context = new NorthwindContext())
{
var resultSet = context.Products
.Where(p => p.UnitPrice == 10)
.GroupBy(p => p.ProductName)
.Select(group => group.Key)
.LoadIntoCache(out cacheKey, options)
.ToList();
}
해당 데이터가 변경될 것으로 예상될 때마다 정기적으로 이 방법을 실행할 수 있습니다. 예를 들어 일주일 이내에 데이터 수정이 예상되는 경우 해당 기간 후에 다시 실행하면 캐시의 데이터가 업데이트됩니다.
FromCache만
고객 세부 정보처럼 자주 업데이트되지 않는 데이터의 경우 데이터 원본에서 정기적으로 가져오는 데 비용이 많이 듭니다. FromCacheOnly
캐시에 있는 엔터티를 쿼리하고 어떤 경우에도 데이터 소스에 접근하지 않습니다. 기본적으로 엔터티가 캐시에 존재하지 않는 경우에도 여전히 데이터 소스에서 가져오지 않습니다.
주의 사항
이 API는 엔터티가 별도로 저장된 경우에만 작동합니다. 즉, 캐싱 옵션 StoreAs
가 SeperateEntities
.
중대한
엔터티는 NCache Management Center를 사용하기 전에 FromCacheOnly
.
- 다음 예는 다음과 같은 경우 캐시에서 고객 정보를 가져옵니다. 빠른 엔티티가 존재합니다. 그렇지 않은 경우 반환된 결과 집합은 비어 있습니다.
using (var context = new NorthwindContext())
{
var resultSet = (from cust in context.Customers
where cust.CustomerId == someCustomerId
select cust).FromCacheOnly();
}
FromCacheOnly에 대한 고려 사항
FromCacheOnly
집계 기능을 지원합니다. 그러나 이러한 함수는 결과만 캐시하고 엔터티 자체는 캐시하지 않습니다. 따라서, NCache 제공 QueryDeferred
캐시에 있는 엔터티가 쿼리에 대한 응답으로 결과를 얻을 수 있도록 쿼리를 연기하는 메서드입니다. 지연된 API에 대한 자세한 내용은 해당 장을 참조하세요. 지연된 API 쿼리. FromCacheOnly
다음 기능을 지원합니다:
Group By
Order By Ascending
Order By Descending
Sum
Min
Max
Average
Count
Contains
Like
LINQ를 사용하는 동안 다음 고려 사항을 염두에 두십시오. FromCacheOnly
:
를 제외하고
Count
, 모든 집계 함수에는 정수 값이 있어야 합니다.Count
계산할 엔터티가 제공되어야 합니다.단일 LINQ 식
FromCacheOnly
둘 이상의 집계 함수를 사용할 수 없습니다.LINQ 식의 프로젝션은 다음과 같은 경우에만 수행할 수 있습니다.
GroupBy
연산자와 집계 함수가 사용됩니다.FromCacheOnly
.다중 투영은 지원되지 않습니다. LINQ 식에서는 하나의 특성만 프로젝션할 수 있습니다(이월됨).
using (var context = new NorthwindContext())
{
var result = context.Employees
.Select(e => e.EmployeeId) // Multiple projections have not been performed
.GroupBy(eid => eid) // eId was projected so GroupBy had to be used
.DeferredMin() // MIN provided with a numeric attribute
.FromCacheOnly();
}
GroupBy
주로 집계 함수(쿼리 결과를 컬럼을 사용하여 그룹화)에 사용되며 사전에 프로젝션이 완료되고 집계 함수를 사용하는 경우에만 사용할 수 있습니다.GroupBy
다음을 제외하고는 LINQ 표현식의 마지막 연산자여야 합니다.OrderBy
사용. 그러한 경우,GroupBy
기능을 앞으로 이동할 수 있습니다(다음에OrderBy
) 또는 역방향(이전OrderBy
).
using (var context = new NorthwindContext())
{
var result = context.Products
.Where(data => data.ProductName == "Tofu")
.GroupBy(data => new { data.ProductName})
.Select(group => new
{
_String = group.Key.ProductName,
Count = group.Count()
})
.FromCacheOnly();
}
OrderBy
(오름차순 및 내림차순 모두) LINQ 식에서만 사용할 수 있습니다.FromCacheOnly
만약GroupBy
사용.하나 이상
GroupBy
및OrderBy
단일 LINQ 식에서는 연산자를 사용할 수 없습니다.FromCacheOnly
.조인은 지원되지 않으므로
Include()
방법이 작동하지 않습니다.다음을 포함하는 LINQ 식의 경우
DateTime
인스턴스의 경우 캐시 클러스터의 모든 노드는 동일해야 합니다.DateTime
형식 설정. 그렇지 않으면 형식 예외가 발생합니다. 이 문제는 다음과 같은 경우에 발생합니다.DateTime.Now
및DateTime.Parse()
방법은 다중 노드 캐시 클러스터에서 사용됩니다. 이를 방지하려면DateTime
두 컴퓨터 모두에서 형식을 지정합니다. 게다가,DateTime.ParseExact()
위에DateTime.Parse()
,로ParseExact()
API는 사용자가 형식을 지정하지 못하도록 제한합니다.DateTime
.XNUMXD덴탈의
Like
EF Core의 연산자는 문자열 내에서 패턴 일치를 수행합니다. 일반적으로 다음과 같이 고용됩니다.Where
inSELECT
열 값 내의 특정 패턴이나 하위 문자열을 기반으로 행을 필터링하는 문입니다. 또한 문자열에서 하나 이상의 문자를 일치시키기 위해 와일드카드를 사용할 수 있습니다.
using (var context = new NorthwindContext())
{
var result = context.Customers
.Where(c => EF.Functions.Like(c.CompanyName, "Alfreds Futterkiste"))
.FromCacheOnly()
.ToList();
}
- XNUMXD덴탈의
Contains
연산자는 다음과 유사하게 사용할 수 있습니다.Like
주어진 기준 내에서 패턴 기반 검색을 사용하는 연산자입니다.
using (var context = new NorthwindContext())
{
var result = context.Customers
.Where(b => (b.CompanyName.Contains("Alfreds Futterkist")))
.FromCacheOnly()
}
- XNUMXD덴탈의
Contains
연산자를 사용하여 사전을 검색할 수도 있습니다.
using (var context = new NorthwindContext())
{
var customerList = new List<string> { "CustomerId", "Alfreds Futterkiste" };
var result = context.Customers
.Where(b => customerList.Contains(b.CompanyName))
.FromCacheOnly();
}
비동기 LINQ API
비동기 API는 동기 API와 기능은 동일하지만 비동기 동작을 합니다. 이러한 메소드에 전달되는 매개변수도 동일합니다.
중대한
비동기 특성으로 인해 cacheKey
다음과 같은 비동기 호출에서는 반환되지 않습니다. FromCacheAsync
및 LoadIntoCacheAsync
- 같이 out
비동기 서명이 있는 메서드에는 매개 변수가 허용되지 않습니다.
FromCacheAsync
캐시 연결 설정이 실패하면 데이터베이스에서 데이터를 직접 가져옵니다. 그러나 요청이 이루어진 후 60초마다 캐시 연결이 다시 시도됩니다. 후속 요청에서는 마지막 요청 후 60초 후에 캐시를 다시 초기화하려고 시도합니다. 연결이 성공적으로 설정될 때마다 캐시에서 데이터를 가져옵니다.
다음 예는 지정된 고객 ID 데이터베이스에서 비동기적으로 가져오고 이를 지정된 캐싱 옵션을 사용하여 캐시에 별도의 엔터티로 저장합니다.
using (var context = new NorthwindContext())
{
var options = new CachingOptions
{
StoreAs = StoreAs.SeperateEntities
};
var task = (from cust in context.Customers
where cust.CustomerId == someCustomerId
select cust).FromCacheAsync(options);
task.Wait();
var resultSet = task.Result.ToList();
}
LoadIntoCacheAsync
다음 예에서는 지정된 캐싱 옵션을 사용하여 데이터베이스의 특정 주문 세부 정보를 별도의 엔터티로 캐시에 로드합니다.
using (var context = new NorthwindContext())
{
var options = new CachingOptions
{
StoreAs = StoreAs.SeperateEntities
};
var task = (from custOrder in context.Orders
where custOrder.Customer.CustomerId == someCustomerId
select custOrder).LoadIntoCacheAsync(options);
task.Wait();
var resultSet = task.Result.ToList();
}
FromCacheOnlyAsync
다음 예에서는 다음과 같은 경우에만 캐시에서만 고객 정보를 가져옵니다. 빠른 실체가 존재합니다. 그렇지 않은 경우 데이터베이스가 무시되므로 반환된 결과 집합은 비어 있게 됩니다.
using (var context = new NorthwindContext())
{
var options = new CachingOptions
{
StoreAs = StoreAs.SeperateEntities
};
var task = (from cust in context.Customers
where cust.CustomerId == someCustomerId
select cust).FromCacheOnlyAsync();
task.Wait();
var resultSet = task.Result.ToList();
}
도 참조
.그물: Alachisoft.NCache.EntityFrameworkCore 네임 스페이스.
.그물: Alachisoft.NCache.런타임.캐싱 네임 스페이스.