[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.당신이 속도를 원하는 경우 레디 스의 구조 또는 '캐시'를 저장할 때, 당신은 가능한 한 많이 준비해야합니다. 당신이 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 도움이되기를 바랍니다
from https://stackoverflow.com/questions/21865045/how-to-store-aggregated-catalog-tree-search-result-in-redis by cc-by-sa and MIT license
'REDIS' 카테고리의 다른 글
[REDIS] 어떻게 파이썬 레디 스에서 플러시 레디 스에 DB합니까? (0) | 2020.01.08 |
---|---|
[REDIS] 태그 캐시와 같은 뭔가 및 레디 스를 사용하여 제안을 위해 그것을 쿼리 (0) | 2020.01.08 |
[REDIS] java.lang.IllegalArgumentException가 :에 의한 (1)을 함유하는 [IsContaining는 포함 함유] 레디 스 질의 도출을 지원하지 않는 경우 - 레디 스 (0) | 2020.01.08 |
[REDIS] 나는 각 연결에 대한 새로운 레디 스 클라이언트를 생성해야 하는가? (0) | 2020.01.08 |
[REDIS] 레디 스는 단일 스레드입니다. 그럼 왜 상추를 사용해야합니까? (0) | 2020.01.08 |