itsource

레디스엔 언제?언제 MongoDB에 접속합니까?

mycopycode 2023. 3. 23. 22:43
반응형

레디스엔 언제?언제 MongoDB에 접속합니까?

내가 원하는 것은 Redis와 MongoDB의 비교가 아니다.퍼포먼스와 API는 전혀 다릅니다.

Redis는 매우 빠르지만 API는 매우 '원자적'입니다.MongoDB는 자원을 더 많이 소비하지만 API는 매우 사용하기 쉽고 저는 매우 만족합니다.

둘 다 훌륭하고 가능한 한 Redis를 도입에 사용하고 싶지만 코드화가 어렵습니다.가능한 한 MongoDB를 개발에 활용하고 싶은데 비싼 기계가 필요합니다.

그럼 둘 다 사용하는 것에 대해 어떻게 생각하세요?레디스 언제 뽑아요?MongoDB는 언제 뽑을까요?

개발팀의 종류와 어플리케이션의 요구에 따라 달라집니다.

예를 들어, 많은 의 쿼리를 필요로 하는 경우 개발자가 효율성을 위해 다양한 유형의 객체별로 맞춤형으로 데이터를 저장할 수 있는 Redis를 사용하는 것이 더 많은 작업이 필요하다는 것을 의미합니다.MongoDB에서는 데이터 전체에서 구조가 더 일관적이기 때문에 동일한 쿼리가 더 쉬울 수 있습니다.한편 Redis에서는 이러한 쿼리에 대한 응답 속도가 매우 빠르기 때문에 데이터를 저장할 수 있는 다양한 구조를 처리하는 데 필요한 추가 작업이 발생합니다.

MongoDB는 기존 DB 및 SQL 경험을 가진 개발자에게 단순하고 짧은 학습 곡선을 제공합니다.그러나 Redis의 비전통적인 접근방식은 학습에 더 많은 노력이 필요하지만 유연성은 더 높아야 합니다.

를 들어 캐시 레이어는 Redis에서 더 잘 구현될 수 있습니다.스키마 가능한 데이터가 많을 경우 MongoDB가 더 좋습니다.[주의: MongoDB와 Redis는 모두 기술적으로 계략이 없습니다]

제 개인적인 선택은 대부분의 요구 사항에서 레디스입니다.

마지막으로, 지금쯤 http://antirez.com/post/MongoDB-and-Redis.html을 보셨기를 바랍니다.

나는 방금 이 질문이 꽤 오래되었다는 것을 알아차렸다.그럼에도 불구하고, 나는 다음과 같은 측면을 추가할 가치가 있다고 생각한다.

  • 데이터 조회 방법을 아직 모르는 경우 MongoDB를 사용하십시오.

    MongoDB는 해커톤, 스타트업 또는 삽입한 데이터를 어떻게 조회할지 모를 때 적합합니다.MongoDB는 기본 스키마에 대해 어떠한 가정도 하지 않습니다.MongoDB는 스키마가 없고 비관계적이지만 스키마가 전혀 없는 것은 아닙니다.즉, 어플리케이션에서 스키마를 정의해야 합니다(예를 들어 Mongoose 사용).그 밖에도 MongoDB는 프로토타입 제작이나 시용에 매우 적합합니다.성능은 그다지 좋지 않고 레디스와는 비교도 되지 않는다.

  • Redis를 사용하여 기존 응용 프로그램의 속도를 높입니다.

    Redis는 LRU 캐시로 쉽게 통합할 수 있습니다.Redis를 독립형 데이터베이스 시스템으로 사용하는 것은 매우 드문 일입니다(일부 사람들은 이를 "키 가치" 스토어라고 부르는 것을 선호합니다).Craigslist와 같은 웹사이트는 기본 데이터베이스 옆에 Redis를 사용합니다.Antirz(Redis의 개발자)는 Lamernews를 사용하여 Redis를 독립형 데이터베이스 시스템으로 사용할 수 있음을 시연했습니다.

  • Redis는 당신의 데이터를 바탕으로 어떠한 추정도 하지 않습니다.

    Redis는 유용한 데이터 구조(예: 세트, 해시, 목록)를 많이 제공하지만 데이터 저장 방법을 명시적으로 정의해야 합니다.간단히 말하면 레디스나 몽고DB를 사용하여 비슷한 일을 할 수 있습니다.Redis는 단순히 속도가 빠르지만 프로토타이핑에는 적합하지 않습니다.이는 일반적으로 MongoDB를 선호하는 사용 사례 중 하나입니다.게다가 레디스는 정말 유연해요.제공되는 기본 데이터 구조는 고성능 DB 시스템의 구성 요소입니다.

레디스 사용 시기

  • 캐싱

    MongoDB를 사용한 캐싱은 그다지 의미가 없습니다.너무 느릴 것 같아.

  • DB 설계에 대해 생각할 충분한 시간이 있다면.

    레디스에게 서류를 그냥 넘길 순 없어요데이터를 저장하고 정리하는 방법을 생각해야 합니다.레디스의 해시 예시는 다음과 같습니다.이러한 오브젝트는 "기존" 중첩 오브젝트와는 상당히 다르므로 중첩된 문서를 저장하는 방법을 다시 고려해야 합니다.하나의 솔루션은 해시 내의 참조를 다른 해시(키: [id of second hash] 등)에 저장하는 것입니다.또 다른 방법은 JSON으로 저장하는 것입니다. 이는 *SQL 배경을 가진 대부분의 사용자에게는 직관에 반하는 것으로 보입니다.

  • 정말 고성능이 필요하다면.

    레디스가 제공하는 퍼포먼스를 능가하는 것은 거의 불가능하다.데이터베이스 속도가 캐시 속도만큼 빠르다고 상상해 보십시오.그게 레디스를 진짜 데이터베이스로 사용하는 느낌이야

  • 스케일링에 별로 관심이 없다면.

    레디스 확장은 예전만큼 어렵지 않습니다.예를 들어 여러 Redis 인스턴스 간에 데이터를 분산하기 위해 일종의 프록시 서버를 사용할 수 있습니다.마스터-슬레이브 복제는 그다지 복잡하지 않지만 여러 Redis-instance 간에 키를 배포하는 것은 애플리케이션 사이트에서 수행해야 합니다(해시 함수, Modulo 사용 등).이에 비해 MongoDB의 확장은 훨씬 간단합니다.

MongoDB 사용 시기

  • 프로토타이핑, 스타트업, 해커톤

    MongoDB는 신속한 프로토타이핑에 매우 적합합니다.그럼에도 불구하고, 실적은 그다지 좋지 않다.또한 대부분의 경우 응용 프로그램에서 일종의 스키마를 정의해야 합니다.

  • 스키마를 빨리 변경해야 할 경우.

    스키마가 없으니까!기존의 관계형 DBMS에서 테이블을 변경하는 것은 비용이 많이 들고 속도가 느립니다.MongoDB는 기본 데이터에 대해 많은 가정을 하지 않음으로써 이 문제를 해결합니다.그러나 스키마를 정의할 필요 없이 최대한 최적화하려고 합니다.

TL;DR - 성능이 중요하고 데이터 최적화와 정리가 필요한 경우 Redis를 사용합니다.- DB에 대해 너무 걱정하지 않고 프로토타입을 구축해야 할 경우 MongoDB를 사용합니다.

추가 정보:

Redis. 예를 들어 당신이 php로 사이트를 썼다고 가정해 봅시다.어떤 이유로든 그것은 인기를 끌게 되고 시대를 앞서가고 있거나 포르노가 있습니다.이 php가 너무 느려서 "팬들이 10초도 기다리지 않아서 팬을 잃을 것 같아"웹 페이지에는 일정한 URL(변화하지 않음, woa)이 있다는 것을 문득 깨달은 후 메모리는 고속이고 디스크는 저속이며 php는 더 느리다는 것을 기억하게 됩니다. :(그러면 웹 페이지 콘텐츠를 "값"으로 부르기로 결정하는 동안 메모리와 이 URL을 사용하여 스토리지 메커니즘을 만듭니다.키와 콘텐츠는 이것뿐입니다.그걸 '메모 캐시'라고 하죠리처드 도킨스가 멋져서 좋아하잖아다람쥐가 견과류를 캐싱하듯 html을 캐싱합니다.당신은 당신의 쓰레기 php 코드를 다시 쓸 필요가 없습니다.너는 행복하다.그리고 다른 사람들도 그랬다는 것을 알 수 있습니다. 하지만 레디스를 선택한 이유는 다른 한 명은 혼란스러운 고양이의 이미지를 가지고 있고, 일부는 송곳니를 가지고 있기 때문입니다.

몽고, 사이트를 작성했군요.어떤 언어로든 많은 글을 쓰셨군요.SQL 절을 작성하는데 많은 시간이 소요된다는 것을 알고 있습니다.넌 dba도 아닌데 멍청한 SQL 문을 쓰다니...한 명뿐만 아니라 모든 곳을 엉망으로 만들죠"이거 선택해, 저걸 선택해"그러나 특히 당신은 짜증나는 WHERE 조항을 기억한다.여기서 성은 "가슴"이고 영화는 "나쁜 산타"입니다.음. "왜 그 dbas들은 그냥 자기 일을 하고 저장 프로시저를 주면 안 될까?"라고 생각하겠죠.그런 다음 middlename과 같은 작은 필드를 잊어버리고 테이블을 드롭하여 10G의 빅데이터를 모두 내보내고 이 새로운 필드를 사용하여 데이터를 Import합니다.그리고 그 데이터는 앞으로 14일 동안 10번 반복됩니다.그것은 인사말이나 제목, 주소가 기재된 외부 키 추가와 같은 헛소리를 계속 기억하기 때문입니다.그런 다음 성이 성이어야 합니다.거의 하루에 한 번 바뀌어요.그럼 젠장!이 데이터 모델 bs는 신경 쓰지 말고 웹 사이트/시스템을 작성해야 합니다.그래서 "SQL 쓰는 거 싫어, 제발 SQL 쓰지 마, 중지시켜"라고 구글에서 검색하면 "nosql"이라고 뜨면 스키마 없이 데이터가 덤프됩니다.지난주 대실패가 더 많은 테이블과 미소를 떨어뜨린 걸 기억하시죠?그리고 당신은 몽고를 선택하게 되는데, 그 이유는 '에어버드' 같은 덩치 큰 사람들이 몽고를 사용하기 때문이다.좋습니다. 계속 변경하는 모델이 있기 때문에 데이터 모델은 더 이상 변경되지 않습니다.

이 자원은 둘 중 하나를 결정하는 데 도움이 될 수 있습니다.또한 다른 몇 가지 NoSQL 데이터베이스에 대해서도 설명하고 각각의 특성에 대한 간단한 목록과 함께 "사용할 수 있는 용도"에 대한 설명을 제공합니다.

http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis

대답하기 어려운 질문입니다.대부분의 테크놀로지 솔루션과 마찬가지로 상황에 따라 다릅니다.해결하려고 하는 문제에 대해 설명하지 않았기 때문에 어떻게 하면 해결책을 제안할 수 있을까요?

둘 다 테스트하여 어떤 것이 고객의 요구를 충족하는지 확인해야 합니다.

MongoDB는 고가의 하드웨어를 필요로 하지 않습니다.다른 데이터베이스 솔루션과 마찬가지로 CPU와 메모리를 늘리면 더 잘 작동하지만, 특히 초기 개발 목적으로는 필수가 아닙니다.

Redis는 디스크 상태유지할 수 있는 메모리 내 데이터스토어입니다(재시작 후 복구를 활성화하기 위해).그러나 메모리 내 데이터스토어가 된다는 것은 (단일 노드 상의) 데이터스토어의 크기가 시스템의 총 메모리 공간(물리 RAM + 스왑 공간)을 초과할 수 없음을 의미합니다.실제로는 Redis가 시스템상의 다른 많은 프로세스와 이 공간을 공유하고 있기 때문에 운영체제에 의해 메모리 용량이 소진될 가능성이 높아집니다.

Mongo는 디스크 기반의 데이터 스토어로, 모든 소프트웨어와 마찬가지로 물리 RAM에 맞는 작업 세트가 있을 때 가장 효율적입니다.디스크 기반 데이터라는 것은 Mongo 데이터베이스의 크기에 본질적인 제한이 없다는 것을 의미하지만 구성 옵션, 사용 가능한 디스크 공간 및 기타 문제는 데이터베이스 크기가 일정 제한을 초과하면 실용적이지 않거나 비효율적일 수 있다는 것을 의미합니다.

Redis와 Mongo를 모두 클러스터하여 고가용성, 백업 및 데이터스토어 전체 크기를 늘릴 수 있습니다.

모든 답변은 Redis, MongoDB 및 SQL 기반 릴레이셔널 데이터베이스 각각이 기본적으로 동일한 도구인 "데이터 저장"이라고 가정합니다.데이터 모델은 전혀 고려하지 않습니다.

MongoDB: 복잡한 데이터

MongoDB는 문서 저장소입니다.SQL 기반 릴레이셔널 데이터베이스와 비교: 릴레이셔널 데이터베이스는 인덱스 CSV 파일로 단순화되며, 각 파일은 테이블이 되고, 문서 저장소는 여러 파일이 함께 그룹화되어 인덱스된 JSON 파일로 단순화됩니다.

JSON 파일은 XML 및 YAML 파일과 구조가 비슷하며 Python과 마찬가지로 사전과도 비슷하므로 이러한 계층의 데이터를 생각해 보십시오.색인화할 때 구조가 중요합니다. 문서에는 추가 문서, 배열 또는 스칼라 값을 포함하는 명명된 키가 포함됩니다.다음 문서를 검토하십시오.

{
  _id:  0x194f38dc491a,
  Name:  "John Smith",
  PhoneNumber:
    Home: "555 999-1234",
    Work: "555 999-9876",
    Mobile: "555 634-5789"
  Accounts:
    - "379-1111"
    - "379-2574"
    - "414-6731"
}

에는 키가 PhoneNumber.Mobile 「」을 555 634-5789키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 여기서 키는PhoneNumber.Mobile는 어느 정도 가치가 있습니다.인덱스화되어 있습니다.

,, 음, 음, 음, 다 등의 배열이 .Accounts여러 인덱스를 보관합니다.다음 위치에서 문서를 쿼리할 수 있습니다.Accounts에는 값의 서브셋, 의 모든 서브셋 또는 의 서브셋이 정확하게 포함되어 있습니다.즉, 다음과 같이 검색할 수 있습니다.Accounts = ["379-1111", "379-2574"] 수 . . 검색은 가능합니다.Accounts includes ["379-1111"]문서를 .「 」를 검색할 수 . 검색해 보십시오.Accounts includes any of ["974-3785","414-6731"]위 문서와 계정 '974-3785'가 포함된 문서를 찾습니다(있는 경우).

이치 PhoneNumber.Mobile어레이 또는 서브패키지)를할 수 .PhoneNumber.Mobile.Work ★★★★★★★★★★★★★★★★★」PhoneNumber.Mobile.Personal데이터가 고도로 구조화된 경우 문서는 관계형 데이터베이스에서 크게 발전합니다.

데이터가 대부분 무계층, 관계형, 경직된 구조인 경우 관계형 데이터베이스를 사용하는 것이 좋습니다.여기서도 중요한 것은 데이터 모델이 상호 관련된 CSV 파일 모음에 가장 적합한지 아니면 XML/JSON/YAML 파일 모음에 적합한지 여부입니다.

대부분의 프로젝트에서는 SQL 또는 Document Store 중 하나가 적합하지 않은 일부 소규모 영역에서의 사소한 회피책을 수용하는 타협이 필요합니다.또한 광범위한 데이터를 저장하는(많은 열, 행은 무관) 일부 대규모 복잡한 프로젝트에서는 일부 데이터를 한 모델에 저장하고 다른 데이터를 다른 모델에 저장하는 것이 합리적입니다.Facebook은 SQL과 그래프 데이터베이스(데이터를 노드에 넣고 노드를 다른 노드에 연결)를 모두 사용하고 있다.Craigslist는 MySQL과 MongoDB를 사용했지만 MongoDB로의 이행을 검토하고 있었다.이러한 경우 데이터의 범위와 관계가 한 모델에 포함되면 상당한 핸디캡에 직면하게 됩니다.

Redis: 주요 가치

Redis는 기본적으로 핵심 가치 스토어입니다.Redis를 사용하면 키를 지정하고 단일 값을 검색할 수 있습니다.Redis 자체는 문자열, 목록, 해시 및 기타 몇 가지를 저장할 수 있지만 이름으로만 검색됩니다.

캐시 무효화는 컴퓨터 과학의 어려운 문제 중 하나입니다.다른 하나는 이름을 붙이는 것입니다.즉, 백엔드에 대한 수백 개의 과도한 조회를 피하고 싶을 때 Redis를 사용하지만, 새로운 조회가 필요할 때는 파악해야 합니다.

시 입니다. 를 들어, 을 입니다.user:Simon:lingots = NOTFOUND 하면 됩니다.SELECT Lingots FROM Store s INNER JOIN UserProfile u ON s.UserID = u.UserID WHERE u.Username = Simon그 해 두도록 하겠습니다.100 ~로SET user:Simon:lingots = 100에게 5개의때, 은 "5개의 언어"를 읽습니다user:Simon:lingots = 100,SET user:Simon:lingots = 105 , , , , 입니다.UPDATE Store s INNER JOIN UserProfile u ON s.UserID = u.UserID SET s.Lingots = 105 WHERE u.Username = Simon가 있으며, "105"를 수 user:Simon:lingots데이터베이스를 조회하지 않습니다.

두 번째 경우는 종속 정보를 업데이트하는 것입니다.예를 들어 페이지 청크를 생성하고 출력을 캐시한다고 가정합니다.헤더는 플레이어의 경험, 레벨 및 금액을 나타내고, 플레이어의 프로파일 페이지에는 통계를 보여주는 블록 등이 있습니다.그 선수는 경험을 쌓는다. 여러 개의 아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아.templates:Header:Simon,templates:StatsBox:Simon,templates:GrowthGraph:Simon및 기타 필드는 템플릿엔진을 통해 실행되는 반쪽 데이터베이스 쿼리의 출력을 캐시한 것입니다.일반적으로 이러한 페이지를 표시할 때 다음과 같이 표시됩니다.

$t = GetStringFromRedis("templates:StatsBox:" + $playerName);
if ($t == null) {
  $t = BuildTemplate("StatsBox.tmpl",
                     GetStatsFromDatabase($playerName));
  SetStringInRedis("Templates:StatsBox:" + $playerName, $t);
}
print $t;

막 신이 of because の because of because of because because because of 。GetStatsFromDatabase("Simon") , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , .templates:*:Simon이치노 하나를 하면 작업을 처리합니다(는 Postgre는 Postg).SQL, MongoDB)를 사용하여 템플릿에 삽입한 후 결과를 Redis에 저장하고 다음 번에 출력 블록을 표시할 때 데이터베이스 쿼리 및 렌더링 템플릿을 작성할 필요가 없습니다.

또한 Redis를 사용하면 퍼블리셔-서브스크라이브 메시지큐 등을 실행할 수 있습니다.그건 완전히 다른 주제야.여기서 요점은 Redis는 키 값 캐시이며 관계형 데이터베이스 또는 문서 저장소와 다르다는 것입니다.

결론

필요에 따라 도구를 선택합니다.일반적으로 가장 큰 요구는 데이터 모델이며, 이는 코드가 얼마나 복잡하고 오류가 발생하기 쉬운지를 결정합니다.전용 어플리케이션은 퍼포먼스에 의존합니다.C와 어셈블리가 혼재되어 있는 장소입니다.대부분의 어플리케이션은 일반적인 케이스만 처리하고 Redis나 Memcached 등의 캐싱 시스템을 사용합니다.이것은 고성능 SQL 데이터베이스나 문서 스토어보다 훨씬 고속입니다.

또, RAM이 많은 경우는, 어느쪽도 사용하지 말아 주세요.Redis와 MongoDB는 범용 툴의 가격이 됩니다.이로 인해 많은 오버헤드가 발생합니다.

레디스가 몽고보다 10배 빠르다는 말이 있었다.그건 더 이상 사실이 아닐지도 몰라.MongoDB(내 기억이 맞다면)는 메모리 구성이 같은 한 문서를 저장하고 캐시하기 위해 memcache를 두들겨 팼다고 주장했습니다.

아무튼 레드도 좋고 몽고DB도 좋고서브구조에 관심이 있어 어그리게이션이 필요한 경우 MongoDB로 이동합니다.키와 값을 저장하는 것이 주요 관심사라면 Redis에 대한 모든 것입니다.(또는 기타 키 값 저장소).

Redis와 MongoDB는 둘 다 비관계형 데이터베이스이지만 카테고리가 다릅니다.

Redis는 키/밸류 데이터베이스로 In-memory 스토리지를 사용하여 매우 빠르게 작동합니다.캐싱 및 임시 데이터 스토리지(메모리 내) 및 대부분의 클라우드 플랫폼(Azure 등)에 적합합니다.AWS)가 서포트하고 있습니다.메모리 사용량은 측정할 수 있습니다.그러나 리소스가 제한된 머신에서 사용하는 경우에는 메모리 사용량을 고려하십시오.

반면 MongoDB는 문서 데이터베이스입니다.대용량 텍스트, 이미지, 비디오 등을 보관하고 트랜잭션을 제외한 데이터베이스에서 수행하는 거의 모든 작업을 저장할 수 있습니다.예를 들어 블로그나 소셜 네트워크를 개발하고 싶다면 MongoDB를 선택하는 것이 좋습니다.스케일아웃 전략으로 확장할 수 있습니다.Disk를 저장 매체로 사용하기 때문에 데이터가 유지됩니다.

프로젝트가 아직 시작되지 않은 환경에서 충분한 RAM 메모리를 확보할 수 있다면 Redis가 답합니다.특히 클러스터 기능을 갖춘 새로운 Redis 3.2를 고려합니다.

언급URL : https://stackoverflow.com/questions/5400163/when-to-redis-when-to-mongodb

반응형