복붙노트

[REDIS] 어떻게 레디 스에서 집계 된 카탈로그 트리 검색 결과를 저장

REDIS

어떻게 레디 스에서 집계 된 카탈로그 트리 검색 결과를 저장

나는 현재 ~ 36,000 범주와 ~를 포함하는 큰 제품 카탈로그 트리가 1 개 milion 제품 (즉 잎). 그것은 (최대 깊이 5)과 같이 구성된다 :

Cat1
|_Cat11
| |_Cat111
| | |_Cat1111
| | | |_Product1
| | | |_...
| | |_Cat1112
| | | |_Product1
| | | |_...
| | |_Cat1113
| | | |_Product1
| | | |_...
| |_Cat112
|   |_Cat1121
|   | |_Product1
|   | |_...
|   |_Cat1122
|   | |_Product1
|   | |_...
|   |_Cat1123
|     |_Product1
|     |_...
|_Cat12
| |_Cat121
| | |_Cat1211
| | |_Cat1212
| | |_Cat1213
| |_Cat122
|   |_Cat1221
|   |_Cat1222
|   |_Cat1223
|_...
Cat2
|...

(SQL 서버 FREETEXT 검색을 사용)이 카탈로그를 검색 할 때 내가 범주와 제품의 무리를 얻을 매우 빠르게 백업 할 수 있습니다. 일부 검색은 매우 많은 제품에 안타를 얻을. 나는 결과가 집계 현재 전개 각 카테고리 히트 총 제시하고자합니다. (다른 수준에서 2 예)이 같이 :

**Ex1 (first level)**
Cat1(563)
|
Cat2(332)
|
Cat8(2)

**Ex2 (second level)**
Cat1
|_Cat12(102)
|_Cat14(201)
|_...

내가 지금까지 시도하는 것은 (세트로 저장) 레디 스의 모든 부모 / 자식 관계를 저장하는 것입니다. 그럼 간단하게 트래버스 제품에서 (오히려 또는 그 직계 자녀)의 현재 확장 범주에 부모님 최대를 통해 (검색 결과에서)을 찾을 수있는 집계 결과를 얻기 위해 현재에있는 범주과 일치하는 아래 제품의 수를 계산하는 방법 검색. 나는 검색 결과에서 약 5000 제품이있는 경우 다음이 20초 정도 걸립니다. 롱 웨이.

이 작업을 수행 할 수있는 더 좋은 방법이 무엇이 whould? 한 가지 방법은 이미 각 카테고리에서 집계 모두 100 만 개 제품을 가지고하는 것입니다하지만 36,000,000 키를 필요로하고 아마 많은 RAM을 필요로한다. 나는 현재 이미이 500MB를 사용합니다.

해결법

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

    1.당신이 속도를 원하는 경우 레디 스의 구조 또는 '캐시'를 저장할 때, 당신은 가능한 한 많이 준비해야합니다. 당신이 HSET에 제품을 저장하고,이 HSET에서 '제품 데이터'멤버와 함께 범주 카운터 (catagory 당 하나)를 추가하면, 당신은 HINCRBY에이 증가 / 감소 카운터를 사용할 수 있습니다.

    당신이 속도를 원하는 경우 레디 스의 구조 또는 '캐시'를 저장할 때, 당신은 가능한 한 많이 준비해야합니다. 당신이 HSET에 제품을 저장하고,이 HSET에서 '제품 데이터'멤버와 함께 범주 카운터 (catagory 당 하나)를 추가하면, 당신은 HINCRBY에이 증가 / 감소 카운터를 사용할 수 있습니다.

    일반적으로 (당신의 필요를위한 레디 스 캐시를 설계) : 당신이 필요로하지 않는 데이터를 검색하는 것을 방지하기 위해 시도해야합니다.

    나는 (/ 업데이트가 / 삭제)를 저장뿐만 아니라 수집 된 보고서를 검색하기위한 루아 스크립트를 사용하는 것이 좋습니다. 루아 스크립트는 레디 스 서버에서 실행됩니다. ServiceStack 그들 (SCRIPT의 LOAD + EVALSHA하거나 EVAL)를 지원하고, 당신은 또한 BookSleeve C # 클라이언트 모듈 시도해 볼 수도 있습니다 (우리가 사용하고 조금 빠른 '속도'. 좋은 레디 스 - 데이터 설계가 처음 당연히 온다). BookSleeve C #을 클라이언트는 대규모 데이터 세트를 처리 할 때 당신이 원하는 아마 인, 멀티 스레드 레디 스 파이프 라인에 초점을 맞추고 있습니다. 파이프 라인뿐만 아니라 ServiceStack 가능해야한다.

    범주 및 제품은 정수 ID가있는 경우, 당신은 또한 당신이 점수 필드로 ID를 사용할 수있는 ZSET, 이것을 결합 할 수 있습니다. ZRANGEBYSCORE하면 직접 '기록'을 얻을 수 있습니다. 귀하의 ID의 15 자리 숫자를 사용하여 이하와 '점수'의 소수 부분을 사용하지 않는대로이 기술은만큼 안전합니다. ID가 범위를 유지하기 위해 -999999999999999 999999999999999. 참고가 그래서 : 레디 스 서버가 실제로 내부적으로 레디 스 - 문자열 표현으로 점수 (플로트)를 저장하기 때문에 이러한 제한이 존재한다.

    이, TW 도움이되기를 바랍니다

  2. from https://stackoverflow.com/questions/21865045/how-to-store-aggregated-catalog-tree-search-result-in-redis by cc-by-sa and MIT license