복붙노트

[REDIS] 스택 오버플로, 레디 스 및 캐시 무효화

REDIS

스택 오버플로, 레디 스 및 캐시 무효화

이제 스택 오버플로가 레디 스를 사용하는, 그들은 같은 방식으로 무효화 캐시를 처리하나요? 쿼리 문자열 + 이름으로 해시 정체성 즉 목록 (내가 이름을 추측 목적이나 오브젝트 이름의 일종이다).

아마도 그들은 다음 (데이터베이스 인덱스의 무리를 우회하여보다 효율적인 클러스터 된 인덱스 대신 아마도 사용) ID로 직접 캐시에서 누락 된 개별 항목을 검색 할 수 있습니다. 즉 스마트 (제프 언급하는 재수?)이 될 것입니다.

지금, 나는 간결한 방법으로이 모든 피벗 할 수있는 방법을 찾기 위해 사투를 벌인거야. 내가 전에 첫 번째 컷 자신을하고 내 생각을 명확히하는 데 사용할 수 있다는 것은 이런 종류의 사례가 있습니까?

컷오프는 .NET 캐시 (System.Runtime.Caching 또는 System.Web.Caching)를 사용하고 외출 레디 스를 사용하는 사이입니다 또한, 궁금하네요. 또는 아래로 빠르게 레디 스 단지 손인가?

다음은 2009 년 원래의 SO 질문입니다 :

https://meta.stackexchange.com/questions/6435/how-does-stackoverflow-handle-cache-invalidation

다른 링크의 몇 :

https://meta.stackexchange.com/questions/69164/does-stackoverflow-use-caching-and-if-so-how/69172#69172

https://meta.stackexchange.com/questions/110320/stack-overflow-db-performance-and-redis-cache

해결법

  1. ==============================

    1.솔직히 이것은 SO 질문 또는 MSO의 질문은 여부를 결정하지만, 할 수 없습니다

    솔직히 이것은 SO 질문 또는 MSO의 질문은 여부를 결정하지만, 할 수 없습니다

    다른 시스템으로 떨어져가는 것은 결코 빠른 (한이 키가 될 때) 로컬 메모리를 쿼리보다 없다 간단한 대답 : 우리는 모두 사용! 우리는 그래서 사용 :

    이 후, 당신이 말한대로, 캐시 무효화의 문제로 인해 - 실제로는 대부분의 장소에서 중요하지 않지만. 그러나 이것은을 위해 - 의미 - 이벤트 (술집 / 하위)가 자신의 로컬 복사본을 놓을 수 있도록, 모든 노드로 변경되어 방송 키에 쉬운 방법을 허용 레디 스 :이 필요한 다음에 우리는 레디 스의 새 복사본을 데리러 갈게을 . 따라서 우리는 하나의 이벤트 채널 이름에 대해 변경하는 키 이름을 방송.

    도구 : 우분투 서버 레디 스; 레디 스 래퍼로 BookSleeve; protobuf - 그물 GZipStream 데이터를 포장하기위한 (/ 자동으로 크기에 따라 사용 안 함).

    그래서 다음은 술집 / 서브 이벤트 (변경 상태를 알고있는 한) 바로 (거의) 모든 노드에 하나 개의 노드에서 주어진 키에 대한 캐시를 무효화하는 데 사용되는 레디 스.

    아니, 우리는 그렇게하지 않습니다 별개의 프로세스와 관련하여 (주석에서, "? 당신은 동일한 데이터를 공급하는 여러 별개의 프로세스에 대한 공유 메모리 모델의 어떤 종류를 사용하지 않음"). 각 웹 계층 상자는 정말 그렇게 같은 프로세스 내에서 우리는 70 개 사이트가있을 수 있습니다, 그 내에서 멀티 테넌시 (multi-tenancy)와, 하나 개의 프로세스를 (특정 계층의) 호스팅. 레거시 이유로 우리는 주로 키의 일부로 사이트의 정체성과 HTTP 캐시를 사용 (즉, "그것은 작동 및 고정이 필요하지 않습니다").

    시스템의 몇 대규모 데이터 집약적 인 부분을 위해, 우리는 디스크에 유지하는 메커니즘을 가지고 있으므로 메모리 모델은 웹 자연스럽게 재활용으로 연속 앱 도메인 사이에서 전달 (또는 재 배포),하지만은 될 수 레디 스 관련이없는.

    다음은 관련 예제가 있음을 나타냅니다 만의 다양한 맛 방법이 힘 작업 - 스핀 다음의 인스턴스의 수까지, 다음에 어떤 키 이름을 입력 :

    static class Program
    {
        static void Main()
        {
            const string channelInvalidate = "cache/invalidate";
            using(var pub = new RedisConnection("127.0.0.1"))
            using(var sub = new RedisSubscriberConnection("127.0.0.1"))
            {
                pub.Open();
                sub.Open();
    
                sub.Subscribe(channelInvalidate, (channel, data) =>
                {
                    string key = Encoding.UTF8.GetString(data);
                    Console.WriteLine("Invalidated {0}", key);
                });
                Console.WriteLine(
                        "Enter a key to invalidate, or an empty line to exit");
                string line;
                do
                {
                    line = Console.ReadLine();
                    if(!string.IsNullOrEmpty(line))
                    {
                        pub.Publish(channelInvalidate, line);
                    }
                } while (!string.IsNullOrEmpty(line));
            }
        }
    }
    

    당신이 볼 수하면 키와 이름을 입력 할 때, 그것은 그 키의 로컬 복사본을 덤프하는 모든 실행중인 인스턴스에 바로 표시되어 있는지입니다. 물론 실제 사용하고있는 두 개의 연결이 그렇게 문을 사용하여하지 않을 것이다, 어딘가에 넣어 개방 유지해야합니다. 우리는이에 대해 거의-A-싱글을 사용합니다.

  2. from https://stackoverflow.com/questions/9596877/stack-overflow-redis-and-cache-invalidation by cc-by-sa and MIT license