Redis 주요 명명 규칙?


226

Redis의 키에 대한 일반적인 명명 규칙은 무엇입니까? 값을 구분하여 :보았지만 일반적인 규칙이 무엇인지 또는 왜 확실하지 않습니다.

사용자에게는 다음과 같은 것을 할 것입니다 ...

user:00

사용자의 ID가 00

모든 사용자를 반환하기 위해 키의 시작 부분 만 쿼리 할 수 ​​있습니까?

나는 주로 사람들을 위해 일하는 방식과 그들이 선택한 이유를 연구함으로써 미래의 문제를 피하기를 바라고 있습니다.

답변:


205

Redis의 키에 대한 일반적인 명명 규칙은 무엇입니까? 값으로 구분 된 것을 보았지만 일반적인 규칙이 무엇인지, 왜 그런지 잘 모르겠습니다.

예, 콜론 부호 :는 키 이름을 지정할 때 사용되는 규칙입니다. 에서 레디 스 웹 사이트에서 튜토리얼 적혀있다 : 스키마를 고수하려고합니다. 예를 들어 "user : 1000 : password"와 같이 "object-type : id : field"는 좋은 아이디어 일 수 있습니다. "comment : 1234 : reply.to"와 같이 여러 단어 필드에 점을 사용하고 싶습니다.

모든 사용자를 반환하기 위해 키의 시작 부분 만 쿼리 할 수 ​​있습니까?

시작하는 모든 키를 직접 쿼리하는 것과 같은 것을 의미 user:하는 경우 명령이 있습니다. 그러나이 명령은 데이터베이스에 쓰인 모든 키를 검색하기 때문에 O (N) 이므로 디버깅 목적으로 만 사용해야 합니다.

이 문제에 대한 더 적절한 해결책은 전용 키를 작성 users하는 것입니다. 이름은 입니다. 예를 들어 목록 또는 세트 데이터 구조에 모든 사용자 키를 저장합니다 .


1
scan옵션 @EranH.가 아니라 키를 반복하는 것이 가장 좋습니다. scan요소 컬렉션을 점진적으로 반복하기 위해 사용됩니다.
Kishor Pawar

2
@ yojimbo87 따라서 두 가지 명령이 있습니다. 첫 번째는-user : 808021 : password = XYZ와 같은 키를 작성하는 것이고 두 번째는 키를 레지스트리 또는 색인 (set)에 넣는 것입니다. 그러나 하나의 명령이 성공적으로 실행되면 다른 실패는 키가 생성되었지만 레지스트리에 항목을 가져 오지 않음을 의미합니다.
LoveToCode

1
@LoveToCode 트랜잭션을 사용하면 작업이 모두 또는 전혀 실행되지 않을 수 있습니다.
yojimbo87

2
구분 기호 및 표시 여러 키를 그룹화 ''나는 또한 레디 스 바탕 화면 관리자 (A 레디 스 클라이언트 도구)도 대장을 처리하는 것으로 나타났습니다
아담 로타 루

1
나는 고유 한 가치가 최후라고 생각합니다. 다음과 같은 작업을 쉽게 수행 할 수 있습니다.$redis->delete($redis->keys('user:password:*'));
Crayons

26

네임 스페이스 구분자로 콜론 (:)을 사용하고 키의 id 부분에 대한 해시 (#)를 사용합니다.

logistics:building#23

로케일, 카테고리 등과 같은 키가 더 있으면 최고의 이름 규칙은 무엇입니까? {resource} : {key} # {value}, {key} # {value} => texts : locale # en, category # 15? 아니면 다른 제안이 있습니까?
fsasvari

1
내 예에서 "building"은 "collection"의 이름이고 23은 사용자 정의 "id"입니다. locale = en 및 category = 15 인 복합 ID가있는 경우 실제 ID는 {en, 15} 일 수 있으므로 namespace : texts # {en, 15} 또는 더 자세하게 표시 될 수 있습니다. namespace : texts # {locale = en, category = 15}. 그러나 이것은 단지 아이디어 일뿐입니다. 물론 키를 찾을 수 없으므로 id 요소의 순서를 변경하지 않도록주의하십시오. 실제로 키 이름의 복잡성을 인코딩하는 대신 redis 데이터 구조를 대신 사용해보십시오. redis.io/topics/indexes
The Nail

16

규칙은 콜론 (것 같습니다 :) 하지만, 나는 개인적으로 구분 기호 슬래시 (/)를 선호 그래서 나는 웹 개발자입니다. 슬래시는 이미 URL 내에서 매우 중요한 분리 자이며, 이는 균등 리소스 로케이터 이므로 리소스의 일종의 키입니다. 콜론 (:)으로 다른 접근법을 사용해야하는 이유는 무엇입니까? 도움이 되나요?

이 예제를 고려하십시오.

우리는이 편안하고 장난감 개체에 대한 API를. 하나 있습니다 :

http://example.com/api/toy/234 

우리가 어디에 보관 했습니까? Redis와 슬래시를 사용하므로 키가 분명합니다.

toy/234

이것은 장난감의 독특한 열쇠입니다. 클라이언트 측에서도이 키를 사용할 수 있습니다.

{
    key: "toy/234",
    color: "red",
    url: function () {
        return API_BASE_URL + this.key;
    }
}

사용자가 key로 객체를 요청합니다 toy/666. Redis에서 얻는 방법? Node.js 관련 예제 :

redis.get(key, function reply_callback(error, toystring) {
    var toy = JSON.parse(toystring);
    ...
}

슬래시를 콜론으로 변환하거나 그 반대로 변환 할 필요가 없습니다. 편리하지 않습니까?

참고 : 항상 사용자가 의도 한 것에 만 액세스 할 수 있는지 확인하십시오. user/1/password주석가가 지적한 것처럼 위의 원시 URL-key 접근 방식도 가져올 수 있습니다. Redis를 공용 읽기 전용 캐시로 사용하는 경우 문제가되지 않습니다.


24
… 편리하고 역 겨울 정도로 안전하지 않습니다. 당신은 curl http://example.com/api/user/1/password'd, 또는 유사한 것을 구걸하고 있습니다. (그냥
말해

3
콜론, 해시 및 슬래시는 중첩의 다른 수준, 예를 들면 지정하는 데 사용할 수 있습니다User#23:uploads:my/path/to/file.ext
인간의 모습을

31
데이터베이스에 사용자 입력을 키로 사용하지 마십시오.
Lyle

1
웹 개발자이기 때문에 슬래시를 선호한다고 생각하는 방식이 마음에 듭니다.
헥터 오도네즈

@ELLIOTTCABLE 감사합니다. 불안에 대한 메모가 추가되었습니다. Redis가 퍼블릭 읽기 전용 캐시로 사용되는 경우이 접근 방식에 문제가 있습니까?
Akseli Palén

6

아직 Redis 키 이름 지정에 대한 "모범 사례"가 널리 퍼져 있는지 여부는 알 수 없습니다.

ASCII NUL 문자를 구분 기호로 사용하여 실험했습니다 (Redis와 Python은 모두 8 비트이므로). 원시 키를 보면 약간 추한 것처럼 보이지만 추상화 레이어 뒤에 숨기는 것이 좋습니다. 네임 스페이스의 구성 요소가이를 사용하지 않거나 필요에 따라 각 구성 요소를 인코딩하려는 경우 콜론 및 파이프 기호는 확실한 대안입니다. 그러나 인코딩 할 경우 추상화 레이어를 개발하고 어쨌든 원시 키를 보지 않으려 고합니다.

이에 대한 다른 의견이 있는지 알아 보는 데 흥미로울 것입니다.


0

유스 케이스의 경우 HSET / HGET 이 더 적합 할 것 같습니다 . 도 있습니다 HKEYS 명령.

이러한 모든 명령은 GET / SET / KEYS와 동일한 복잡성을 가지므로 왜 사용하지 않습니까?

그런 다음이 구조를 가질 수 있습니다.

  • 사용자> 00> 가치
  • 사용자> 01> 가치

또는:

  • 사용자 : 사용자 이름> 00> 값
  • 사용자 : 사용자 이름> 01> 값

사용자 ID를 추출하여 해시 키로 사용하십시오. 개인적으로이 방법이 더 좋기 때문에이 방법을 선호하며 기존 사용자 ID를 쉽게 쿼리 할 수 ​​있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.