수색…


소개

Redis 키 공간은 데이터베이스의 데이터 구조에 키를 매핑하는 해시 테이블 또는 사전으로 생각할 수 있습니다.

Redis는 키를 제거하고 키 메타 데이터를 검사하며 키를 검색하고 키의 특정 속성을 수정하는 기능을 포함하여 키 공간을 관리하기 위해 키와 함께 작동하는 광범위한 명령을 제공합니다.

통사론

  • KEYS 패턴
  • PERSIST 키
  • EXPIRE 키 초
  • EXPIREAT 키 타임 스탬프
  • TTL 키
  • PEXPIRE 키 밀리 초
  • PEXPIREAT 키 밀리 초 - 타임 스탬프
  • PTTL 키
  • UNLINK 키 [키 ...]
  • DEL 키 [키 ...]
  • SCAN 커서 [MATCH 패턴] [카운트 카운트]

비고

Redis 키의 유효한 문자에 대해서는 설명서에서 완전히 설명합니다 .

Redis 키는 바이너리 안전합니다. 즉, "foo"와 같은 문자열에서부터 JPEG 파일의 내용에 이르기까지 모든 이진 시퀀스를 키로 사용할 수 있습니다. 빈 문자열 또한 유효한 키입니다.

키에 대한 몇 가지 다른 규칙 :

매우 긴 키는 좋은 생각이 아닙니다. 예를 들어 1024 바이트의 키는 메모리 단위뿐만 아니라 데이터 세트에서 키를 조회 할 때 값 비싼 여러 키 비교가 필요할 수 있기 때문에 바람직하지 않습니다. 현재의 작업이 큰 가치의 존재와 일치하는 경우에도 해싱에 의존하기 위해 (예 : SHA1) 더 좋은 아이디어입니다 (특히 메모리와 대역폭의 관점에서).

매우 짧은 키는 종종 좋은 생각이 아닙니다. 대신 "user : 1000 : followers"라고 쓰면 "u1000flw"를 키로 쓰는 것이 거의 없습니다. 후자는 더 읽기 쉽고 추가 된 공간은 키 객체 자체와 값 객체가 사용하는 공간에 비해 사소합니다. 짧은 키는 분명히 적은 메모리를 소비하지만, 당신의 임무는 올바른 균형을 찾는 것입니다.

스키마를 고수하십시오. 예를 들어 "object-type : id"는 "user : 1000"처럼 좋은 아이디어입니다. 점이나 대시는 "comment : 1234 : reply.to"또는 "comment : 1234 : reply-to"와 같이 여러 단어 필드에 자주 사용됩니다.

최대 허용 키 크기는 512MB입니다.

프로덕션 시스템에 대해 KEYS 명령을 사용하면 심각한 성능 문제가 발생할 수 있으므로주의하십시오. 키 공간에 대한 검색을 수행해야하는 경우, SCAN 명령이 더 나은 대안입니다.

유효한 키

Redis 키는 바이너리 안전하므로 문자 그대로 키로 사용할 수 있습니다. 유일한 한계는 512MB보다 작아야한다는 것입니다.

유효한 키의 예 :

7
++++
`~!@#$%^&*()-_=+
user:10134
search/9947372/?query=this%20is%20a%28test%29%20query
<div id="div64">

Any other string less than 512MB in size.
The raw binary content of an image or other binary file.
An entire multi-line text document.
An entire SQL query.
Any integer, hexadecimal, octal, or binary value.
Anything else you can think of less than 512MB in size. 

유효하지 않은 Redis 키 :

Anything larger than 512MB.

키 이름 지정 체계

명확성과 유지 보수성을 위해 Redis 키의 이름을 지정하기위한 시스템이나 스키마를 개발하는 것이 좋습니다. 다음은 키 이름 지정을위한 보편적이고 유지 보수가 가능한 시스템의 몇 가지 예입니다.

user:10134
user:10134:favorites
user:10134:friends
user:10134:friends-of-friends

user:10134
user:10134/favorites
user:10134/friends
user:10134/friends.of.friends

user/10134
user/10134/favorites
user/10134/friends
user/10134/friends of friends

허용되는 동안 큰 키는 더 많은 메모리를 사용하므로 검색 시간이 더 단축되므로 500MB 키를 사용하면 성능에 좋지 않을 수 있습니다. 더 좋은 아이디어는 큰 이진 객체의 SHA-1, SHA-256 또는 MD5 해시를 키로 사용하는 것입니다.

image/9517bb726d33efdc503a43582e6ea2eea309482b
image52e9df0577fca2ce022d4e8c86b1eccb070d37bef09dec36df2fabbfa7711f5c

모든 키 나열

redis-cli에서 다음 명령을 실행하여 Redis 데이터베이스의 모든 키를 나열 할 수 있습니다.

KEYS *

KEYS의 매개 변수는 글로브 스타일 패턴 일치 표현식입니다. 지원되는 패턴의 예는 다음과 같습니다.

h?llo matches hello, hallo and hxllo
h*llo matches hllo and heeeello
h[ae]llo matches hello and hallo, but not hillo
h[^e]llo matches hallo, hbllo, ... but not hello
h[a-b]llo matches hallo and hbllo

KEYS * 명령을 사용하면 성능에 나쁜 영향을 미칠 수 있으므로 프로덕션 인스턴스에는 권장되지 않습니다. 프로덕션 코드의 키를 검색하려면 SCAN 작업을 사용하십시오.

TTL 및 키 만료

키의 만료 값은 업데이트 명령 외부의 사용자가 관리 할 수 ​​있습니다. Redis를 사용하면 TTL 명령을 사용하여 키의 현재 TTL을 결정할 수 있습니다.

TTL key

이 명령은 초 단위로 TTL을 반환하거나 -1 또는 -2의 특수 값을 반환합니다. -1은 키가 지속되고 (만료되지 않음) -2는 키가 존재하지 않음을 나타냅니다.

만료 키는 PERSIST 명령을 사용하여 지속적으로 만들 수 있습니다.

PERSIST KEY

EXPIRE 명령을 사용하여 영구 키를 만료시킬 수 있습니다.

EXPIRE KEY seconds

만료는 기존 키의 TTL을 수정하는 데 사용될 수도 있습니다. 또는 EXPIREAT 명령을 UNIX 시간 소인과 함 2 사용하여 만기 시간을 설정할 수 있습니다.

P 접두어가 붙은 TTL, EXPIRE 및 EXPIREAT 명령의 밀리 초 버전이 있습니다.

키 삭제하기

Redis는 데이터베이스에서 키를 제거하는 두 가지 기능, del 및 unlink를 제공합니다.

del 함수는 하나 이상의 키를 데이터베이스에서 제거합니다. del 명령은 Redis가 현재 실행 스레드에서 삭제 된 키의 메모리를 즉시 회수하도록합니다. del의 실행 시간은 모든 키에서 삭제 된 개별 요소의 수에 비례합니다.

unlink 기능은 del 명령과 같은 역할을하며 데이터베이스에서 하나 이상의 키를 제거합니다. 그러나 del 명령과 달리 이러한 키가 사용하는 메모리는 다른 스레드에서 비동기 적으로 교정됩니다.

Redis Keyspace 스캐닝

Redis는 SCAN 명령을 제공하여 특정 패턴과 일치하는 데이터베이스의 키를 반복합니다. Redis는 SCAN 명령에서 glob 스타일 패턴 일치를 지원합니다.

SCAN 명령은 Redis 키 공간에 커서 기반 반복자를 제공합니다. SCAN에 대한 반복적 인 호출 순서는 사용자가 커서 인수를 0으로 설정하여 호출하는 것으로 시작됩니다.이 호출의 결과는 SCAN에 대한 다음 호출에 제공되는 업데이트 된 커서와 항목의 일괄 처리입니다. 이 반복은 Redis가 0 커서를 반환 할 때까지 계속됩니다.

다음 Python 함수는 SCAN의 기본 사용법을 보여줍니다.

def scan_keys(r, pattern):
    "Returns a list of all the keys matching a given pattern"

    result = []
    cur, keys  = r.scan(cursor=0, match=pattern, count=2)
    result.extend(keys)
    while cur != 0:
        cur, keys = r.scan(cursor=cur, match=pattern, count=2)
        result.extend(keys)
        
    return result

SCAN 명령은 데이터베이스에서 키를 검색하는 데 권장되는 방법이며 KEYS * 명령보다 권장됩니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow