복붙노트

[REDIS] 레디 스 캐시에 데이터의 계층 구조 (트리)의 일부를 무효화하는 방법

REDIS

레디 스 캐시에 데이터의 계층 구조 (트리)의 일부를 무효화하는 방법

나는 내가 레디 스 캐시에 여러 버전을 저장해야하는 몇 가지 제품 데이터를 가지고있다. 데이터는 JSON 직렬화 객체로 구성되어 있습니다. 일반 (기본) 데이터를 획득하는 과정은 비싸고, 나는 가능한 최적화에 모든 버전을 캐시하고 싶습니다 그래서 다른 버전으로 사용자 정의하는 과정도 비싸다. 데이터 구조는 다음과 같은 :

                                    BaseProduct
                                         /\
                                      /      \
                                   /            \
                                /                  \
                             /                        \
           CustomisedProductA                          CustomisedProductB
                  /  \                                       /  \
CustomisedProductA1  CustomisedProductA2   CustomisedProductB1  CustomisedProductB2

여기에 일반적인 생각입니다 :

데이터는 데이터 복구 / 계산 과정의 각 단계는 고가이기 때문에이 방식으로 저장된다. 특정 제품은 지역 검색된다 처음 영역 특정 제품 안으로 들어가 수행 사용자 정의한 한 세트가 될 것이다. 특정 제품이 저장소에 대해 검색됩니다 처음, 나는 가게 - 특정 제품을 생성하기 위해 지역 제품에 따라 사용자 정의한을 수행해야합니다.

문제는 내가 몇 가지 방법으로 무효화 데이터를해야 할 수도 있다는 사실 때문에 온다 :

내 질문은 그러므로 : 트리의 부분의 무효를 가능하게하고있는 동안 여러 수준의 데이터를 저장하는 성능을 수 있도록, 다중 레벨 데이터 구조의 유형을 표현하는 방법은 무엇입니까? 또는, 나는 그 사이에 전체 트리 (DEL 키) 또는 특정 노드 (HDEL 키 필드)만을 만료 제한입니까?

해결법

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

    1.그 일을 위해 적어도 3 가지 방법은 각각 자신의 장점과 단점을 가지고있다.

    그 일을 위해 적어도 3 가지 방법은 각각 자신의 장점과 단점을 가지고있다.

    첫 번째 방법은 파악하고 무효화 (삭제) 트리의 2 수준 (사용자 지정 1 세트)하는 나무의 비 원자 임시 스캔을 사용하는 것입니다. 이를 위해 HSCAN를 사용하여를 통해 hierarichal 명명하여 해시의 필드의 방식과 반복 처리를 사용합니다. 첫 번째 정의의 첫 번째 버전에 대한 필드 이름으로 '0001 : 0002'의 두 번째 버전과 : 예를 들어, 해시의 키 이름은 제품의 ID (예 : ProductA), 당신은 '0001 0001'같은 것을 사용하는 것입니다 가정 등. 마찬가지로, '0002 : 0001'등 ... 그런 다음, 사용자 정의 (42)의 모든 버전을 찾을 수 있습니까, 2 정의 1 버전이 될 것입니다, 사용 HSCAN ProductA 0 MATCH 0042 : *, 커서까지 HDEL하여 응답 필드, 반복 제로.

    당신이 해시의 전체 검사를 수행하는 효율적 대신을 가져올 수 있도록 반대의 접근 방식은 각 사용자 정의의 버전 사전 "인덱스"이다. 그것에 대해 이동하는 방법은 레디 스 '설정을 사용 - 당신은 특정 제품 버전에 대한 모든 필드 이름과 설정을 유지합니다. 버전 중 하나 (내 예에서와 같이) 또는 그들이 고유 같이 아무것도 순차적 될 수 있습니다. 비용은 이러한 인덱스를 유지하고있다 - 추가하거나 제품의 정의 및 / 또는 버전을 제거 할 때마다, 당신은 이러한 설정과 일관성을 유지해야합니다. 예를 들어, 버전의 생성 뭔가를 같이 할 것입니다 :

    HSET ProductA 0001:0001 "<customization 1 version 1 JSON payload"
    SADD ProductA:0001 0001
    

    참고이 두 작업은 단일 트랜잭션 (즉 멀티 \ EXEC 블록 또는 EVAL 루아 스크립트를 사용)에해야한다고. 이 설정을해야하는 경우, 사용자 지정을 무효화하는 것은 관련 설정에 SMEMBERS를 호출하고 해시 (및 설정뿐만 아니라 자체)에서의 버전을 삭제의 문제이다. 그것은 큰 세트에서 모든 구성원을 읽는 것은 시간 낭비가 될 수 있다는 점에 유의해야합니다 - 1K 회원 sscan을 거기에 나쁜,하지만 더 큰 설정을위한 것입니다.

    마지막으로, 당신은 소트 세트 대신 해시를 사용하여 고려할 수 있습니다. 이 사용 사례에서 아마도 덜 직관적 인 반면, 소트 세트는 당신이 필요로하는 모든 작업을 수행 할 수 있습니다. 그것을 사용의 가격은, 그러나, 그 차이가 중요하지 않습니다 숫자 / 추가 / 제거 해시의 O (1)에 비해 읽기,하지만 주어진에 대한 O (logN)의 복잡성이 증가합니다.

    정렬 된 세트의 모든 멤버가 같은 점수 (예를 들어, 사용 0)이 있어야 있도록 소트 세트의 힘을 발휘하려면 사전 편찬 순서를 사용합니다. 각 제품은 단지 해시와 같은 정렬 설정으로 표시됩니다. 설정의 구성원은 해시의 필드, 즉 사용자 정의 '버전의 등가물이다. 은 "트릭은"당신이 범위 검색 (또는 레벨이 무효화 만약에 당신을) 수행 할 수있는 방법으로 구성원을 건설하고있다. 여기가 같이하는 방법의 예 (주 키 ProductA이 해시하지만 정렬 설정되지 여기에)입니다 :

    ZADD ProductA 0 0001:0001:<JSON>
    

    0001 : [0001 : 0001 : 사용자 지정 버전을 읽으려면 ZRANGEBYLEX ProductA [0001을 사용하여 \ XFF 및 응답에서 JSON을 분할하고 전체 사용자 정의, 사용 ZREMRANGEBYLEX을 제거 할 수 있습니다.

  2. from https://stackoverflow.com/questions/36743354/how-to-invalidate-parts-of-a-hierarchy-tree-of-data-in-redis-cache by cc-by-sa and MIT license