Computer >> 컴퓨터 >  >> 프로그래밍 >> Redis

Redis에서 대용량 리스트 안전하게 삭제하는 방법

Redis에서 큰 객체 삭제가 느린 이유를 더 자세히 알고 싶다면 이 개요 문서를 먼저 참고해 보세요.

Redis는 기본적으로 단일 스레드로 동작하기 때문에, DEL 명령으로 수백만 개의 요소를 가진 리스트를 한 번에 삭제하면 그동안 다른 모든 요청이 블로킹될 수 있습니다. 따라서 대용량 리스트를 삭제할 때는 아래와 같은 단계별 접근이 권장됩니다.

삭제 전략

  1. 키 이름 변경(Rename): 대상 키를 고유한 네임스페이스를 가진 새 키로 변경합니다. 이렇게 하면 다른 Redis 클라이언트 입장에서는 해당 리스트가 즉시 "삭제된" 것처럼 보입니다.

  2. 배치 단위 점진 삭제: 리스트의 요소를 작은 배치(예: 100개씩)로 나누어 조금씩 삭제하고, 리스트가 완전히 빌 때까지 반복합니다. 삭제 명령의 크기를 제한하면 서버가 오랜 시간 블로킹되는 것을 방지할 수 있습니다.

다만 아래 예제 코드는 Redis 연결 실패 상황을 우아하게 처리하지 않습니다. 실행 중 Redis 명령이 실패하여 예외가 발생하면, 남은 잔여 키는 직접 수동으로 정리해 주어야 합니다.

의사 코드(Pseudo-code)

# 키 이름 변경
newkey = "gc:hashes:" + redis.INCR("gc:index")
redis.RENAME("my.list.key", newkey)

# 100개씩 배치로 요소 잘라내기
while redis.LLEN(newkey) > 0
  redis.LTRIM(newkey, 0, -99)
end

Ruby 구현 예제

$redis = Redis.new

def delete_list(key)
  # 키 이름 변경
  newkey = "gc:lists:#{$redis.incr("gc:index")}"
  $redis.rename(key, newkey)

  # 100개씩 배치로 요소 잘라내기
  while $redis.llen(newkey) > 0
    $redis.ltrim(newkey, 0, -99)
  end
end

# 사용 예:
#
#   delete_list("my.large.list")

백그라운드 잭(Job) 활용

이러한 삭제 작업은 시간이 걸릴 수 있으므로, 실무에서는 백그라운드 잡으로 처리하는 것이 좋습니다. Ruby 진영에서 널리 쓰이는 다음 두 라이브러리로 위 로직을 손쉽게 구현할 수 있습니다.

  • Resque
  • Sidekiq

← "Redis에서 대용량 객체 삭제"로 돌아가기