2014-09-05 3 views
0

나는 약 500 항목의 정적 개체 목록을 가지고 있습니다.Redis Cache 필터로 정적 목록 검색

이 개체는 (id [int], Name [string], attribute1 [string], attribute2 [string])과 같은 속성을가집니다.

이 개체를 문자열로 serialize하고문자열 키 값으로 redis에 저장했습니다. 그러나 나는이 목록을 필터링하려면 다른 속성을 사용하는 사용자 검색 필터를 기반으로 하위 집합을 사용자에게 제공해야합니다.

두 가지 방법으로이 목록을 테이블 및 색인에 추가하고 sql을 사용하여 검색 필터를 적용 할 수 있습니다. 다른 내가이 때마다 redis 에서이 목록을 당겨 및 개체 목록에 역 직렬화하고 linq를 사용하여 필터를 적용합니다. 나는 다른 서버에 redis를 가지고 있으므로 DB도 있고 각 웹 서버에도 캐시의 복사본을 갖고 싶지 않습니다.

그래서 최상의 성능을 얻으려면 어떻게해야합니까? 또는 거기에 더 많은 것을하는 다른 방법 더 빠를?

답변

1

(SQL을 사용하거나 클라이언트에서 역 직렬화 및 필터링을 사용하여) 나열한 두 가지 방법 대신 본질적으로 Redis 인덱스 인 약간 다른 방법을 제안하고자합니다.

아이디어는 매우 간단합니다. 개체의 키 이름이 obj1, obj2 ... objn이고 해당 attribute1의 값이 val1, val2 ... valm 인 경우 attribute1의 각 값 x에 대해 키가있는 Redis 세트가 만들어집니다 이름은 attribute1:valx:index입니다. 세트의 구성원은 attribute1 = valx를 갖는 오브젝트의 키 이름입니다.

  • 당신이 valx의 속성 1의 값을 가지는 objy을 만들

    이는 attribute1:valx:index 키에 objy를 추가 :이 있는지 확인 일어날 수 있도록합니다.
  • objy의 attribute1을 valx에서 valz로 업데이트 할 때 attribute1:valx:index에서 objy을 제거하고 attribute1:valz:index에 추가하십시오.
  • attribute1 = valx 인 objy를 삭제하면 attribute1:valx:index에서 objy을 제거하십시오.
  • 선택적으로 위의 내용은 앱에서 중요한 경우 원자 적으로 (즉, Lua 또는 WATCH/MULTI/EXEC 블록을 사용하여) 발생해야합니다.

이러한 점은 색인을 유지 관리하는 데 필요합니다. 색인을 사용하려면 attribute1 = valx로 필터링 된 개체를 찾을 때 attribute1:valx:index 집합의 멤버 (예 : SMEMBERS)를 가져온 다음 키 이름 (예 : objy)을 통해 실제 개체를 가져 와서 수행합니다. 또는 SORT .. GET (예 : SORT attribute1:valx:index GET obj*)을 사용하면 한 명령 만 사용하여 다른 작업을 수행 할 수 있습니다.

속성 2에 대해서도 같은 작업을 반복하십시오. 몇 가지 추가 점 :

  • 직렬화 오버 헤드를 줄이고 Redis에서 값을 쉽게 조작 할 수 있도록 개체 (예 : HSET objy attribute1 valx)를 저장하는 Redis 해시를 살펴보십시오.
  • 위에서 설명한 간단한 색인을 훨씬 더 많이 사용할 수 있습니다.보다 복잡한 필터링 옵션을 사용하려면 SUNION, SDIFF & SINTER와 같은 집합 연산을 사용하는 것이 좋습니다.