본문 바로가기
IT

레디스(Redis) 키 공간(Keyspace)과 사용법 - 키 만료(expiration), 스캔, 변경, 질의

by eddy's warehouse 2024. 3. 14.

오늘은 Redis를 사용하기 위한 공식 개발자 가이드에 대해서 하나씩 살펴보도록 하겠습니다.

레디스(Redis) 키 공간(Keyspace)와 사용법 - 키 만료(expiration), 스캔, 변경, 질의 썸네일

개요

레디스에는 테이블이나 컬렉션과 같은 개념 자체가 없습니다. 그래서 모든 것은 키로 관리되는데 사용 방식을 익힐 필요가 있습니다.

 

주요 내용은 다음과 같습니다.

Keyspace(키 공간) (*이 문서)
Redis에서 키 관리하기: 키 만료, 키 공간 스캔, 변경 및 쿼리하기

Redis의 클라이언트 측 캐싱
Redis의 서버 지원, 클라이언트 측 캐싱

Redis 파이프라이닝
Redis 명령을 일괄 처리하여 왕복 시간을 최적화하는 방법

Redis 키 공간 알림
Redis 키 및 값의 변경 사항을 실시간으로 모니터링하기

Redis 프로그래밍 패턴
Redis 데이터 구조 작업을 위한 새로운 패턴

 

위의 내용중 가장 중요한 Keyspace와 Redis pipelining 그리고 Redis 프로그래밍 패턴에 대해서 알아보도록 하겠습니다.

먼저 Redis의 Keyspace에 대해서 자세히 알아봅니다.

 

Redis Keyspace

Redis에서 키 관리하기는 Key expiration(키 만료), 키 공간 스캔(scan), 변경(alter) 및 쿼리(query)하는 방법에 대해서 다룹니다.

 

Redis Key 특징

Redis 키는 binary safe(바이너리 안전**)하므로 "foo"와 같은 문자열부터 JPEG 파일의 내용까지 모든 바이너리 시퀀스를 키로 사용할 수 있습니다. 빈 문자열도 유효한 키입니다.

** 바이너리 안전이란? **
바이너리 안전은 데이터를 원시 바이트 스트림으로 처리하는 기능을 의미합니다.
이는 텍스트 측면을 무시하고 데이터를 순수한 바이트로 다루는 것을 의미합니다.
예를 들어, 프로그래밍 언어에서 종종 0x00 문자를 문자열의 끝을 나타내는 마커로 사용합니다. 이런 의미에서 바이너리 안전한 문자열은 이러한 문자로 구성될 수 있습니다.

 

Redis Key 규칙

키에 대한 몇 가지 다른 규칙이 아래와 같이 존재합니다.

  • 매우 긴 키는 좋지 않습니다. 예를 들어 1024바이트의 키는 메모리 측면에서도 좋지 않을 뿐만 아니라 데이터 집합에서 키를 조회하려면 여러 번 키를 비교해야 하므로 비용이 많이 들 수 있습니다. 당면한 작업이 큰 값의 존재 여부를 일치시키는 것이라면, 특히 메모리와 대역폭의 관점에서 키 값은 해시(예: SHA1**)를 사용하는 것이 더 나은 아이디어입니다.
** SHA1 (Secure Hash Algorithm 1) **
해시 함수 중 하나로, 입력을 받아 160 비트 (20 바이트) 해시값을 생성합니다. 이는 보통 16진수 40자리로 표현됩니다. SHA1은 미국 국가안보국(NSA)이 설계한 암호학적 해시 함수로, 미국의 연방 정보 처리 표준이기도 합니다.
  • 매우 짧은 키는 좋지 않은 경우가 많습니다. "user:1000: followers"를 대신 쓸 수 있다면 "u1000flw"를 키로 쓸 필요가 거의 없습니다. 전자가 더 가독성이 좋고 키 객체 자체와 값 객체가 사용하는 공간에 비해 추가되는 공간은 미미합니다. 짧은 키는 분명히 메모리를 조금 덜 소비하지만, 키의 길이와 의미 사이의 적절한 균형을 찾는 것입니다.
  • 스키마를 사용하세요. 실제 레디스에는 스키마가 없지만, 예를 들어 "user:1000"과 같이 "object-type:id"를 사용하는 것이 좋습니다. "comment:4321:reply.to" 또는 "comment:4321:reply-to"와 같이 여러 단어 필드에는 점이나 대시를 사용하는 경우가 많습니다.
  • 허용되는 최대 키 크기는 512MB입니다.

 

Redis Key space 변경 및 쿼리하기

Key space 기본 명령

 

Key space와 상호 작용하는 데 유용한 모든 유형의 키에 사용할 수 있는 명령이 몇 가지 있습니다.
SET은 키와 값을 입력하는데 사용할 수 있습니다.

set key value [EX seconds|PX milliseconds|KEEPTTL] [NX|XX]

위와 같이 set 이후에 key value를 넣으면 키 값 쌍을 넣을 수 있고 뒤에 옵션으로 다른 값들을 넣을 수 있습니다.


예를 들어 EXISTS 명령은 1 또는 0을 반환하여 주어진 키가 데이터베이스에 있는지 여부를 알려주며, DEL 명령은 값이 무엇이든 키와 연결된 값을 삭제합니다.

아래 예시에서 testkey라는 키로 hello라는 데이터를 입력하기 위해서 set 명령을 수행합니다. 그리고 testkey를 가지는 key가 있는지 확인하기 위해서 exists testkey를 수행해 보고 testkey를 del 명령으로 삭제한 후 다시 exists testkey를 수행해 봅니다.

~$ redis-cli
127.0.0.1:6379> set testkey hello
OK
127.0.0.1:6379> exists testkey
(integer) 1
127.0.0.1:6379> del testkey
(integer) 1
127.0.0.1:6379> exists testkey
(integer) 0
127.0.0.1:6379>

 

예제에서 DEL 자체가 키가 제거되었는지(존재했는지) 여부에 따라 1 또는 0을 반환하는지(해당 이름의 키가 없음)도 확인할 수 있습니다. DEL 명령의 경우 입력된 key가 없으면 0을 반환합니다.

127.0.0.1:6379> del testkey
(integer) 0


키 공간과 관련된 명령은 여러 가지가 있지만, 위의 두 가지 명령은 지정된 키에 저장된 값의 종류를 반환하는 TYPE 명령과 함께 필수적인 명령입니다.

127.0.0.1:6379> set testkey y
OK
127.0.0.1:6379> type testkey
string
127.0.0.1:6379> del testkey
(integer) 1
127.0.0.1:6379> type testkey
none
127.0.0.1:6379>

 

Key expiration

저장하는 값의 유형이나 타입과 관계없이 작동하는 중요한 Redis 기능인 키 만료에 대해 살펴보겠습니다. 키 만료를 사용하면 "유효 기간" 또는 "TTL"이라고도 하는 키에 대한 시간 제한을 설정할 수 있습니다. 유효 기간이 경과하면 키는 자동으로 파기됩니다.

키 만료는 다음과 같은 특징을 가지고 있습니다.

  • 초 또는 밀리초 단위로 설정할 수 있습니다.
  • 그러나 만료 시간에 대한 정밀도(time resolution)는 항상 1밀리초입니다.
  • 만료에 대한 정보는 복제되어 디스크에 유지되며, Redis 서버가 중지된 상태에서 사실상 시간이 경과합니다 (즉, Redis 는 키가 만료되는 날짜를 저장합니다).

아래 예제는 EXPIRE 명령을 사용하여 키의 만료를 초 단위로 설정합니다.

127.0.0.1:6379> set key testval
OK
127.0.0.1:6379> expire key 5
(integer) 1
127.0.0.1:6379> get key
"testval"
127.0.0.1:6379> get key
(nil)
127.0.0.1:6379>

 

위의 예시에서 두 번째 GET 호출이 5초 이상 지연되었기 때문에 두 개의 GET 호출 사이에 키가 사라졌습니다. 위의 예제에서는 EXPIRE를 사용하여 만료를 설정했습니다(이미 만료가 있는 키에 다른 만료를 설정하는 데에도 사용할 수 있으며, PERSIST를 사용하여 만료를 제거하고 키를 영구적으로 지속시킬 수 있습니다).

EXPIRE 명령 외에도 다른 Redis 명령을 사용하여 만료가 있는 키를 만들 수도 있습니다. 예를 들어 SET 옵션을 사용하는 것입니다.

127.0.0.1:6379> set key 100 ex 10
OK
127.0.0.1:6379> ttl key
(integer) 8

 

위의 예에서는 문자열 값이 100이고 만료 시간이 10초인 키를 설정합니다. 나중에 TTL 명령이 호출되어 키의 남은 유효 기간을 확인합니다.

밀리초 단위로 만료 시간을 설정하고 확인하려면 PEXPIRE 및 PTTL 명령을 사용할 수 있습니다.

 

Keyspace 검색하기

Scan

효율적인 방식으로 Redis 데이터베이스의 키를 조회하기 위해 SCAN 명령을 사용할 수 있습니다.

SCAN은 증분 반복( incremental iteration)을 가능하게하고 호출당 적은 수의 엘리먼트만 반환하므로, 대규모 키 또는 엘리먼트 집합에 대해 호출할 때 서버를 장시간(심지어 몇 초) 차단할 수 있는 KEYS 또는 SMEMBERS와 같은 명령의 단점 없이 프로덕션 환경에서 사용할 수 있습니다.

그러나 SMEMBERS와 같은 차단 명령은 주어진 시점에 해당하는 모든 엘리먼트를 정확하게 제공할 수 있습니다. SCAN 명령군은 반복 프로세스 중에 점진적으로 반복하는 동안 데이터가 변경될 수 있으므로 반환되는 엘리먼트에 대해 제한적인 보장만 제공합니다.

 

Keys

키 공간을 반복하는 또 다른 방법은 KEYS 명령을 사용하는 것이지만, 이 방법은 모든 키가 반환될 때까지 Redis 서버를 차단하므로 주의해서 사용해야 합니다.

경고: KEYS는 프로덕션 환경에서 사용할 때에는 매우 주의해서 사용해야 하는 명령입니다.

대규모 데이터베이스에 대해 KEYS를 실행하면 성능이 저하될 수 있습니다. 이 명령은 디버깅 및 키 스페이스 레이아웃 변경과 같은 특수 작업을 위한 것입니다. 일반 애플리케이션 코드에서는 KEYS를 사용하지 마세요. 키 스페이스의 하위 집합에서 키를 찾는 방법을 찾고 있다면 SCAN 또는 sets를 사용하는 것이 좋습니다.

 

지원되는 패턴

  • h?llo : hello, hallo, hxllo (?: 한 문자)
  • h*llo : hllo, heeeello ... (*: 0개 이상 아무문자)
  • h[ae]llo : hello, hallo (a 또는 e)
  • h[^e]llo : hallo, hbllo (^e: e가 아닌)
  • h[a-b]llo : hallo and hbllo (a-b: a 부터 b까지)
127.0.0.1:6379> set hallo 1
OK
127.0.0.1:6379> set hbllo 2
OK
127.0.0.1:6379> set hcllo 3
OK
127.0.0.1:6379> keys h[a-c]llo
1) "hallo"
2) "hbllo"
3) "hcllo"
(0.87s)

 

특수 문자를 그대로 일치시키려면 \를 사용하여 이스케이프 처리합니다.

127.0.0.1:6379> set h*llo 4
OK
127.0.0.1:6379> keys h*llo
1) "hallo"
2) "hbllo"
3) "h*llo"
4) "hcllo"
(0.82s)
127.0.0.1:6379> keys h\*llo
1) "h*llo"
(0.81s)

 

 

오늘은 Redis의 Keyspace에 대해서 알아보고 사용법을 간략하게 알아보았습니다. 다음에는 Redis의 파이프라이닝에 대해서 알아보겠습니다.

facebook twitter kakaoTalk kakaostory naver band shareLink