[redis] 여러 Redis 데이터베이스의 요점은 무엇입니까?

그래서 때로는 특정 유형의 데이터에서 keys 명령을 사용해야 할 때 redis에 저장된 데이터를 별도의 데이터베이스로 분할하고 더 빠르게 만들기 위해 분리하고 싶었던 곳으로 왔습니다. .

여러 데이터베이스로 분할하면 모든 것이 여전히 단일 스레드이며 여전히 하나의 코어 만 사용할 수 있습니다. 같은 상자에서 다른 Redis 인스턴스를 시작하면 추가 코어를 사용할 수 있습니다. 또한 Redis 데이터베이스의 이름을 지정하거나 더 많은 논리적 식별자를 제공 할 수 없습니다. 그래서, 모두 말했듯이, 왜 내가 원하는 여분의 데이터베이스마다 여분의 Redis 인스턴스를 회전시키는 대신 여러 Redis 데이터베이스를 사용하고 싶습니까? 그리고 관련하여 Redis가 추가하는 각 추가 데이터베이스마다 추가 코어를 사용하려고 시도하지 않는 이유는 무엇입니까? 데이터베이스에서 단일 스레드를 사용하면 어떤 이점이 있습니까?



답변

원칙적으로 동일한 인스턴스의 Redis 데이터베이스는 RDBMS 데이터베이스 인스턴스의 스키마와 다르지 않습니다.

그래서, 모두 말했듯이, 왜 내가 원하는 여분의 데이터베이스마다 여분의 Redis 인스턴스를 회전시키는 대신 여러 Redis 데이터베이스를 사용하고 싶습니까?

동일한 redis 인스턴스에서 redis 데이터베이스를 사용하면 확실한 이점이 있습니다. 바로 이것이 바로 관리입니다. 각 애플리케이션마다 별도의 인스턴스를 가동하고 3 개의 앱이 있다고 가정 해 봅시다. 즉, 3 개의 개별 redis 인스턴스이며, 각 인스턴스는 프로덕션 환경에서 HA의 슬레이브가 필요하므로 총 6 개의 인스턴스입니다. 관리 관점에서 볼 때, 모든 모니터링, 업그레이드 / 패치 등을 수행해야하기 때문에이 작업이 매우 어려워집니다. 높은 I / O로 Redis를 오버로드 할 계획이없는 경우 슬레이브가있는 단일 인스턴스가 더 간단하고 SLA를 충족하면 관리가 쉬워집니다.


답변

단일 redis 인스턴스에서 여러 데이터베이스를 사용하고 싶지 않습니다. 사용되지 않으며 여러 인스턴스를 사용하면 여러 코어를 활용할 수 있습니다. 데이터베이스 선택을 사용하는 경우 업그레이드시 리팩토링해야합니다. 여러 인스턴스를 모니터링하고 관리하는 것은 어렵거나 고통스럽지 않습니다.

실제로 인스턴스를 기준으로 분리하여 각 DB에 대해 훨씬 더 나은 메트릭을 얻을 수 있습니다. 각 인스턴스에는 해당 데이터 세그먼트를 반영하는 통계가 있으므로 더 나은 조정 및보다 신속하고 정확한 모니터링이 가능합니다. 최신 버전을 사용하고 인스턴스별로 데이터를 분리하십시오.

Jonaton이 말했듯이 keys 명령을 사용하지 마십시오. 단순히 키 인덱스를 작성하면 성능이 훨씬 향상됩니다. 키를 추가 할 때마다 키 이름을 세트에 추가하십시오. 키 명령은 확장하는 데 상당한 시간이 걸리므로 일단 확장하면별로 유용하지 않습니다.

액세스 패턴은 데이터가 생각하는 방식으로 저장하는 대신 데이터를 구성하는 방법을 결정한 다음 나중에 액세스하고 다듬는 방법을 해결하도록합니다. 성능이 훨씬 향상되고 데이터 소비 코드가 훨씬 더 깨끗하고 단순하다는 것을 알 수 있습니다.

단일 스레드와 관련하여 redis는 속도와 원 자성을 위해 설계된 것입니다. 한 db에서 데이터를 수정하는 확실한 조치는 다른 db를 기다릴 필요가 없지만 해당 조치가 덤프 파일에 저장되거나 슬레이브에서 트랜잭션을 처리하는 경우 어떻게됩니까? 그 시점에서 동시성 프로그래밍의 잡초에 들어가기 시작합니다.

다중 인스턴스를 사용하면 다중 스레딩 복잡성을 간단한 메시지 전달 스타일 시스템으로 바꿀 수 있습니다.


답변

Salisore Sanfilippo (Redis의 제작자)조차도 Redis에서 여러 DB를 사용하는 것은 좋지 않다고 생각합니다. 그의 의견을 여기에서보십시오 :

https://groups.google.com/d/topic/redis-db/vS5wX8X4Cjg/discussion

이것이 어떻게 유용 할 수 있는지 이해하지만 불행히도 Redis 다중 데이터베이스 오류는 Redis 디자인에서 최악의 결정이라고 생각합니다. 실제 이익이 없으면 내부가 훨씬 더 복잡해집니다. 실제로는 키 및 VM의 활성 만료와 같은 여러 가지 이유로 데이터베이스가 제대로 확장되지 않습니다. DB 선택을 문자열로 수행 할 수 있다면이 기능이 확장 가능한 O (1) 사전 계층으로 사용되는 것을 볼 수 있습니다. 대신 그렇지 않습니다.

DB 번호를 사용하면 기본적으로 몇 개의 DB가 있으므로이 기능이 무엇인지, 어떻게 사용할 수 있는지 더 잘 통신합니다. 어느 시점에서 우리는 다중 DB 지원을 전혀 중단 할 수 있기를 희망하지만 많은 사람들이 작업 에이 기능에 의존하기 때문에 너무 늦을 것이라고 생각합니다.


답변

  1. 단일 인스턴스에서 여러 데이터베이스를 사용하면 어떤 이점이 있는지 잘 모르겠습니다. 여러 서비스가 동일한 데이터베이스 서버를 사용하는 경우 유용하므로 키 충돌을 피할 수 있습니다.

  2. 나는 KEYS명령이 O (n)이고 확장 성이 좋지 않기 때문에 명령을 사용하여 구축하는 것을 권장 하지 않습니다. 다른 방법으로 달성 할 수 있도록 무엇을 사용하고 있습니까? 아마도 같은 기능 KEYS이 중요 하다면 redis가 가장 적합하지 않을 것 입니다.

  3. 나는 그들이 FAQ에 단일 스레드 서버의 이점을 언급한다고 생각하지만, 가장 중요한 것은 단순성입니다. 실제로 동시성을 귀찮게 할 필요가 없습니다. 모든 작업이 차단되므로 두 가지로 동시에 데이터베이스를 변경할 수 없습니다. 이상적으로는 각 서버의 코어 당 하나 이상의 인스턴스가 있고 일관된 해싱 알고리즘 (또는 프록시)을 사용하여 키를 서로 나누는 것이 좋습니다. 물론 일부 기능을 잃어 버릴 수 있습니다. 배관은 동일한 서버의 항목에서만 작동하고 종류가 더 어려워집니다.


답변

나는 이메일 주소의 블랙리스트를 구현하기 위해 redis를 사용하고 있으며, 블랙리스트의 레벨에 따라 다른 TTL 값을 가지므로 같은 인스턴스에 다른 DB를두면 많은 도움이된다.


답변

Redis 데이터베이스는 새로운 버전의 응용 프로그램을 배포하는 드문 경우에 사용할 수 있으며, 새 버전은 다른 엔티티와 작업해야합니다.


답변

단일 인스턴스에서 여러 데이터베이스를 사용하면 다음 시나리오에서 유용 할 수 있습니다.

실시간 데이터를 사용하여 프로덕션, 개발 또는 테스트에 동일한 데이터베이스의 다른 사본을 사용할 수 있습니다. 사람들은 복제본을 사용하여 동일한 목적을 달성하기 위해 redis 인스턴스를 복제 할 수 있습니다. 그러나 전자의 접근 방식은 기존 실행중인 프로그램이 원하는 모드로 전환하기 위해 올바른 데이터베이스를 선택하는 것이 더 쉽습니다.