2017-11-24 7 views
2

문자열을 저장하고 각 문자열에 고유 한 정수를 연결해야합니다. 정수는 가능한 짧거나 작아야합니다. 레디 스에서 그렇게 할 수 있습니까? 기본적으로 나는 SADD과 같은 것이 필요하지만 세트의 요소 수를 반환하는 대신 삽입 된 요소의 인덱스 (새로 저장되거나 기존 됨)를 반환해야합니다.값의 색인을 얻는 방법은 존재합니까?

의사 코드 :

// if mystring already exists in myset it returns its index 
// otherwise stores it and returns its index. 
    index := storeOrReturnIndex(myset, mystring) 
+0

정수는 얼마입니까? 8 비트 이상입니까? 16? 128? – Alexander

+0

최대한 짧게, 그래서 나는 그들이 점진적이어야한다고 생각합니다. 나는 짧은 URL 서비스를 만들고 있지만 가능한 가장 작은 정수 대신 가능한 가장 작은 정수를 사용하고 있습니다. – Books

답변

0

당신을 위해 무엇을 찾고있는 해시 맵 커버를 사용겠습니까?

> HSET hashmap 0 "first string" 
(integer) 1 
> HSET hashmap 1 "second string" 
(integer) 1 
> HSET hashmap 2 "third string" 
(integer) 1 
> HGET hashmap 1 
"second string" 
> HLEN hashmap 
3 

당신이 가진 키에 마지막으로 수정 된 인덱스를 저장할 수 있습니다 :

> SET last_modified 1 

그런 다음 그것을 검색 : 원자를 새로 취득에

> GET last_modified 
+0

나는이 모든 것이 트랜잭션에서 실행되어야한다고 믿는다. 그렇지 않으면 오래된 last_modified 데이터를 사용할 수있다 ... 이것은 트랜잭션의 고전적인 사용 사례이다. – Books

+0

실제로 필드 이름으로 발생하기 쉬운 문자열을 사용하여 같은 해시에 카운터를 저장할 수 있습니다 (일반적으로 빈 문자열을 사용합니다). 이것은 하나의 키를 건 드리면 트랜잭션을 수행하는 것을 더 쉽게 해준다 (그리고 거기에'HINCRBY' 명령도있다). 키/필드를 1로 초기화하지 않아도됨에 유의하십시오. Redis가이를 수행하므로 (0으로 설정 됨) I –

+0

'MULTI' 명령을 사용하여 명령을 함께 묶어 트랜잭션으로 실행할 수 있습니다. https://redis.io/topics/transactions – Alexander

0

당신은 레디 스 INCR 명령을 사용할 수 있습니다 , 고유 색인.

패턴 : 카운터

카운터 패턴은 레디 스 원자 증가 작업으로 할 수있는 가장 확실한 일이다. 이 아이디어는 작업이 발생할 때마다명령을 Redis에 보내면됩니다. 예를 들어 웹 애플리케이션에서 우리는이 사용자가 일년 중 몇 번이나 페이지 뷰를 수행했는지 알고 싶을 수 있습니다. 이렇게하려면 웹 응용 프로그램은 사용자가 페이지 뷰를 수행 할 때마다 키를 단순히 증가시키고 사용자 이름을 연결하는 키 이름과 현재 날짜를 나타내는 문자열을 만듭니다. 이 간단한 패턴은 여러 가지 방법으로 확장 할 수 있습니다 : 새 항목 (URL)를 저장하여 원하는 목적지

그래서 원자 방법으로 다음 고유, 최소의 인덱스를 얻기 위해 INCR을 사용합니다. 그런 다음 HSET을 사용하여 항목과 연결된 색인을 저장하고 HGET을 사용하여 항목에 대한 관련 색인을 가져올 수 있습니다.