시간이 지남에 따라 애플리케이션 성능을 개선하고 확장성을 제공하는 분산 캐싱이 대중화되고 있습니다. 그리고 빠르고 확장 가능한 방법이 필요하기 때문에 사람들은 점점 더 많은 데이터를 캐시에 캐싱하고 있습니다. 애플리케이션의 성능이 높을수록 클라이언트 애플리케이션의 수도 많아집니다. 그러나 여러 클라이언트가 데이터 소스에 데이터를 배치하고 가져올 때 데이터베이스와 캐시가 동기화되지 않을 가능성이 높습니다. 이 문제를 해결하기 위해 대부분의 사람들은 TTL(Time to Live) 또는 절대 만료. 이 만료는 지정된 시간이 지나면 지정된 캐시 항목을 자동으로 제거합니다. 대중적이기는 하지만 이 메커니즘은 데이터가 캐시에서 변경되지 않고 유지되는 기간에 대한 교육적 추측입니다.
이 기간 동안 데이터가 변경될 가능성이 없다고 확신하거나 데이터가 그다지 민감하지 않은 경우(즉, 캐시에서 오래된 부실 데이터를 읽을 여유가 있는 경우) 다음을 사용할 수 있습니다. 만료. 그러나 데이터가 비즈니스에 민감하고 캐시에서 부정확한 데이터를 읽을 여유가 없다면 오래된 데이터로 인해 많은 비용이 듭니다. 이 상황에서 오래된 데이터에 액세스하는 것은 감수해서는 안 되는 위험입니다.
NCache 세부 정보 데이터 만료 유형 NCache 기술 문서
동기화 중 NCache SQL 서버와 함께
.NET 애플리케이션에서 발생하는 위에 언급된 상황을 피하려면 캐시가 항상 데이터베이스와 동기화 상태를 유지하는지 확인해야 합니다. 그리고 이 정확한 목적을 위해, NCache 라는 데이터베이스 동기화 기능을 제공합니다. SQL 종속성 캐시를 SQL Server 데이터베이스와 동기화된 상태로 유지할 수 있습니다. SQL 종속성은 데이터 세트에서 변경 사항이 발생하는 경우 쿼리 알림을 사용하여 캐시를 데이터베이스와 동기화합니다.
NCache 세부 정보 SQL 종속성 NCache 기술 문서
SQL Server의 쿼리 알림
쿼리 알림은 데이터베이스에서 데이터 집합이 변경될 때 모든 데이터베이스 클라이언트에 알리는 SQL Server의 기능입니다. NCache Server는 이 기능을 사용하여 SQL Server 클라이언트가 되고 SQL 종속성을 통해 SQL Server에 자신을 등록합니다.
이 방법으로 SQL Server는 NCache 데이터베이스에서 특정 데이터가 변경될 때. 그리고 NCache 캐시된 항목과 데이터베이스의 해당 데이터 세트의 매핑을 유지합니다. 이것으로, NCache 캐시된 항목을 무효화할 수 있으므로 다음에 응용 프로그램에서 필요할 때 데이터베이스에서 새 복사본을 가져옵니다.
NCache Client API를 통해 SQL Dependency API를 제공합니다. 단, 캐시된 항목을 추가할 때 이 API를 통해 다음 매개변수를 제공해야 합니다. NCache.
NCache 세부 정보 SQL 종속성 SQL 서버 환경 설정
Sync NCache SQL Server 사용: 간단한 예
수백 명의 클라이언트가 동시에 액세스하는 다양한 검색 가능한 항목이 있는 .NET 기반 온라인 쇼핑 시스템이 있다고 가정해 보겠습니다. 쇼핑 포털은 크리스마스 날 전체 주식에 대해 40% 할인된 가격으로 열립니다. 애플리케이션 서버는 캐시가 이 변경 사항을 인식하지 못하는 동안 데이터베이스에서 제품의 단가를 업데이트합니다.
클라이언트가 캐시에서 항목에 액세스하는 경우 할인 없이 이러한 항목의 이전 복사본을 계속 사용할 수 있습니다. 고객이 제품을 검색하면 기존 크리스마스 단가가 표시되어 고객이 비즈니스에 불만을 느끼고 불만을 갖게 됩니다.
하지만 사용한다면 NCache SQL 서버와의 데이터베이스 동기화 기능을 통해 사용자는 모든 업데이트에 대해 데이터를 데이터베이스와 동기화된 상태로 유지하도록 알림을 활성화할 수 있습니다. 이 경우 캐시에 항상 올바른 데이터가 있으므로 응용 프로그램은 이 데이터 무결성 문제에 직면하지 않습니다.
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 |
// Creating connection string to get connected with database. string connectionString = "Server=SERVERNAME; Database=NORTHWIND; UserId=USERID; Password=PASSWORD;"; // Getting products from database. List products = FetchProductFromDB(); // Creating dictionary of CacheItems. Dictionary<string, CacheItem> cacheItems = new Dictionary<string, CacheItem>(); foreach(Product product in products) { string productKey = $"Product: {product.ProductID}"; // Creating an SQL dependency on the unit price of product. Whenever the Unitprice changes, the product is removed from the cache. string query = $"Select UnitPrice from dbo.Products where ProductID = {product.ProductID}"; // Creating dependency on all the products. SqlCacheDependency dependency = new SqlCacheDependency(connectionString, query); CacheItem productItem = new CacheItem(product); // Adding Dependency to product item productItem.Dependency = dependency; } // Adding CacheItems in cache cache.Add(productKey, productItem); |
를 사용해야 하는 이유 NCache SqlCacheDependency SQL 서버와 데이터를 동기화하는 방법은 간단합니다. 캐시 데이터는 절대 오래되지 않으며 데이터 무결성 문제에 직면하지 않고 모든 종류의 데이터를 자신 있게 넣고 가져올 수 있습니다.
NCache 세부 정보 SqlCacheDependency NCache 기술 문서
ReadThru 공급자를 통한 자동 다시 로드 캐시 항목
캐시된 항목을 무효화하는 대신 데이터베이스에서 해당 데이터가 변경될 때 캐시가 자동으로 다시 로드하도록 하려면 다음을 구현해야 합니다. IReadThruProvider 인터페이스 NCache. 지금, 언제든지 NCache 캐시에서 해당 항목을 제거하는 대신 SQL Server에서 업데이트 알림을 받습니다. NCache ReadThru 공급자를 호출하여 데이터베이스에서 업데이트된 데이터를 가져옵니다.
데이터를 캐시에 삽입하기 전에 다음 코드 줄을 추가하고 NCache 데이터 자동 동기화를 처리합니다.
1 2 3 4 5 6 7 8 9 |
// Create a new cache item and add sql dependency to it CacheItem item = new CacheItem(product); item.Dependency = sqlDependency; // Resync if enabled, will automatically resync cache with SQL server item.ResyncOptions = new ResyncOptions(true); // Add cache item in the cache with SQL Dependency and Resync option enabled cache.Insert(key, item); |
NCache 세부 정보 데이터 소스 제공자 읽기 NCache 기술 문서
SQL 종속성의 매개변수화된 쿼리
데이터베이스에 너무 많은 변경 사항이 있으면 캐시된 항목을 자주 무효화해야 합니다. 각 데이터 무효화에 대해 SELECT 쿼리를 제공해야 합니다. 이는 SQL Server가 이 SQL 쿼리를 실행하기 전에 컴파일해야 함을 의미합니다. 이는 쿼리 컴파일에 매우 오랜 시간이 걸리기 때문에 성능 저하를 초래합니다.
이 성능 문제를 해결하려면 NCache 런타임에 매개변수 값을 지정하는 매개변수화된 SQL 쿼리를 사용할 수 있으며 이러한 값은 실행될 때마다 변경됩니다. 여기에서 SQL 쿼리 자체는 처음 실행 시 컴파일되며 더 이상 재컴파일할 필요가 없으므로 많은 시간이 절약되고 성능이 향상됩니다.
애플리케이션에서 매개변수화된 쿼리를 사용하려면 일반 선택 쿼리를 작성하는 대신 다음 쿼리를 구현합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// Creating Param to be passed in stored procedure dictionary. SqlCmdParams paramProductID = new SqlCmdParams { Type = CmdParamsType.Int, Value = product.ProductID }; // Creating stored procedure params. Dictionary<string, SqlCmdParams> parameter = new Dictionary<string, SqlCmdParams>(); parameters.Add("@ProductID", paramProductID); CacheItem productItem = new CacheItem(product); /*Creating an SQL dependency on the unit price of the product. Whenever the unit price changes, the product is removed from the cache*/ SqlCacheDependency dependency = new SqlCacheDependency(connectionString, query, SqlCommandType.Text, parameters); // Adding Dependency to the product item productItem.Dependency = dependency; cache.Add(productKey, productItem); |
NCache 세부 정보 SqlCacheDependency SqlCacheDependency
저장 프로시저 기반 SQL 종속성
많은 조직에서는 응용 프로그램에서 사용하는 모든 SQL 쿼리를 저장 프로시저 형식으로 데이터베이스 내부에 보관하는 것을 선호합니다. 이렇게 하면 이러한 모든 저장 프로시저가 미리 컴파일되고 동적 SQL 쿼리보다 훨씬 빠르게 실행되기 때문에 성능이 향상됩니다. 둘째, 모든 데이터베이스 액세스 SQL 쿼리를 한 곳에 보관할 수 있으며 SQL 쿼리를 업데이트하려는 경우 수정하기 어려운 각 애플리케이션 내부에 분산되지 않습니다.
이러한 조직의 경우, NCache 는 동적 SQL 쿼리 또는 매개 변수화된 SQL 쿼리를 지정하는 대신 저장 프로시저 호출을 지정할 수 있는 저장 프로시저 기반 SQL 종속성을 지원합니다.
다음 SQL 쿼리는 ProductID를 매개 변수로 사용하여 프로시저를 생성합니다. 이 저장 프로시저는 애플리케이션에서 캐시를 데이터베이스와 동기화하는 데 사용할 수 있습니다.
1 2 3 4 |
create PROCEDURE sp_GetUnitPriceByProductID @ProductID int as Select UnitPrice from dbo.Products where ProductID = @ProductID; |
.NET 애플리케이션에서 이 저장 프로시저를 호출하려면 다음 코드 조각을 사용하십시오.
1 2 3 4 5 6 7 8 9 10 11 |
// Specifying stored procedure, created in database. string spGetUnitPriceByProductID = "sp_GetUnitPriceByProductID"; /*Creating an SQL dependency on the unit price of product. Whenever the unitprice changes, the product is removed from the cache*/ SqlCacheDependency dependency = new SqlCacheDependency(connectionString, spGetUnitPriceByProductID, SqlCommandType.StoredProcedure, parameters); // Adding Dependency to product item productItem.Dependency = dependency; cache.Add(productKey, productItem); |
결론
사용하지 않는 경우 NCache ASP.NET 기반 응용 프로그램의 기본 데이터 원본으로 지금 다음과 같이 사용하십시오.
- NCache 데이터 자동 재조정에 대한 클라이언트 간섭이 필요하지 않은 메모리 내 솔루션으로 애플리케이션을 매우 유연하게 만듭니다.
- 런타임 시 원하는 만큼 서버를 추가할 수 있으므로 .NET 애플리케이션을 위한 가장 확장 가능한 솔루션을 제공합니다.
ASP.NET 응용 프로그램이 있지만 사용 중인 데이터베이스가 알림을 지원하지 않는 경우 NCache 라는 방법을 제공합니다. 폴링 기반 종속성.