2014-11-23 3 views
1

저는 C# ASP.Net 웹 응용 프로그램을 Azure (현재는 전용 서버 1 대에 호스팅 됨)로 이동하는 계획을 세우고 있으며 캐싱 옵션을보고 있습니다. 현재 우리는 한 번에 하나의 응용 프로그램 인스턴스 만 실행하기 때문에 SQL DB에서 동일한 요청을 처리하기 위해 '프로세스 내'메모리 캐시가 있습니다.Redis의 Azure 캐시/DataCache 스타일 영역

현재 프로세스는 관리자/서비스가 데이터베이스의 해당 부분을 변경하면 캐시의 특정 부분을 지우는 것입니다. 우리는 사용자 테이블을 가지고 있으며 우리는 "User. {0}"과 같은 단일 사용자 레코드/객체를 반환하고 "Users.ForeignKey. {0}"은 외래 키와 관련된 모든 사용자를 반환합니다. 단일 사용자 레코드를 업데이트하면 "User.1"키 (userid = 1 인 경우)가 제거되고 모든 목록 모음이 변경 될 수 있으므로 쉽게 제거 할 수 있습니다. 우리는 패턴을 기준으로 키를 제거함으로써이 작업을 수행합니다. 즉, 영향을받는 키만 제거되고 다른 모든 키는 유지됩니다.

우리는 지금 Azure 로의 이행을 잠시 동안 계획 해 왔으며 처음에는 Azure Redis Cache 서비스를 사용할 수 없었습니다. 최소한 지원 했으므로 Azure Cache 서비스를 살펴 보았습니다. AppFabric. 이를 사용하여 DataCache 영역을 사용하여 서로 다른 객체 유형을 구분 한 다음 영향을받은 영역을 플러시합니다. 현재 방법과 동일하지는 않지만 OK입니다. 자, 레디 스가 현장에 왔기 때문에, 우리는 그것을보고 있었고 가능한 경우 그것을 사용하는 것을 선호했습니다. 그러나 같은 결과를 얻으려면 각 '지역'/ 섹션별로 별도의 Redis 캐시가 있어야합니다. Azure에서 Redis 캐시 서비스의 작은 인스턴스에 대해 많은 비용을 지불한다는 것을 이해할 수 있습니다. 캐시에 별도로 플러시 가능 섹션을 10 개 이상 필요로한다는 점을 감안할 때 상당한 비용이 듭니다.

누구나 Redis에서 Azure DataCache Regions과 유사한 것을 달성하는 방법을 알고 있거나 분명치 않다고 눈에 띄게 분명하게 제시 할 수 있습니까?

그런 긴 질문/설명에 대해 유감스럽게 생각하지만 배경/컨텍스트없이 달성하려는 것을 설명하기가 어렵다는 것을 알게되었습니다.

감사합니다, 가레스

업데이트 :이 '열쇠'명령 here와 루아를 사용하여 포함, 패턴으로 키를 삭제하는 작업을 할 수있는 몇 bash는 명령을 발견했습니다

스크립트 EVAL 명령 here.

상호 작용하기 위해 StackExchange.Redis 클라이언트를 사용할 계획입니다. StackExchange.Redis를 사용할 때 이러한 유형의 명령이나 다른 방법 (패턴별로 키를 삭제하는 방법)을 사용하는 방법을 알고 있습니까? 읽기

감사합니다, 가레스

내가 그 기준에 관한 기록이 변경 될 때마다 있도록, 몇 가지 기준 (귀하의 경우 사용자)에 따라 데이터 그룹의 모든 필요 질문으로 이해하는 것을 들어

답변

8

당신은 당신과 같이 사용할 수 있습니다 그리고 stack exchange redis client

private static Task DeleteKeysByPatternAsync(string pattern) 
{ 
    IDatabase cache1 = Connection.GetDatabase(); 
    var redisServer1 = Connection.GetServer(Connection.GetEndPoints().First()); 
    var deleteTasks = new List<Task>(); 
    var counter = 0; 
    foreach (var key in redisServer1.Keys(pattern: pattern, database: 0, pageSize: 5000)) 
    { 
     deleteTasks.Add(cache1.KeyDeleteAsync(key)); 
     counter++; 
     if (counter % 1000 == 0) 
      Console.WriteLine($"Delete key tasks created: {counter}"); 
    } 
    return Task.WhenAll(deleteTasks); 
} 

를 사용 패턴에 의해 키를 삭제하는 비동기가/기능을 기다리고 및 redis pipelining 활용이 방법을 사용할 수 있습니다 :

DeleteKeysByPatternAsync("*user:*").Wait(); //If you are calling from main method for example where you cant use await. 

또는

await DeleteKeysByPatternAsync("*user:*"); //If you run from async method 

페이지 크기를 조정하거나 메소드로 수신 할 수 있습니다. 엠.

0

해당 레코드와 관련된 데이터도 단일 캐시 api 호출을 사용하여 캐시에서 무효화됩니다.

azure에서 NCache for Azure을 사용하여 azure에 대한 분산 캐싱 솔루션을 Alachisoft으로 만들 수 있습니다. 여기에는 여러 캐싱 토폴로지와 다양한 기능이 있습니다.

NCache은 이러한 유형의 작업을 여러 가지 방법으로 수행 할 수 있습니다. 사용 사례에 적합한 하나는 데이터 그룹핑 기능으로 그룹/하위 그룹의 데이터를 추가로 그룹화 할 수 있습니다. 데이터는 나중에 그룹/하위 그룹을 기반으로 가져 오거나 제거 할 수 있습니다.

NCache는 항목이 추가 된 태그를 추가 할 수도 있습니다. 이 태그는 하나 이상의 지정된 태그를 포함하는 모든 데이터를 제거/가져 오는 데 사용할 수 있습니다. NCache에서 제공되는 쿼리 기능 (쿼리 삭제)을 사용하여 특정 조건을 만족하는 데이터를 제거 할 수도 있습니다.

+0

답장을 보내 주셔서 감사합니다. 조사해 보겠습니다. –