NCache, 메모리 내 분산 캐시, 더 빠른 읽기 및 쓰기 작업 경험을 위해 데이터를 임시 저장소에 그대로 유지합니다. 우리는 보았다 NCache 성능과 관련하여 속도로 놀라운 일을하십시오. 캐시 저장소에 대한 작업. 다만, 유지 NCache 기본 데이터 원본과 동기화하는 것은 데이터 일관성과 관련하여 주요 과제입니다. 데이터 소스는 모든 데이터베이스가 될 수 있습니다. 그러나 이 블로그는 캐시를 PostgreSQL과 동기화된 상태로 유지하는 것에 관한 것입니다.
두 개의 별도 데이터 사본 - 과제
애플리케이션의 스택은 다음과 함께 작동합니다. NCache 예를 들어 캐시는 데이터베이스와 애플리케이션 사이에 캐싱 계층으로 상주합니다. 애플리케이션은 캐시에 직접 연결되어 있으므로 읽기 또는 쓰기와 같은 모든 작업 호출을 캐시로 직접 보냅니다. 다른 사용자가 캐시에 알리지 않고 데이터베이스에서 무언가를 변경했다고 가정해 보겠습니다. 이제 데이터베이스의 데이터는 캐시에 있는 데이터와 다릅니다. 두 개의 개별 데이터 사본으로 인해 데이터 불일치가 발생하여 큰 문제가 됩니다.
NCache 세부 정보 NCache 기술 문서 PostgreSQL과 캐시 동기화
NCache 데이터 동기화 유지
데이터 불일치 문제를 감안할 때, NCache 다른 모든 것과 마찬가지로 수정 사항으로 급습합니다. 당신이 해야 할 일은 다음을 사용하여 캐시를 데이터베이스와 동기화하는 것입니다. NCache 데이터베이스 동기화 기법. 앞서 언급한 것처럼 이 블로그에서 논의하는 데이터베이스는 잘 개발된 기능 세트와 높은 성능 및 안정성을 갖춘 오픈 소스 객체 관계형 데이터베이스인 PostgreSQL입니다. 솔루션을 만들어 GitHub에 업로드했습니다. PostgreSQL과 캐시 동기화 캐시가 어떻게 확장성과 데이터 일관성을 향상시킬 수 있는지 보여줍니다.
아래 다이어그램은 NCache PostgreSQL 데이터베이스와 동기화된 데이터를 유지하는 데 도움이 됩니다.
동기화 중 NCache PostgreSQL 데이터베이스 사용
NCache 다음을 사용하여 데이터를 PostgreSQL과 동기화된 상태로 유지할 수 있습니다. 확장 가능한 종속성 알림에서 제공하는 동기화 기술입니다. NCache 캐시와 데이터베이스를 동기화된 상태로 유지합니다. NotifyExtensibleDependency는 PostgreSQL 종속성 알림 시스템을 사용하여 데이터 무효화 기술을 구현하는 데 사용됩니다. PostgreSQL 종속성은 다음과 유사한 LISTEN/NOTIFY 메커니즘을 기반으로 합니다. 게시/구독 모델.
데이터베이스 종속성과 함께 ReadThru공급자 데이터 소스와 직접 통신하기 위해 사용됩니다. NCache 공급자를 호출하여 사용자 지정 논리를 사용하여 데이터 소스에서 직접 데이터를 로드합니다. 이를 통해 데이터를 동기화하고 최신 상태로 유지하여 오래된 데이터와 같은 문제를 방지하고 향상된 확장성과 더 빠른 읽기 작업을 제공합니다.
따라서 관련된 기본 구성 요소는 다음과 같습니다.
-
- NotifyExtensibleDependency: NCache NotifyExtensibleDependency 내에서 LISTEN을 호출하여 특정 채널에 등록합니다.
Initialize
방법. 데이터베이스에서 페이로드를 채널로 보내는 TRIGGER 함수가 호출되고 청취 시 데이터 불일치의 경우 데이터가 캐시에서 제거됩니다. - ReadThruProvider: 이 공급자는 데이터베이스에서 데이터 수정 시 데이터베이스에서 직접 업데이트된 데이터를 자동으로 가져옵니다.
- NotifyExtensibleDependency: NCache NotifyExtensibleDependency 내에서 LISTEN을 호출하여 특정 채널에 등록합니다.
NotifyExtensibleDependency를 사용하여 캐시 동기화
확장 가능한 종속성 알림 모델에서 작동하는 PostgreSQL 종속성 메커니즘을 사용하여 데이터를 무효화하는 데 사용됩니다. 게시/구독 메시징 모델은 Listen/Notify라고 합니다. 이 메커니즘에 따르면 데이터베이스의 모든 업데이트는 정보가 포함된 추가 페이로드와 함께 NOTIFY 명령을 통해 특정 채널에서 수신하는 클라이언트로 전달됩니다. 특정 사례의 클라이언트는 다음과 같습니다. NCache 데이터베이스의 변경 사항에 대한 알림을 받으면 해당 항목이 캐시에서 제거됩니다.
PostgreSQL 종속성으로 항목이 추가되는 방법을 보려면 아래 코드를 살펴보겠습니다.
1 2 3 4 5 6 7 8 9 10 11 |
const string connectionString = "your-connection-string"; var customer = new Customer(); var cacheItem = new CacheItem(customer) { Dependency = new PostGreSQLDependency(connectionString, customer.customerid, "public", "customers", "customer_channel") }; var key = customer.customerid; var cache = CacheManager.GetCache("democache"); cache.Insert(key, cacheItem); |
그러나 구현을 이해해야 합니다. PostgreSQLDependency
아래 코드가 도움이 될 것입니다. 그만큼 Initialize
메서드에는 데이터베이스에 연결하기 위한 연결 문자열이 포함되어 있으며 특정 데이터의 데이터 수정 시 알림을 등록합니다.
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 33 34 35 36 37 38 39 |
public PostGreSQLDependency(string connectionString, string dependencyKey, string schema, string table, string channel) { _connectionString = connectionString.Trim(); _dependencyKey = dependencyKey.Trim(); _schema = schema.Trim(); _table = table.Trim(); _channel = channel.Trim(); } public override bool Initialize() { connection = new NpgsqlConnection(_connectionString); connection.Open(); ((NpgsqlConnection)connection).Notification += (o, e) => { var entity = JsonConvert.DeserializeObject(e.AdditionalInformation); if (entity.DependencyKey == _dependencyKey && entity.Table == _table && entity.Schema == _schema) { done = true; } }; using (var cmd = new NpgsqlCommand($"LISTEN {_channel};", (NpgsqlConnection)connection)) { cmd.ExecuteNonQuery(); } task = Task.Run(() => { while (true) { ((NpgsqlConnection)connection).Wait(); if (done) { break; } } this.DependencyChanged.Invoke(this); }); return true; } |
NCache 세부 정보 NCache 기술 문서 PostgreSQL과 캐시 동기화
Read-Through를 사용하여 데이터 자동 다시 로드
종속성을 사용하면 데이터 소스에서 데이터가 수정될 때마다 캐시에서 지워집니다. 그러나 여전히 해당 데이터를 캐시에 다시 로드해야 합니다. NCache 라는 기능이 있습니다 백업 소스. 우리는 Read-Through 공급자에게 구현에 사용자 지정 논리를 추가할 수 있는 자유를 제공합니다. 지정된 경우 Read-Through 공급자는 PostgreSQL 데이터베이스에서 데이터를 로드합니다. 당신은 필요 Read-Through 공급자 구성 전에 관리 도구를 사용하여.
읽기 제공자에서 재동기화 옵션을 사용하면 데이터를 데이터베이스와 동기화 상태로 유지할 수 있습니다. 그러나 내부 ProviderCacheItem
, CacheItem에는 종속성이 추가되어 캐시에 추가된 새 항목이 이미 추가된 종속성과 함께 제공됨을 의미합니다. 계속해서 종속성을 추가하는 수고를 덜 수 있습니다. 를보세요 LoadFromSource
구현을 보기 위한 Read-Through 제공자 내부의 메소드:
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 |
public ProviderCacheItem LoadFromSource(string key) { var query = $"SELECT customerid, address, country, city FROM customers WHERE customerid = '{key}'"; // Define a query returning a single row result set NpgsqlCommand command = new NpgsqlCommand(query, _connection as NpgsqlConnection); var reader = command.ExecuteReader(); ProviderCacheItem providerCacheItem = null; while (reader.Read()) { if (providerCacheItem == null) { var customer = new Customer() { customerid = reader[0] as string, address = reader[1] as string, country = reader[2] as string, city = reader[3] as string, }; providerCacheItem = new ProviderCacheItem(customer) { Dependency = new PostGreSQLDependency(_connectionString, customer.customerid, "public", "customers", "customer_channel"), ResyncOptions = new ResyncOptions(true) }; } } } |
지금 읽기 기능이 있는 항목을 추가하면 다음을 사용하여 수정된 항목을 캐시에 직접 로드하기만 하면 됩니다. 데이터베이스 종속성. 따라서 캐시는 PostgreSQL 데이터베이스와 동기화 상태를 유지하고 모든 오래된 데이터 문제는 사라집니다.
결론
간단하게 블로그에 모든 것을 담으려면 캐시와 데이터베이스가 서로 동기화된 상태를 유지해야 합니다. 캐시가 데이터베이스에서 수행되는 수정 사항을 인식하지 못하는 경우 애플리케이션은 계속 작동하고 오래된 캐시 데이터로 작업할 수 있습니다. 이 문제는 매우 효율적으로 해결됩니다. NCache PostgreSQL 종속성 기능. 단순히 이동하여 볼 수 있는 다른 멋진 기능이 많이 있습니다. NCache 웹 사이트.