Redis 성능 병목 현상 이해하기: 큰 핵심 문제를 최적화하는 방법은 무엇입니까?

참여하는 글입니다"골든스톤 프로젝트"

1. Redis의 큰 핵심 문제는 무엇입니까

Redis의 큰 키 문제는 특정 키에 해당하는 값이 차지하는 상대적으로 큰 메모리 공간을 말하며, 이로 인해 Redis 성능 저하, 메모리 부족, 데이터 불균형, 마스터-슬레이브 동기화 지연 등의 문제가 발생합니다.

얼마나 많은 데이터가 빅 키로 간주됩니까?

고정된 기준은 없으며, 일반적으로 문자열 타입의 키에 해당하는 값이 1M 이상의 공간을 차지하거나, 컬렉션 타입의 k 원소의 개수가 10,000개를 초과하는 경우 큰 키로 간주된다.

Redis 빅 키 문제의 정의 및 평가 기준은 고정된 것이 아니라 Redis의 실제 적용 및 비즈니스 요구 사항을 기반으로 종합적으로 평가되어야 합니다. 예를 들어 동시성이 높고 대기 시간이 짧은 시나리오에서는 10kb만 큰 키를 구성할 수 있지만 낮은 동시성, 고용량 환경에서는 큰 키에 대한 제한이 100kb일 수 있습니다. 따라서 Redis를 설계하고 사용할 때 비즈니스 요구 사항 및 성능 지표를 기반으로 합리적이고 큰 키 임계값을 설정해야 합니다.

2. 빅키의 영향

  1. 메모리 사용량이 너무 높습니다. 큰 키는 너무 많은 메모리 공간을 차지하므로 사용 가능한 메모리가 부족하여 메모리 제거 전략이 트리거될 수 있습니다. 극단적인 경우 메모리가 소진되고 Redis 인스턴스가 충돌하여 시스템 안정성에 영향을 미칠 수 있습니다.
  2. 성능이 떨어집니다. 큰 키는 많은 양의 메모리 공간을 차지하므로 메모리 조각화가 증가하고 Redis의 성능에 영향을 미칩니다. 읽기, 쓰기 및 삭제와 같은 큰 키를 사용하는 작업은 더 많은 CPU 시간과 메모리 리소스를 소비하여 시스템 성능을 더욱 저하시킵니다.
  3. 다른 작업을 차단합니다. 큰 키에 대한 특정 작업으로 인해 Redis 인스턴스가 차단될 수 있습니다. 예를 들어 DEL 명령을 사용하여 큰 키를 삭제하면 Redis 인스턴스가 일정 시간 동안 다른 클라이언트 요청에 응답할 수 없게 되어 시스템의 응답 시간과 처리량에 영향을 줄 수 있습니다.
  4. 네트워크 정체. 큰 키를 획득할 때마다 많은 양의 네트워크 트래픽이 생성되어 시스템 또는 LAN의 대역폭을 완전히 활용하고 동시에 다른 서비스에 영향을 미칠 수 있습니다. 예를 들어 큰 키는 1MB를 차지하며 초당 1000번 방문하면 1000MB의 트래픽이 발생합니다.
  5. 마스터-슬레이브 동기화 지연. Redis 인스턴스가 마스터-슬레이브 동기화로 구성된 경우 큰 키로 인해 마스터-슬레이브 동기화가 지연될 수 있습니다. 큰 키는 더 많은 메모리를 차지하기 때문에 동기화 프로세스 중에 많은 양의 데이터를 전송해야 하며, 이는 마스터와 슬레이브 간의 네트워크 전송 지연을 증가시켜 데이터 일관성에 영향을 미칩니다.
  6. 데이터 왜곡. Redis 클러스터 모드에서 특정 데이터 조각의 메모리 사용량은 다른 데이터 조각보다 훨씬 높으며 데이터 조각의 메모리 리소스는 균형을 이룰 수 없습니다. 또한 Redis 메모리가 maxmemory 매개변수로 정의된 상한에 도달하여 중요한 키가 제거되거나 메모리 오버플로가 발생할 수도 있습니다.

3. 키가 큰 이유

  1. 비즈니스 디자인이 부당합니다. 이것이 가장 일반적인 이유인데, 많은 양의 데이터를 하나의 키에 저장하지 말고 여러 키에 분산시켜야 합니다. 예를 들어, 국가 데이터를 도와 행정 구역에 따라 34개의 키로 분할하거나 도시에 따라 300개의 키로 분할하면 큰 키가 생성될 확률을 더 줄일 수 있습니다.
  2. 가치의 역동적인 성장 문제는 예견되지 않습니다. 삭제 메커니즘, 만료 메커니즘 또는 개수 제한 없이 가치 데이터를 계속 추가하면 조만간 큰 키가 나타날 것입니다. 예: Weibo 스타의 팬 목록, 인기 댓글 등
  3. 만료 시간이 제대로 설정되지 않았습니다. 특정 키에 대해 만료 시간이 설정되지 않았거나 만료 시간이 더 길게 설정된 경우. 시간이 지남에 따라 값의 수가 빠르게 축적되어 결국 큰 키를 형성합니다.
  4. 프로그램 버그. 일부 비정상적인 조건으로 인해 일부 키의 수명 주기가 예상을 초과하거나 값의 수가 비정상적으로 증가하고 큰 키도 생성됩니다.

4. 큰 키 문제 해결 방법

4.1 스캔 명령

Redis의 SCAN 명령을 사용하여 데이터베이스의 모든 키를 단계별로 확인할 수 있습니다. 다른 명령(예: STRLEN, LLEN, SCARD, HLEN 등)과 결합하여 큰 키를 식별할 수 있습니다. SCAN 명령의 장점은 Redis 인스턴스를 차단하지 않고 순회할 수 있다는 것입니다.

4.2 빅키 매개변수

redis-cli 명령 클라이언트를 사용하여 Redis 서비스에 연결할 때 --bigkeys 매개 변수를 추가하여 각 데이터 유형의 번호가 가장 큰 키를 스캔합니다.

redis-cli -h 127.0.0.1 -p 6379 —빅키

4.3 Redis RDB 도구 도구

오픈 소스 도구 Redis RDB 도구를 사용하여 RDB 파일을 분석하고 큰 Redis 키를 스캔합니다.

예: 1kb 이상의 메모리를 차지하는 상위 3개의 키를 출력합니다.

rdb —공통 메모리 —바이트 1024 —가장 큰 3 dump.rbd

5. 큰 열쇠를 푸는 방법

  1. 여러 개의 작은 키로 분할합니다. 단일 키의 크기를 줄이기 위해 mget을 사용하여 일괄적으로 읽을 수 있습니다.
  2. 데이터 압축. String 타입을 사용할 때 값의 크기를 줄이기 위해 압축 알고리즘을 사용합니다. 또는 기본 해시 유형이 압축 목록 데이터 구조를 사용하므로 해시 유형 스토리지를 사용하십시오.
  3. 합리적인 만료 시간을 설정하십시오. 각 키에 대한 만료 시간을 설정하고 합리적인 만료 시간을 설정하여 만료 후 데이터가 자동으로 정리되도록 하여 장기간에 걸쳐 큰 키가 누적되는 문제를 방지합니다.
  4. 메모리 제거 정책을 활성화합니다. LRU(최소 최근 사용, 최소 최근 사용)와 같은 Redis의 메모리 제거 전략을 활성화하여 메모리가 부족할 때 가장 최근에 사용되지 않은 데이터를 자동으로 제거하여 큰 키가 오랫동안 메모리를 차지하는 것을 방지합니다.
  5. 데이터 샤딩. 예를 들어 Redis 클러스터를 사용하여 여러 Redis 인스턴스에 데이터를 배포하여 단일 인스턴스의 부담을 줄이고 큰 핵심 문제의 위험을 줄입니다.
  6. 큰 키를 삭제합니다. UNLINK 명령을 사용하여 큰 키를 삭제합니다. UNLINK 명령은 DEL 명령의 비동기 버전입니다. Redis 인스턴스 차단을 방지하기 위해 백그라운드에서 키를 삭제할 수 있습니다.

6. 요약

큰 핵심 문제는 성능 저하, 높은 메모리 사용량, 다른 작업 차단 및 마스터-슬레이브 동기화 지연과 같은 문제로 이어질 수 있는 Redis의 일반적인 문제 중 하나입니다. 이 기사에서는 큰 키의 원인, 결과, 탐지 방법 및 해결 방법을 자세히 소개합니다. 데이터 구조 설계를 최적화하고, 합리적인 데이터 만료 정책을 설정하고, 시스템 아키텍처 및 구성을 최적화하고, 큰 키를 점진적으로 삭제함으로써 큰 ​​키 문제를 효과적으로 해결하고 방지하여 Redis 시스템의 안정성과 성능을 향상시킬 수 있습니다.

저는 "이등건축"입니다. 이 글이 도움이 되셨다면 모두 좋아요와 댓글, 관심 부탁드립니다. 베테랑 여러분 감사합니다. 다음 호에서 뵙겠습니다.

Guess you like

Origin juejin.im/post/7222825885203218491