[caching] Redis는 단지 캐시입니까?

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

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

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



답변

아니요, 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


답변

캐시 만이 아닙니다.

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

답변

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

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

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


답변

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

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

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


답변

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

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

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


답변

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

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


답변

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

파이썬으로 구현

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