Post

Redis 키 관리: 생성부터 만료까지

키의 생성과 삭제 메커니즘, 키 조회와 관리를 위한 커맨드, 만료 시간 설정 옵션

Redis 키 관리: 생성부터 만료까지

1. 키의 생성과 삭제

  • 키가 존재하지 않을 때 아이템을 넣으면 아이템을 삽입하기 전에 빈 자료 구조를 생성한다
  • 모든 아이템을 삭제하면 키도 자동으로 삭제된다 (stream은 예외)
  • 키가 없는 상태에서 키 삭제, 아이템 삭제, 자료 구조 크기 조회 같은 읽기 전용 커맨드를 수행하면 에러를 반환하는 대신 키가 있으나 아이템이 없는 것처럼 동작한다



2. 키와 관련된 커맨드

  • 자료 구조에 상관없이 모든 키에 공통적으로 사용할 수 있는 커맨드

2-1. 키 조회

  • EXISTS
    • 키가 존재하면 1을, 존재하지 않으면 0을 반환한다
  • KEYS
    • 매칭되는 패턴에 해당하는 모든 키의 list를 반환
    • 패턴은 Glob pattern 스타일로 동작
    • 레디스는 싱글 스레드로 동작하기 때문에 KEYS 명령을 수행하기 위해 메모리에 저장된 모든 키를 읽어오는 동안 마스터는 다른 동작을 할 수 없다
  • SCAN
    • KEYS를 대체해 키를 조회할 때 사용할 수 있는 커맨드로 커서를 기반으로 특정 범위의 키만 조회할 수 있다
    • COUNT 옵션
      • 기본적으로 한 번에 반환되는 키의 개수는 10개 정도
      • COUNT 옵션을 사용하면 이 반환되는 키의 개수를 조정할 수 있다. 하지만 데이터는 정확하게 지정한 개수만큼 출력되지 않는데, 레디스는 메모리를 스캔하며 데이터가 저장된 형상에 따라 몇 개의 키를 더 읽는 것이 효율적이라고 판단하면 1~2개의 키를 더 읽은 뒤 함께 반환하기도 한다.
    • MATCH 옵션
      • MATCH 옵션을 사용해 입력한 패턴에 맞는 키 값을 조회한다
      • SCAN 커맨드에서 MATCH 옵션을 사용할 때에는 우선 데이터를 필터링 없이 스캔한 다음 데이터를 반환하기 직전 필터링하는 방식으로 동작. 따라서 적은 수의 결과가 반환되거나 빈 값이 반환될 수 있다.
    • TYPE 옵션
      • TYPE 옵션을 사용해 지정한 타입의 키만 조회할 수 있다
      • MATCH 옵션처럼 사용자에게 반환되기 전에 필터되는 방식으로 동작하기 때문에 원하는 타입을 조회하기까지 오래 걸릴 수 있다
    • SSCAN, HSCAN, ZSCAN
      • SCAN과 비슷한 커맨드로 각각 set, hash, sorted set에서 아이템을 조회하기 위해 사용하는 SMEMBERS, HGETALL, ZRANGE WITHSCORE를 대체
      • 서버에 최대한 영향을 끼치지 않고 반복 호출할 수 있도록 사용하는 커맨드
  • SORT
    • list, set, sorted set에서만 사용할 수 있는 커맨드
    • 키 내부의 아이템을 정렬해 반환
    • LIMIT 옵션을 사용해 일부 데이터만 조회할 수 있다
    • ASC/DESC 옵션을 사용해 정렬 순서를 변경할 수 있다
    • 정렬할 대상이 문자열일 경우 ALPHA 옵션을 사용하면 사전 순 정렬해 조회 가능
  • RENAME/RENAMENX
    • RENAME/RENAMENX 커맨드 모두 키의 이름을 변경하는 커맨드다. 하지만 RENAMENX 커맨드는 변경할 키가 존재하지 않을 때만 동작
  • COPY
    • source에 지정된 키를 destination 키에 복사한다
    • destination에 지정한 키가 이미 있는 경우 에러가 반환되는데, REPLACE 옵션을 사용하면 destination 키를 삭제한 뒤 값을 복사하기 때문에 에러가 발생하지 않는다
  • TYPE
    • 지정한 키의 자료 구조 타입을 반환한다
  • OBJECT
    • 키에 대한 상세 정보를 반환한다
    • ENCODING, IDLETIME 등의 옵션이 있으며, 해당 키가 내부적으로 어떻게 저장됐는지, 혹은 키가 호출되지 않은 시간이 얼마나 됐는지 등을 확인할 수 있다


2-2. 키의 삭제

  • FLUSHALL
    • 레디스에 저장된 모든 키를 삭제
    • 기본적으로 FLUSHALL 커맨드는 SYNC한 방식으로 동작해 모든 데이터가 삭제된 경우에만 OK를 반환해서 커맨드가 실행되는 도중에는 다른 응답을 처리할 수 없다
    • ASYNC 옵션을 사용하면 flush는 백그라운드로 실행되고, 커맨드가 수행됐을 때 존재했던 키만 삭제해서 flush 중 새로 생성된 키는 삭제하지 않는다
  • DEL
    • 키와 키에 저장된 모든 아이템을 삭제하는 커맨드
    • 기본적으로 동기적으로 작동
  • UNLINK
    • DEL과 비슷하게 키와 데이터를 삭제하는 커맨드
    • 백그라운드에서 다른 스레드에 의해 처리되며, 우선 키와 연결된 데이터의 연결을 끊는다
    • 키에 저장된 아이템이 많은 경우 DEL이 아니라 UNLINK를 사용해 데이터를 삭제하는 것이 좋다
      • set, sorted set과 같이 하나의 키에 여러 개의 아이템이 저장된 자료 구조의 경우 1개의 키를 삭제하는 DEL 커맨드를 수행하는 것은 레디스 인스턴스에 영향을 끼칠 가능성 존재
      • 100만 개의 아이템이 저장돼 있는 sorted set 키를 DEL 커맨드로 삭제하는 것은 전체 키가 100만 개 있는 레디스에서 동기적인 방식으로 FLUSH ALL을 수행하는 것과 같다
      • 수행되는 시간 동안 다른 클라이언트는 아무런 커맨드를 사용할 수 없다


2-3. 키의 만료 시간

  • EXPIRE
    • 키가 만료될 시간을 초 단위로 정의할 수 있다
    • options
      • NX: 해당 키에 만료 시간이 정의돼 있지 않을 경우에만 커맨드 수행
      • XX: 해당 키에 만료 시간이 정의돼 있을 때만 커맨드 수행
      • GT: 현재 키가 가지고 있는 만료 시간보다 새로 입력한 초가 더 클 때만 수행
      • LT: 현재 키가 가지고 있는 만료 시간보다 새로 입력한 초가 더 작을 때만 수행
  • EXPIREAT
    • 키가 특정 유닉스 타입스탬프에 만료될 수 있도록 키의 만료 시간을 직접 지정
    • 사용할 수 있는 옵션은 EXPIRE와 동일
  • EXPIRETIME
    • 키가 삭제되는 유닉스 타임스탬프를 초 단위로 반환
    • 키가 존재하지만 만료 시간이 설정돼 있지 않은 경우에는 -1을, 키가 없을 때는 -2를 반환
  • TTL
    • 키가 몇 초 뒤에 만료되는지 반환
    • 키가 존재하지만 만료 시간이 설정돼 있지 않는 경우에는 -1을, 키가 없을 때는 -2를 반환
This post is licensed under CC BY 4.0 by the author.