Redis 데이터베이스 및 키 관리하는 방법

소개

Redis는 오픈 소스인 인메모리 키-값 데이터 저장소입니다. 키-값 데이터 저장소는 각 키가 관련된 의 고유 식별자로 작동하는 NoSQL 데이터베이스 유형입니다. 주어진 Redis 인스턴스에는 여러 데이터베이스가 포함되어 있으며, 각각의 데이터베이스는 다양한 데이터 유형의 많은 다른 키를 보유할 수 있습니다.

이 튜토리얼에서는 데이터베이스를 선택하고, 데이터베이스 간 키를 이동하고, 키를 관리하고 삭제하는 방법을 배우게 됩니다.

이 가이드 사용 방법

이 가이드는 자체 포함된 예제로 작성되었습니다. 원하는 작업에 관련된 섹션으로 이동하는 것을 권장합니다.

이 가이드에 표시된 명령은 Redis 버전 6.0.16을 실행하는 Ubuntu 22.04 서버에서 테스트되었습니다. 비슷한 환경을 설정하려면 Ubuntu 22.04에 Redis 설치 및 보안 설정하는 방법 가이드의 단계 1을 따를 수 있습니다. 이 명령들의 동작을 redis-cli를 사용하여 실행하여 보여드리겠습니다. 다른 Redis 인터페이스를 사용하는 경우 — 예를 들어 Redli — 일부 명령의 정확한 출력이 다를 수 있습니다.

또는 이러한 명령을 테스트하기 위해 관리형 Redis 데이터베이스 인스턴스를 프로비저닝할 수도 있지만, 데이터베이스 제공업체에서 허용하는 제어 수준에 따라 이 가이드의 일부 명령이 설명한대로 작동하지 않을 수 있습니다. DigitalOcean 관리형 데이터베이스를 프로비저닝하려면 관리형 데이터베이스 제품 설명서를 따르십시오. 그런 다음 TLS 터널을 설정하거나 Redli를 설치하여 TLS를 통해 관리형 데이터베이스에 연결해야 합니다.

데이터베이스 관리

기본적으로 Redis 인스턴스는 16개의 논리적인 데이터베이스를 지원합니다. 이러한 데이터베이스는 효과적으로 서로 격리되어 있으며, 한 데이터베이스에서 명령을 실행하더라도 Redis 인스턴스의 다른 데이터베이스에 저장된 데이터에는 영향을 주지 않습니다.

Redis 데이터베이스는 0부터 15까지 번호가 매겨지며, 기본적으로 Redis 인스턴스에 연결할 때는 데이터베이스 0에 연결됩니다. 그러나 연결 후 select 명령을 사용하여 사용하는 데이터베이스를 변경할 수 있습니다:

  1. select 15

데이터베이스 0이 아닌 다른 데이터베이스를 선택한 경우, redis-cli 프롬프트에서 반영됩니다:

한 데이터베이스에 저장된 모든 데이터를 다른 데이터베이스에 저장된 데이터와 교체하려면 swapdb 명령을 사용합니다. 다음 예제는 데이터베이스 6에 저장된 데이터를 데이터베이스 8에 저장된 데이터와 교체하며, 어떤 클라이언트도 즉시 변경 내용을 적용할 수 있습니다:

  1. swapdb 6 8

swapdb 명령은 교체가 성공하면 OK를 반환합니다.

특정 키를 다른 Redis 인스턴스로 이동하려면 migrate를 실행할 수 있습니다. 이 명령은 키가 대상 인스턴스에 존재하는지 확인한 후 소스 인스턴스에서 해당 키를 삭제합니다. migrate를 실행할 때 다음 요소들을 순서대로 포함해야 합니다:

  • 대상 데이터베이스의 호스트 이름 또는 IP 주소
  • 대상 데이터베이스의 포트 번호
  • 이동하려는 키의 이름
  • 대상 인스턴스에서 키를 저장하려는 데이터베이스 번호
  • A timeout, in milliseconds, which defines the maximum amount of idle communication time between the two machines. Note that this isn’t a time limit for the operation, but means that the operation should always make some level of progress within the defined length of time

예를 들어, 다음과 같은 예시가 있습니다:

  1. migrate 203.0.113.0 6379 key_1 7 8000

게다가, migrate는 다음 옵션들을 허용합니다. 이 옵션들은 timeout 인자 뒤에 추가할 수 있습니다:

  • COPY: 키가 소스 인스턴스에서 삭제되지 않아야 함을 지정합니다
  • REPLACE: 대상에 이미 키가 존재하는 경우, migrate 작업이 해당 키를 삭제하고 대체해야 함을 지정합니다
  • KEYS: 특정 키를 마이그레이션하려면 빈 문자열 ("")을 입력한 다음, 일치하는 패턴을 가진 키를 마이그레이션하려면 keys 명령어 구문을 사용할 수 있습니다. keys가 작동하는 방법에 대한 자세한 정보는 Redis에서 문제 해결하는 방법 튜토리얼을 참조하세요.

키 관리하기

어떤 유형의 데이터를 보관하든 상관없이 키를 관리하는 데 유용한 여러 Redis 명령어가 있습니다. 이 명령어 중 일부는 다음 섹션에서 검토됩니다.

rename은 지정된 키의 이름을 바꿉니다. 성공하면 OK를 반환합니다:

  1. rename old_key new_key

현재 선택된 데이터베이스에서 무작위 키를 반환하려면 randomkey를 사용할 수 있습니다:

  1. randomkey
Output
"any_key"

type를 사용하여 주어진 키가 어떤 유형의 데이터를 보유하는지 확인합니다. 이 명령의 출력은 string, list, hash, set, zset, 또는 stream 중 하나일 수 있습니다:

  1. type key_1
Output
"string"

지정된 키가 존재하지 않으면 type은 대신 none을 반환합니다.

개별 키를 Redis 인스턴스의 다른 데이터베이스로 이동하려면 move 명령을 사용합니다. move는 키의 이름과 이동하려는 데이터베이스를 인수로 취합니다. 예를 들어, 키 key_1을 데이터베이스 8로 이동하려면 다음을 실행합니다:

  1. move key_1 8

move는 키를 성공적으로 이동하면 OK를 반환합니다.

키 삭제

모든 데이터 유형의 하나 이상의 키를 삭제하려면 del 명령 다음에 삭제하려는 하나 이상의 키를 지정합니다:

  1. del key_1 key_2

이 명령이 키를 성공적으로 삭제하면 (integer) 1을 반환합니다. 그렇지 않으면 (integer) 0을 반환합니다.

unlink 명령은 del과 유사한 기능을 수행하지만, 차이점은 del이 서버가 키로 차지한 메모리를 회수하는 동안 클라이언트를 차단한다는 것입니다. 키를 삭제하는 데 걸리는 시간이 매우 짧고 차단 시간이 눈에 띄지 않을 경우 del로 메모리를 회수합니다.

그러나 예를 들어 삭제하는 키가 많은 개체와 관련되어 있을 경우(예: 수천 개 또는 수백만 개의 필드가 있는 해시), 불편 할 수 있습니다. 이러한 키를 삭제하는 데는 상당한 시간이 소요되며, 서버 메모리에서 완전히 제거 될 때까지 다른 작업을 수행 할 수 없습니다.

unlink 함수는 먼저 키가 차지하는 메모리 할당 비용을 결정합니다. 비용이 작은 경우, unlink 함수는 키를 즉시 삭제하고 클라이언트를 차단하는 방식으로 작동합니다. 그러나 키에 대한 메모리 할당에 높은 비용이 있는 경우, unlink 함수는 다른 스레드를 생성하여 백그라운드에서 메모리를 점진적으로 회수하고 클라이언트를 차단하지 않고 키를 비동기적으로 삭제합니다:

  1. unlink key_1

백그라운드에서 실행되므로 대개 클라이언트에서 오류를 줄이기 위해 키를 삭제하는 데 unlink를 사용하는 것이 좋습니다. 그러나 많은 경우에는 del도 충분합니다.

경고: 다음 두 개의 명령은 위험한 것으로 간주됩니다. flushdbflushall 명령은 각각 단일 데이터베이스의 모든 키와 Redis 서버의 모든 데이터베이스의 모든 키를 되돌릴 수 없이 삭제합니다. 데이터베이스 또는 서버의 모든 키를 삭제하려는 경우에만이 명령을 실행하는 것이 좋습니다.

이러한 명령을 실수로 실행할 가능성이 낮은 이름으로 이러한 명령을 다시 지정하는 것이 좋을 수 있습니다.

선택한 데이터베이스에서 모든 키를 삭제하려면 flushdb 명령을 사용하세요:

  1. flushdb

Redis 서버의 모든 데이터베이스에서 (현재 선택한 데이터베이스 포함) 모든 키를 삭제하려면 flushall을 실행하세요:

  1. flushall

flushdbflushallasync 옵션을 허용하며, 이를 사용하여 단일 데이터베이스 또는 클러스터의 모든 데이터베이스에서 키를 비동기적으로 삭제할 수 있습니다. 이는 unlink 명령과 유사하게 작동하며, 백그라운드에서 메모리를 점진적으로 해제하기 위한 새로운 스레드를 생성합니다.

데이터베이스 백업

현재 선택한 데이터베이스의 백업을 만들려면 save 명령을 사용할 수 있습니다:

  1. save

이것은 현재 데이터셋의 스냅샷을 내보내어 내부 압축 직렬화 형식으로 데이터를 보유하는 .rdb 파일로 내보냅니다.

save 명령은 동기적으로 실행되며 데이터베이스에 연결된 다른 클라이언트를 차단합니다. 따라서 save 명령 설명에 따르면 이 명령은 거의 프로덕션 환경에서 실행되지 않아야 합니다. 대신 bgsave 명령을 사용하는 것이 권장됩니다. 이는 Redis에게 데이터베이스를 포크하도록 지시합니다. 부모 프로세스는 계속해서 클라이언트를 서비스하며 자식 프로세스는 데이터베이스를 저장한 후 종료됩니다:

  1. bgsave

클라이언트가 bgsave 작업이 진행되는 동안 데이터를 추가하거나 수정하면 이러한 변경 사항이 스냅샷에 포착되지 않습니다.

또한 Redis 구성 파일을 편집하여 데이터베이스에 일정 시간마다 자동으로 스냅샷을 저장하도록 설정할 수도 있습니다(이를 snapshotting 또는 RDB 모드라고 함). 최소 변경 사항이 있으면 save point로 알려진 것입니다. 다음은 redis.conf 파일에서 기본으로 활성화된 저장 지점 설정입니다:

/etc/redis/redis.conf
. . .
save 900 1
save 300 10
save 60 10000
. . .
dbfilename "nextfile.rdb"
. . .

이러한 설정으로 Redis는 적어도 하나의 키가 변경된 경우 900초마다 데이터베이스의 스냅샷을 dbfilename 매개변수로 정의된 파일로 내보냅니다. 적어도 10개의 키가 변경된 경우 300초마다, 그리고 10000개의 키가 변경된 경우 60초마다 내보냅니다.

shutdown 명령을 사용하여 Redis 데이터를 백업한 다음 연결을 닫을 수 있습니다. 이 명령은 데이터베이스에 연결된 모든 클라이언트를 차단한 다음 적어도 하나의 저장 지점이 구성된 경우 save 작업을 수행하므로 현재 상태의 데이터베이스를 .rdb 파일로 내보냅니다. 클라이언트가 변경 사항을 가하지 못하도록 합니다.

또한, shutdown 명령은 append-only mode가 활성화된 경우 종료하기 전에 Redis의 추가 전용 파일에 변경 사항을 플러시합니다. 추가 전용 파일 모드(AOF)는 스냅샷 이후에 .aof로 끝나는 파일에 서버의 모든 쓰기 작업 로그를 생성하는 것을 포함합니다. AOF 및 RDB 모드를 동일한 서버에서 활성화할 수 있으며, 두 영속성 방법을 모두 사용하는 것은 데이터를 백업하는 효과적인 방법입니다.

요약하면, shutdown 명령은 본질적으로 최근 변경 사항을 추가 전용 파일에 모두 플러시하고 Redis 인스턴스에 대한 연결을 닫는 차단 save 명령입니다:

경고: shutdown 명령은 위험한 것으로 간주됩니다. Redis 서버의 클라이언트를 차단하여 데이터를 사용자 및 응용 프로그램에 제공할 수 없게 할 수 있습니다. Redis의 동작을 테스트하거나 Redis 서버의 모든 클라이언트를 차단하려는 경우에만이 명령을 실행하는 것이 좋습니다.

사실, 실수로 실행될 가능성이 낮은 다른 이름으로이 명령을 이름을 변경하는 것이 관심사일 수도 있습니다.

  1. shutdown

저장 지점을 구성하지 않았지만 Redis가 save 작업을 수행하려는 경우 shutdown 명령에 save 옵션을 추가하십시오:

  1. shutdown save

Redis 서버를 최소한 하나의 저장 지점으로 구성했지만 저장하지 않고 Redis 서버를 종료하려는 경우 명령에 nosave 인수를 추가할 수 있습니다:

  1. shutdown nosave

시간이 지남에 따라 append-only 파일이 매우 커질 수 있지만, redis.conf 파일을 편집하여 특정 변수를 기반으로 파일을 다시 작성하도록 Redis를 구성할 수 있습니다. 또한 bgrewriteaof 명령을 실행하여 append-only 파일을 다시 작성하도록 Redis에 지시할 수도 있습니다:

  1. bgrewriteaof

bgrewriteaof는 데이터베이스를 현재 상태로 되돌리기 위해 필요한 가장 짧은 명령 세트를 생성합니다. 이 명령의 이름이 나타내는 바와 같이, 이 명령은 백그라운드에서 실행됩니다. 그러나 이미 백그라운드 프로세스에서 다른 지속성 명령이 실행 중인 경우, Redis가 bgrewriteaof를 실행하기 전에 해당 명령을 완료해야 합니다.

결론

이 안내서에서는 데이터베이스 및 키를 관리하는 데 사용되는 여러 명령을 설명합니다. 이 안내서에서 학습하고 싶은 다른 관련 명령, 인수 또는 절차가 있다면, 질문하거나 댓글에서 제안해 주세요.

Redis 명령에 대한 자세한 정보는 Redis 데이터베이스 관리 방법 튜토리얼 시리즈를 확인하세요.

Source:
https://www.digitalocean.com/community/cheatsheets/how-to-manage-redis-databases-and-keys