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


159

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

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


Node.js 앱에서 ---> module.exports = { "1": "redis db one의 이름", "2": "redis db two의 이름", "3": "your 필요에 따라 redis db three "} 등의 이름을 지정하거나 키와 값을 전환하십시오.
Alexander Mills

1
Redis 2.8.0 이상에서는 KEYS 대신 SCAN을 사용하는 것이 좋습니다. KEYS는 한 번에 적은 수의 요소를 반복하므로 서버를 장기간 차단하지 않기 때문입니다.
TryHarder

답변:


85

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

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

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


25
여러 Redis 인스턴스가 항상 진행됩니다. 기간. 다른 데이터에 대해 병렬 쿼리를 실행하십시오. 당신의 CICD 파이프 라인은 당신을 위해 캐시 클러스터를 작성하지 않는 경우, ..... 당신은 지점 얻을보다는, 그것을 해결
Cmag

3
이것은 OP 포인트를 다루지 않습니다. (1) Redis가 왜 각 추가 데이터베이스에 대해 추가 코어를 사용하려고하지 않습니까? (2) 데이터베이스에서 단일 스레드를 사용하면 어떤 이점이 있습니까?
ives

93

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

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

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

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

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

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


57
여러 데이터베이스를 사용하는 것이 더 이상 사용되지 않습니까? 그 진술에 대한 참조를 제공 할 수 있습니까? Redis Cluster에서 여러 데이터베이스가 지원되지 않지만 복잡한 다중 키 명령이 아니며 더 이상 사용되지 않습니다.
ostergaard

27
Redis의 '소유자'(Google 코드에 따르면 )의 일부 (강력한) 증거 는 "... 이전에는 내가 말한 것처럼 데이터베이스가 더 이상 사용되지 않을 것입니다."
Kenny Evitt

3
redis-cluster에서 둘 이상의 redis db를 사용할 수 없습니다. 그 외에도 여러 데이터베이스가 여전히 유효합니다.
coredump

26
더 이상 사용되지 않는 명령문의 경우 -1입니다. redis-cluster에서는 여러 데이터베이스를 사용하지 않는 것이 좋지만 지원되지는 않지만 더 이상 사용되지 않습니다.
AgDude

1
@ the-real-bill 어떻게 "키 인덱스를 만들 수 있습니까?"
Kees de Kooter

57

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

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

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

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


4
잠깐, DB 선택을 사용하는 것이 실제로 접두사를 사용하는 것보다 덜 효율적입니까? 이것이이 문장이 의미하는 바입니까 (누군가 명확히 할 수 있습니까)? "문자열로 DB 선택을 수행 할 수 있다면이 기능이 확장 가능한 O (1) 사전 계층으로 사용되는 것을 볼 수 있지만, 그렇지 않습니다."
dvtan

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

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

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


2에 대한 응답으로 모든 키가 필요할 때만 keys 명령을 사용합니다. 나는 hgetall을 사용하는 것과 같은 방식으로 사용합니다. 둘 다 O (n)입니다. 일부 정규식에 대해 거대한 키 집합을 검색 해야하는 경우 키가 좋지 않지만 일부 db의 모든 키에 대해 작업을 수행 해야하는 경우 완벽하게 좋습니다. 3 : 하나의 데이터베이스에서 단일 스레딩의 이점을 이해합니다. 한 데이터베이스에 대한 작업이 다른 데이터베이스 AFAIK에 대한 작업을 차단할 필요가 없기 때문에 많은 데이터베이스에서이를 이해하지 못합니다.
Eli

3

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


1
우리는 이제 같은 문제에 직면하고 있습니다. 데이터의 다른 부분에 대해 다른 LRU 정책을 정의하려고합니다. 어떻게 구현했는지 알려주시겠습니까?
user2717436

@ user2717436 내가하는 일이 당신과 관련이 있는지 확실하지 않지만, 다른 데이터베이스를 다른 세트로 사용하고, 키를 삽입 할 때 항상 키의 TTL을 설정합니다. redis.get (1)에 블랙리스트 A가있는 것처럼 키를 설정할 때마다 expire를 5000으로 설정합니다. redis.get (2)에 블랙리스트 B가 있으며 키를 설정할 때마다 만료 시간을 10000으로 설정합니다.
kommradHomer

2

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


1

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

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


1

나는이 질문이 오래되었다는 것을 알고 있지만 여러 데이터베이스가 유용 할 수있는 또 다른 이유가 있습니다.

선호하는 클라우드 제공 업체의 "cloud Redis"를 사용하는 경우 메모리 크기가 최소이고 할당 한 대가를 지불합니다. 그러나 데이터 세트가 그보다 작 으면 약간의 할당을 낭비하고 약간의 돈을 낭비하게됩니다.

데이터베이스를 사용하면 동일한 Redis 클라우드 인스턴스를 사용하여 개발, UAT 및 프로덕션 또는 애플리케이션의 여러 인스턴스 등을위한 서비스를 제공 할 수 있습니다. 유효한.

내가보고있는 유스 케이스에는 각각 200-300K를 사용하는 애플리케이션의 여러 인스턴스가 있지만 클라우드 제공자의 최소 할당량은 1M입니다. 실제로 제한을 두지 않고 10 개의 인스턴스를 단일 Redis에 통합 할 수 있으므로 Redis 호스팅 비용의 약 90 %를 절약 할 수 있습니다. 이 접근법에는 한계와 문제점이 있지만, 언급 할 가치가 있다고 생각합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.