복붙노트

[REDIS] 레디 스의 데시벨 값에서 검색

REDIS

레디 스의 데시벨 값에서 검색

나는 레디 스 DB 사용에 초보자입니다. 문서의 일부를 읽고 인터넷에 예제의 일부에보고도 stackoverflow.com를 스캔 후, 나는 물론, 레디 스이 매우 빠른 것을 스케일을 볼 수 있지만 이것은 우리가 우리의 데이터가 될 것입니다 방법을 생각해야하는 가격을 비용 그들이 받아야 할 것이다 설계 시간과 어떤 작업에 액세스. 이것은 내가 이해할 수 있지만 나는 평범한 구식 SQL로, 그러나 천천히, 너무 쉽게 무엇 데이터에서 검색에 대해 혼란스러워 조금입니다. 나는 KEY 명령을 사용하여 하나의 방법으로 그것을 할 수 있지만 그것은 O (N) 작동하지 O (로그 (N))입니다. 그래서 레디 스의 장점 중 하나를 잃을 것입니다.

경험이 많은 동료들은 무슨 말을합니까?

의는 예를 들어, 사용 사례를 보자 : 우리가 약에 대한 개인 데이터를 저장할 필요가있다. 100.000 사람과 그 데이터는 이름, 전화 NR에 의해 검색 될 필요가있다.

이를 위해 나는 다음과 같은 구조를 사용합니다 :

1. SET for storing all persons' ids {id1, id2, ...} 
2. HASH for each person to store personal data and name it 
like map:<id> e.g. map:id1{name:<name>, phone:<number>, etc...}

해결 방법 1 :

1. HASH for storing all persons' ids but the key should be the phone number
2. Then with the command KEY 123* all ids could be retrieved who have a phone number 
sarting with 123. On basis of the ids also the other personal data could be retrieved.
3. So forth for each data to be searched for a separate HASH should be created.

그러나이 솔루션의 주요 단점은 전화 번호와 HASH의 식별자의의 할당은 모호 될 수 있도록 속성 값은 또한, 고유해야한다는 것입니다. 한편, O (N) 런타임은 이상적이지 않다.

또한, 이는 필요한 것보다 더 많은 공간을 사용하며 KEY 명령은 액세스 성능이 저하된다. (http://redis.io/commands/keys)

어떻게이 올바른 방법으로 수행해야 하는가? 또한 IDS는 ZSET에 갈 것이라고 및 데이터 필요 검색하지 seraches와 범위가 작업에 점수하지만 메이크업 만 가능합니다 될 수 있다고 상상할 수 있었다.

사전에, 안부, 타마스도 주셔서 감사합니다

응답 요약 : 사실, 두 응답은 레디 스이 키의 값을 검색 할 수 있도록 설계되지 않았 음을 명시. 이 유스 케이스가 필요한 경우 내 원래의 솔루션 또는 솔루션 아래에서와 같이, 다음 중 하나를 구현해야 해결 방법을 설명합니다.

키에 대한 액세스 상수, IDS 요구 사항의 목록이 O (CONST) 런타임을 줄 것이다 액세스를 통해 반복하는 것으로 간주 될 수 있기 때문에 엘리에 의해 아래의 솔루션은 내 원래보다 훨씬 더 나은 성능을 가지고있다. 이 데이터 모델은 그렇게 1-N 관계 (I 오래된 ERD 용어로 말할 것)도 가능합니다 ... 한 사람이 등등도 등 이름에 대한 다른 사람과 같은 전화 번호를 가지고 수도 있습니다.

이 솔루션의 단점은 그 시작 숫자 만 알려져있다, 검색 할 수없는 내 전화 번호보다 훨씬 더 많은 공간을 소비하는 것이다.

두 응답을 주셔서 감사합니다.

해결법

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

    1.레디 스 당신이 매우 높은 주파수에서 데이터 액세스 및 갱신에 필요하고 데이터 구조의 사용 혜택을 누릴 곳 (해시가, 세트,리스트, 문자열, 또는 세트를 분류) 사용 사례입니다. 매우 구체적인 사용 사례를 채우기 위해 만들어졌다. 당신은 매우 유연 검색 같은 일반적인 사용 사례가있는 경우, 당신은 훨씬 더 탄성 검색 또는 SOLR 등이 목적을 위해 만들어진 무언가에 의해 제공 될 것입니다.

    레디 스 당신이 매우 높은 주파수에서 데이터 액세스 및 갱신에 필요하고 데이터 구조의 사용 혜택을 누릴 곳 (해시가, 세트,리스트, 문자열, 또는 세트를 분류) 사용 사례입니다. 매우 구체적인 사용 사례를 채우기 위해 만들어졌다. 당신은 매우 유연 검색 같은 일반적인 사용 사례가있는 경우, 당신은 훨씬 더 탄성 검색 또는 SOLR 등이 목적을 위해 만들어진 무언가에 의해 제공 될 것입니다.

    당신은 레디 스에서이 작업을 수행해야하는 경우 즉, 여기에 내가 (가정 사용자가 이름과 전화 번호를 공유 할 수 있습니다)을 할 거라고 방법은 말했다 :

    name:some_name -> set([id1, id2, etc...])
    name:some_other_name -> set([id3, id4, etc...])
    
    phone:some_phone -> set([id1, id3, etc...])
    phone:some_other_phone -> set([id2, id4, etc...])
    
    id1 -> {'name' : 'bob', 'phone' : '123-456-7891', etc...}
    id2 -> {'name' : 'alice', 'phone' : '987-456-7891', etc...}
    

    모든 전화 번호 (접두사 "전화") :이 경우, 우리는 ( "이름"로 시작) 모든 이름에 대한 새 키를 만들고있어. 당신이 사용자에 대해 원하는 모든 정보를 ID의 세트에 각 키 포인트. 당신이 검색 할 때, 전화, 예를 들어, 당신은 할 수 있습니다 :

    HGETALL 'phone:123-456-7891'
    

    레디 스도 빨리 가서 피하기 네트워크 백 앤 위해 상자에 다음 선택의 여지가 귀하의 언어로 무엇이든 각 (예제에서는 이름)에 대한 정보 결과 및 반환을 통해 루프 (당신은 서버 측 루아에서이 모든 일을 할 수 등) 당신이 원하는 경우 :

    for id in results:
        HGET id 'name'
    

    넌 비용 여기 m 지정된 전화 번호 사용자의 수 O (m)를 될 것이며,이 때문에 속도위한 최적화 방법의 레디 스에 매우 빠른 작동 될 것입니다. 아마 당신은 너무 빨리 가서 일을 필요로하지 않기 때문에 그것은 귀하의 경우 과잉있을거야, 당신은 유연한 검색을 가진 선호 싶지만, 이것은 당신이 어떻게 할 것입니다.

  2. ==============================

    2.레디 스 굉장 있지만 키 이외에서 검색을 위해 만들어진 아니에요. 같은 쿼리를 촉진하기 위해 항목을 저장하는 여분의 데이터 세트를 구축하지 않고 값에 대한 당신 단순히 캔트 쿼리하지만 그렇다하더라도 당신은 진정한 검색, 단지 더 유지 보수, 메모리, 궁시렁, 궁시렁의 비효율적 인 사용을하지 않습니다 ...

    레디 스 굉장 있지만 키 이외에서 검색을 위해 만들어진 아니에요. 같은 쿼리를 촉진하기 위해 항목을 저장하는 여분의 데이터 세트를 구축하지 않고 값에 대한 당신 단순히 캔트 쿼리하지만 그렇다하더라도 당신은 진정한 검색, 단지 더 유지 보수, 메모리, 궁시렁, 궁시렁의 비효율적 인 사용을하지 않습니다 ...

    이 질문은 이미 당신이 할 몇 가지 독서있어 해결되었습니다 :-D

    문자열을 검색하려면, 빌드 자동 완성 레디 스와 다른 멋진 것들에 ... 어떻게 레디 스에서 문자열을 검색하나요?

    문서 내에서 검색 할 때 왜 사용하여 MongoDB이 끝난 레디 스하는 스마트 ... 중간 크기의 문서를 저장 수천 가장 효율적인 문서 지향 데이터베이스 엔진은 무엇입니까?

  3. from https://stackoverflow.com/questions/17193176/searching-in-values-of-a-redis-db by cc-by-sa and MIT license