복붙노트

[REDIS] 레디 스 - 소트 세트는, 속성 값으로 항목을 찾을 수 있습니다

REDIS

레디 스 - 소트 세트는, 속성 값으로 항목을 찾을 수 있습니다

레디 스에서 나는 정렬 된 세트에서 객체를 저장합니다. 내 솔루션에서, 내가 점수가 예를 들어 각 항목의 타임 스탬프, 인으로 항목을 저장할 수 있도록 날짜에 의해 원거리 쿼리를 실행할 수 있도록 중요합니다 :

#   Score   Value
0   1443476076  {"Id":"92","Ref":"7ADT","DTime":1443476076,"ATime":1443901554,"ExTime":0,"SPName":"7ADT33CFSAU6","StPName":"7ADT33CFSAU6"}
1   1443482969  {"Id":"11","Ref":"DAJT","DTime":1443482969,"ATime":1443901326,"ExTime":0,"SPName":"DAJTJTT4T02O","StPName":"DAJTJTT4T02O"}

그러나 다른 상황에서 나는 그것의 ID에 따라 세트의 단일 항목을 찾을 필요가있다. 나는 그것이없는 NoSQL DB 것처럼 난 그냥이 데이터 구조를 쿼리 할 수 ​​없습니다 알고,하지만 난 작동하지 않았다 ZSCAN를 사용했습니다.

ZSCAN MySet 0 MATCH Id:92 count 1

그것은 반환 "빈 목록 또는 세트"

어쩌면 내가 다른 직렬화해야합니까? 나는 Json.Net를 사용하여 직렬화있다.

어떻게, 가능하면, 내가 이것을 달성 할 수있다; 점수로 날짜를 사용하고 아직도의 ID로 항목을 조회 할 수?

많은 감사합니다,

라스

편집하다:

그것이 불가능하지만, 어떤 생각이나 입력을 환영합니다 가정 :

참조 : http://openmymind.net/2011/11/8/Redis-Zero-To-Master-In-30-Minutes-Part-1/

편집 2 :

내가하려고 노력 :

ZSCAN MySet 0 MATCH *87*

127.0.0.1:6379> ZSCAN MySet 0 MATCH *87*
1) "192"
2) 1) "{\"Id\":\"64\",\"Ref\":\"XQH4\",\"DTime\":1443837798,\"ATime\":1444187707,\"ExTime\":0,\"SPName\":\"XQH4BPGW47FM\",\"StPName\":\"XQH4BPGW47FM\"}"
   2) "1443837798"
   3) "{\"Id\":\"87\",\"Ref\":\"5CY6\",\"DTime\":1443519199,\"ATime\":1444172326,\"ExTime\":0,\"SPName\":\"5CY6DHP23RXB\",\"StPName\":\"5CY6DHP23RXB\"}"
   4) "1443519199"

그리고 원하는 항목을 발견뿐만 아니라 속성 ATIME 87의 occurance 또 다른 하나를 발견한다. 더 독특한 데, 더 이상 ID는이 방식으로 작동 할 수와 나는 그것의 속성에 정확한 값으로 하나를 찾기 위해 코드의 결과를 필터링해야합니다.

아직 제안을 엽니 다.

해결법

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

    1.나는 그것이 매우 간단합니다 생각합니다.

    나는 그것이 매우 간단합니다 생각합니다.

    ZSCAN 요소인지 0 MATCH 아이디의 길 : 저장된 문자열이 "{\"ID \ 있기 때문에 92 횟수 1 작동하지 않았다 ": \"92 \ "... 없습니다"{\ "ID : 92 \".. .. 문자열이 다른 포맷으로 변화되어왔다. 그래서 MATCH 아이디 \를 사용하려고 ": \"그런 64 것을 레디 스에서 JSON를 직렬화 된 데이터와 일치 할 수 있습니다. 당신을위한 실제 문자열 잎이 발견, 그래서 나는 json.net에 익숙하지 않다.

    그건 그렇고, 내가 당신을 물어 봐야했다 ZSCAN 요소인지 0 MATCH ID : 92 수를 1 명 복귀 커서? 난 당신이 잘못된 방법으로 ZSCAN을 사용 생각한다.

    당신의 소트 세트가 크지 않은 당신은 레디 스 '루아 트랜잭션에 의해 네트워크 왕복 시간을 절약하는 방법을 알고 때 ZSCAN이 좋다. 이것은 아직 확인 작업 O (n)의 "ID로 찾아". 따라서, 더 나은 솔루션은 다음과 같은 방법으로 당신에게 데이터 모델을 변경하는 것입니다 :

    변경 집합을 분류 ...에서

    #   Score   Value
    0   1443476076 {"Id":"92","Ref":"7ADT","DTime":1443476076,"ATime":1443901554,"ExTime":0,"SPName":"7ADT33CFSAU6","StPName":"7ADT33CFSAU6"}
    1   1443482969 {"Id":"11","Ref":"DAJT","DTime":1443482969,"ATime":1443901326,"ExTime":0,"SPName":"DAJTJTT4T02O","StPName":"DAJTJTT4T02O"}
    

    #   Score   Value
    0   1443476076 Id:92
    1   1443482969 Id:11
    

    해시 유형 키의 또 다른 세트의 나머지 자세한 데이터를 이동 :

    #   Key   field-value field-value ...
    0   Id:92 Ref-7ADT DTime-1443476076 ...
    1   Id:11 Ref-7ADT DTime-1443476076 ...
    

    그런 다음 hgetall ID를 수행하여 ID로 찾습니다 (92). 날짜별로였다 쿼리에 관해서는, 당신은 그 ZRANGEBYSCORE SortedSet의 mindate maxdate을 하나 모든 아이디를 hgetall 필요가있다. 당신은 더 나은 하나 이러한 명령을 포장 루아를 사용하십시오 그것은 여전히 ​​슈퍼 빠른 것입니다!

    형 NoSQL 데이터베이스가 필요한 데이터는 위의 같은 중복 방식으로 구성된다. 이것은 몇 가지 일반적인 작업이 하나 이상의 명령과 왕복을 포함 할 수 있지만 레디 스의 루아 기능으로 달려 드는 수 있습니다. 난 강력하게, 레디 스의 루아 기능을 추천은 모든 슈퍼 빠른 레디 스 서버 측에서 실행 및 원자이며, 하나의 네트워크 왕복으로 명령을 포장의 원인!

    당신이 모르는 무언가가 있다면 회신

  2. from https://stackoverflow.com/questions/32854616/redis-sorted-set-find-item-by-property-value by cc-by-sa and MIT license