Redis는 단지 캐시입니까?


255

Redis 문서를 읽고 http://try.redis-db.com/ 에서 자습서를 시도했습니다 . 지금까지 Redis와 Velocity 또는 Enterprise Library Caching Framework와 같은 캐싱 기술의 차이점을 볼 수 없습니다

고유 키를 사용하여 메모리 내 데이터 저장소에 객체를 효과적으로 추가하는 것입니다. 관계형 의미론이없는 것 같습니다 ...

내가 무엇을 놓치고 있습니까?


3
에서 redis.io : 레디 스 오픈 소스, 고급 키 - 값 저장소입니다. 키는 문자열, 해시, 목록, 세트 및 정렬 된 세트를 포함 할 수 있으므로 종종 데이터 구조 서버라고합니다. 즉, 귀하의 질문이 StackOverflow의 형식에 맞지 않기 때문에 귀하의 질문을 마무리하기로 결정했습니다.
Linus Thiel

29
동의하지 않는 형식에 동의합니다. 그것이 더 적절할 것이라고 생각하십니까?
매트 에반스

답변:


631

아니요, Redis는 캐시 그 이상입니다.

캐시와 마찬가지로 Redis는 키 = 값 쌍을 저장합니다. 그러나 캐시와 달리 Redis를 사용하면 값을 조작 할 수 있습니다. Redis에는 문자열, 세트, ​​해시, 목록 및 정렬 된 세트의 5 가지 데이터 유형이 있습니다. 각 데이터 유형은 다양한 작업을 노출합니다.

Redis를 이해하는 가장 좋은 방법은 응용 프로그램을 데이터베이스에 저장하는 방법을 생각하지 않고 응용 프로그램을 모델링하는 것입니다.

StackOverflow.com을 구축한다고 가정하겠습니다. 간단하게 유지하려면 질문, 답변, 태그 및 사용자가 필요합니다.

모델링 질문, 사용자 및 답변

각 객체는 맵으로 모델링 할 수 있습니다. 예를 들어, 질문은 {id, title, date_asked, votes, ask_by, status} 필드가있는 맵입니다. 마찬가지로 답변은 {id, question_id, answer_text, answers_by, votes, status} 필드가있는지도입니다. 마찬가지로 사용자 객체를 모델링 할 수 있습니다.

이러한 각 객체는 Redis에 직접 해시로 저장할 수 있습니다. 고유 한 ID를 생성하기 위해 atomic incremental 명령을 사용할 수 있습니다. 이 같은 -

$ HINCRBY unique_ids question 1
(integer) 1
$ HMSET question:1 title "Is Redis just a cache?" asked_by 12 votes 0
OK

$ HINCRBY unique_ids answer 1
(integer) 1
$ HMSET answer:1 question_id 1 answer_text "No, its a lot more" answered_by 15 votes 1
OK

투표 처리

이제 누군가가 질문이나 답변을지지 할 때마다 이렇게하면됩니다.

$ HINCRBY question:1 votes 1
(integer) 1
$ HINCRBY question:1 votes 1
(integer) 2

홈페이지 관련 질문 목록

다음으로 가장 최근의 질문을 홈페이지에 표시하려고합니다. .NET 또는 Java 프로그램을 작성하는 경우 질문을 목록에 저장합니다. 이것이 Redis에도 저장하는 가장 좋은 방법입니다.

누군가가 질문을 할 때마다 ID를 목록에 추가합니다.

$ lpush questions question:1
(integer) 1
$ lpush questions question:2
(integer) 1

이제 홈페이지를 렌더링하고 싶을 때 가장 최근 25 개의 질문을 Redis에 요청합니다.

$ lrange questions 0 24
1) "question:100"
2) "question:99"
3) "question:98"
4) "question:97"
5) "question:96"
...
25) "question:76"

이제 ID가 있으므로 파이프 라이닝을 사용하여 Redis에서 항목을 검색하여 사용자에게 표시하십시오.

투표별로 정렬 된 태그 별 질문

다음으로 각 태그에 대한 질문을 검색하려고합니다. 그러나 SO를 사용하면 각 태그 아래에서 가장 많이 투표 된 질문, 새로운 질문 또는 답변되지 않은 질문을 볼 수 있습니다.

이를 모델링하기 위해 Redis의 Sorted Set 기능을 사용합니다. 정렬 된 집합을 사용하면 점수를 각 요소와 연결할 수 있습니다. 그런 다음 점수를 기준으로 요소를 검색 할 수 있습니다.

계속해서 Redis 태그에 대해 수행하십시오.

$ zadd questions_by_votes_tagged:redis 2 question:1 
(integer) 1
$ zadd questions_by_votes_tagged:redis 10 question:2 
(integer) 1
$ zadd questions_by_votes_tagged:redis 5 question:613 
(integer) 1
$ zrange questions_by_votes_tagged:redis 0 5 
1) "question:1"
2) "question:613"
3) "question:2"
$ zrevrange questions_by_votes_tagged:redis 0 5 
1) "question:2"
2) "question:613"
3) "question:1"

우리는 여기서 무엇을 했습니까? 정렬 된 세트에 질문을 추가하고 각 질문에 점수 (득표 수)를 연결했습니다. 질문이 올 때마다 점수가 올라갑니다. 그리고 사용자가 "투표로 분류 된 질문 태그 Redis"를 클릭하면, 우리는 단지 zrevrange질문을하고 다시 질문을받습니다.

페이지를 새로 고치지 않고 실시간 질문

그리고 마지막으로 보너스 기능입니다. 질문 페이지를 열어 놓으면 SO는 새로운 질문이 추가 될 때 알려줍니다. Redis가 어떻게 도와 드릴까요?

Redis에는 pub-sub 모델이 있습니다. 채널을 만들 수 있습니다 (예 : "channel_questions_tagged_redis"). 그런 다음 subscribe특정 채널을 사용하는 사용자입니다. 새 질문이 추가되면 publish해당 채널에 메시지가 표시됩니다. 그런 다음 모든 사용자가 메시지를받습니다. 실제로 메시지를 브라우저에 전달하려면 웹 소켓이나 혜성과 같은 웹 기술을 사용해야하지만 Redis는 서버 측의 모든 배관 작업을 도와줍니다.

지속성, 신뢰성 등

캐시와 달리 Redis는 하드 디스크의 데이터를 유지합니다. 더 나은 안정성을 제공하기 위해 마스터 슬레이브 설정을 할 수 있습니다. 자세한 내용은 여기 지속성 및 복제 주제를 참조하십시오 -http : //redis.io/documentation


15
PUB / SUB 관련 명령을 사용하는 매우 간단한 서비스 버스이기도합니다.
Jim Dennis

3
사용자별로 질문을 검색하려면 어떻게해야합니까? 질문 : 사용자 : 1과 같이 질문이있는 각 사용자에 대한 목록을 만들어야합니까?
Diogo Alves

2
나는 모든 SO에 볼 것이 매우 유용하고 상세하게 설명
Trong 데자뷰를

5

캐시 만이 아닙니다.

  • 메모리 키-값 저장
  • 여러 데이터 유형 (문자열, 해시, 목록, 세트, ​​정렬 된 세트, 비트 맵 및 하이퍼 로그) 지원
  • 캐시 데이터를 물리적 스토리지에 저장하는 기능을 제공합니다 (필요한 경우).
  • pub-sub 모델 지원
  • Redis 캐시는 고 가용성 (마스터 / 슬레이브)을위한 복제 기능을 제공합니다

4

Redis는 초고속 루아 스크립트와 같은 고유 한 기능을 가지고 있습니다. 실행 시간은 C 명령 실행과 같습니다. 또한 잠금 및 세마포어와 같은 많은 고급 객체 작업에 필요한 정교한 Redis 데이터 조작에 원 자성을 제공합니다.

Redisson 이라는 메모리 데이터 그리드에 기반한 Redis가있어 Java에서 분산 애플리케이션 을 쉽게 빌드 할 수 있습니다 . 분산 된 덕분에 Lock, Semaphore, ReadWriteLock, CountDownLatch, ConcurrentMap객체 및 많은 다른 사람.

클라우드에서 완벽하게 작동하고 AWS Elasticache , AWS Elasticache ClusterAzure Redis Cache 지원 지원


1

실제로 상대 데이터 표현 (또는 모든 유형의 데이터 표현)과 데이터베이스 역할 (캐시, 영구 지속성 등) 간에는 종속성이 없습니다.

Redis는 캐시에 적합하지만 사실은 캐시에 불과합니다. 고속 완전 인 메모리 데이터베이스입니다. 디스크의 데이터를 유지합니다. 관계형이 아니며 키-값 저장 장치입니다.

우리는 생산에 사용합니다. Redis는 초당 수천 건의 요청을 처리하고 전체 자연 수명주기 동안 고객 비즈니스 데이터를 유지하는 소프트웨어를 구축 할 수 있도록 도와줍니다.


0

Redis는 분산 환경 / 마이크로 서비스 아키텍처에 가장 적합한 캐시입니다.

빠르고 안정적이며 원자 성과 일관성을 제공하며 세트, 해시, 목록 등과 같은 다양한 데이터 유형을 가지고 있습니다.

나는 지난 1 년 동안 그것을 사용하고 있으며 항상 데이터를 캐시하는 데 사용할 수 있으므로 프로덕션 준비 솔루션을 매우 빠르게 제공해야하고 성능 관련 문제가 발생할 때 실제로 구세주가됩니다.


0

캐시 서버 외에도 Redis는 특히 데이터 구조 서버입니다. 데이터 구조는 프로그램이나 응용 프로그램의 기본이기 때문에 데이터 구조 서버 형태의 캐시라는 것은 많은 의미가 있습니다 . 스토리지 기술로 SQL 데이터베이스를 사용하고 있으며 목록, 해시 맵, 순위 설정 등을 구성해야한다고 생각하면 목에 통증이 있습니다. Redis는 이러한 기능을 매우 간단한 방법으로 직접 제공 할 수 있으므로 개발을 매우 단순화합니다.

한편, 데이터 구조 서버는 캐시 형태 일 필요는 없습니다. Redis와 호환되는 프로젝트가 있지만 영구 스토리지 엔진이 있습니다.


0

Redis는 문자열, 해시, 목록, 세트, ​​범위 쿼리가있는 정렬 된 세트, 비트 맵, 하이퍼 로그, 반경 쿼리 및 스트림이있는 지리 공간 인덱스와 같은 데이터 구조를 지원합니다. Redis는 기본 제공 복제, Lua 스크립팅, LRU 제거, 트랜잭션 및 다양한 디스크 내 지속성을 보유하고 있으며 Redis Sentinel을 통해 고 가용성을 제공하고 Redis Cluster를 사용한 자동 파티셔닝을 제공합니다.

파이썬으로 구현

https://beyondexperiment.com/vijayravichandran06/redis-data-structure-with-python/

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