Redis 및 Memcache 또는 Redis?


85

간단한 Rails.cache인터페이스를 통해 Rails 3 앱의 일부 캐싱에 memcached를 사용 하고 있으며 이제 redis 및 resque로 일부 백그라운드 작업 처리를 수행하고 싶습니다.

둘 다 사용할 수있을만큼 충분히 다르다고 생각합니다. 그러나 heroku에서는 memcached와 redis를 모두 사용하는 데 별도의 수수료가 있습니다. 둘 다 사용하는 것이 합리적입니까, 아니면 redis 만 사용하도록 마이그레이션해야합니까?

가장 최근에 사용한 키가 캐시에서 자동으로 푸시되고 유지하기 위해 캐시 데이터가 필요하지 않기 때문에 캐시에 memcached를 사용하는 것을 좋아합니다. Redis는 대부분 저에게 처음이지만 기본적으로 영구적이며 키가 캐시에서 자동으로 만료되지 않는다는 것을 이해합니다.

편집 : 내 질문에 더 명확하고 싶었습니다. 둘 다 대신 Redis 만 사용하는 것이 가능하다는 것을 알고 있습니다. 그렇게하는 데 특정한 단점이 있는지 알고 싶은 것 같아요? 구현과 인프라를 모두 고려할 때 Redis를 사용해서는 안되는 이유가 있습니까? (즉, 간단한 캐싱을 위해 memcached가 더 빠릅니까?) 어느 쪽이든 확실한 것을 찾지 못했습니다.


5
이것을 고려하는 다른 사람들을 위해 : redis를 캐시 저장소로 사용할 수있는 레일 용 redis-store 플러그인이 있습니다.
markquezada 2010

답변:


49

이미 수행 한 캐싱을 위해 memcached에서 redis로 마이그레이션하는 것이 충분히 쉽다고 가정하면 redis를 사용하여 간단하게 유지하겠습니다.

redis에서 지속성은 선택 사항이므로 원하는 경우 memcached와 매우 유사하게 사용할 수 있습니다. 캐시를 영구적으로 만드는 것이 재시작 후 많은 캐시 누락을 방지하는 데 유용하다는 것을 알 수도 있습니다. Expiry도 사용할 수 있습니다. 알고리즘은 memcached와 약간 다르지만 대부분의 목적에 적합하지는 않습니다 . 자세한 내용 은 http://redis.io/commands/expire 를 참조하십시오.


1
답변과 관련 문서에 감사드립니다. 나는 내가 찾고있는 것을 더 명확하게하기 위해 내 질문을 약간 편집했습니다. 다시 시작한 후 캐시 지속성에 대해 생각하지 않았습니다. 좋은 기능입니다. (잘 모르겠어요하지만 어떻게 내가 Heroku가 함께 갈 레디 스를 사용하는 것 고려 유용합니다.)
markquezada

1
일부 항목은 임시 (단편 캐싱)로 유지하고 일부 항목은 redis에서 영구적으로 유지하려면 두 개의 별도 redis 인스턴스를 만들어야합니까?
Brian Armstrong

1
작업 대기열과 캐시 모두에 Redis를 사용하는 동안 @BrianArmstrong이 명시한 이유 때문에 다른 구성으로 실행합니다. 캐시는 일시적이므로 빠른 속도로 구성하지만 메모리에서 항목을 잃고 LRU를 삭제하는 것은 괜찮습니다. 대기열의 경우 작업을 잃고 싶지 않으므로 복구 할 수 있도록 지속성으로 구성합니다.
jwadsack 2014

@jwadsack이 구성을 구현 한 방법을 보여주는 게시물이 있습니까?
Marklar

1
@Marklar 좋은 생각입니다. 나는 지금한다 : ballardhack.wordpress.com/2015/09/30/…
jwadsack

44

저는 redis-store 의 작성자이며 Redis 명령을 직접 사용할 필요가 없습니다 :expires_in. 다음과 같은 옵션을 사용하면됩니다 .

ActionController::Base.cache_store = :redis_store, :expires_in => 5.minutes

Redis를 사용할 때의 장점은 견뢰도이며 제 보석과 함께 이미 Rack::Cache, Rails.cache또는 I18n.


응답 Luca에 감사드립니다. 지속적으로 무언가를 저장해야 할 때 : expires_in을 직접 재정의 할 수 있다고 가정하고 있습니다. 질문은 실제로 memcached 유형 기능 사용하고 redis를 서로 함께 영구 저장소로 사용하는 것에 관한 것입니다.
markquezada

3
동일한 NoSQL 세그먼트에 있기 때문에 memcached와 redis를 함께 사용하는 것은 의미가 없다고 생각합니다. 둘 다 ak / v 저장소입니다. Redis PROS : 1. memcached보다 빠름 2. 더 강력한 명령 3. 캐시 워밍업이 필요하지 않음 4. 다른 문제를 해결하는 데 유용함 (예 : Resque를 사용하는 큐) 단점 : 1. 외부 gem이 필요합니다. 2. 다시 시작한 후 서버 추가 파일에서 데이터를 읽는 동안 명령을 허용하지 않습니다. Memcached PROS : Rails에서 구운 CONS : 1. Redis보다 느립니다. 2. 캐시 워밍업.
Luca Guidi 2011 년

3
@LucaGuidi 저는 현재 Rails 캐시에 RedisStore를 사용하고 있습니다. Redis URL 기본값을 모두 설정하는 방법을 알 수 없습니다 :expires_in. 도울 수 있니?
Chris Vincent

나처럼 :expires_inredis_store를 사용하여 문제 설정에 직면 한 경우 stackoverflow.com/questions/20907247/…을
Anirudhan J

19

Memcached와 Redis를 모두 사용하는 대규모 레일 사이트를 몇 개 보았습니다. Memcached는 메모리를 뜨겁게 유지하는 것은 좋지만 필요한 경우 손실 / 재생성 할 수있는 임시 작업에 사용되며 영구 저장소에는 Redis가 사용됩니다. 둘 다 읽기 / 쓰기 무거운 작업을 위해 메인 DB에서 부하를 제거하는 데 사용됩니다.

자세한 내용은:

Memcached : 페이지 / 조각 / 응답 캐싱에 사용되며 Memcached의 메모리 제한에 도달해도 괜찮습니다. LRU (최근에 가장 적게 사용됨)를 사용하여 이전 항목을 만료시키고 액세스 된 키를 자주 메모리에서 핫 상태로 유지하기 때문입니다. 필요한 경우 Memcached의 모든 항목을 DB에서 다시 만들 수 있어야합니다 (유일한 복사본이 아님). 그러나 계속해서 물건을 덤핑 할 수 있으며 Memcached는 가장 자주 사용되는 것을 파악하고 메모리에서 핫 상태를 유지합니다. Memcached에서 항목을 제거하는 것에 대해 걱정할 필요가 없습니다.

redis : 손실을 원하지 않는 데이터에 사용하고 메모리에 맞을만큼 작습니다. 여기에는 일반적으로 resque / sidekiq 작업, 속도 제한을위한 카운터, 분할 테스트 결과 또는 손실 / 재생성을 원하지 않는 모든 것이 포함됩니다. 여기에서 메모리 한도를 초과하고 싶지 않으므로 나중에 무엇을 저장하고 정리할지에 대해 조금 더주의해야합니다.

Redis는 메모리 제한을 초과하면 성능 문제가 발생하기 시작합니다 (내가 틀렸다면 수정). Memcached 및 LRU 만료 항목처럼 작동하도록 Redis를 구성하여이 문제를 해결할 수 있으므로 메모리 제한에 도달하지 않습니다. 그러나 Resque 작업과 같이 Redis에 보관하는 모든 항목으로이 작업을 수행하고 싶지는 않습니다. 따라서 사람들이 종종 기본값을 유지하는 대신 Rails.cache가 Memcached를 사용하도록 설정합니다 ( dalli젬 사용). 그런 다음 redis 작업을 수행하기 위해 별도의 $ redis = ... 전역 변수를 유지합니다.

# in config/application.rb
config.cache_store = :dalli_store  # memcached

# in config/initializers/redis.rb
$redis = $redis = Redis.connect(url: ENV['REDIS_URL'])

Redis에서이 모든 작업을 쉽게 수행 할 수있는 방법이있을 수 있습니다. 하나는 Memcache와 유사한 LRU 하드 메모리 제한이있는 두 개의 개별 Redis 인스턴스를, 다른 하나는 영구 스토리지를위한 것입니까? 나는 이것이 사용되는 것을 보지 못했지만 그것이 가능할 것이라고 생각합니다.


15

이 주제에 대한 내 대답을 확인하는 것이 좋습니다.

Rails와 캐싱, Memcache와 Redis간에 쉽게 전환 할 수 있습니까?

본질적으로 내 경험을 통해 나는 캐싱을 위해 memcached, 데이터 구조 및 더 지속적인 스토리지를 위해 redis를 별도로 유지하는 것을 옹호합니다.


처음에는 내 질문에 대한 원래 답변을 기반으로 통합하려고 계획했지만 기본적으로 동일한 결론에 도달했습니다. 기본 캐싱에는 memcache를 사용하고 resque에는 redis를 사용하고 있습니다.
markquezada 2010

6

Redis Labs ( Memcached CloudRedis Cloud 추가 기능 을 제공하는) 의 팀 에게 Rails 캐싱에 어떤 제품을 추천할지 물었습니다 . 그들은 일반적으로 Redis Cloud를 권장하고 Memcached Cloud는 주로 레거시 목적으로 제공되며 Memcached Cloud 서비스는 실제로 Redis Cloud를 기반으로 구축된다는 점을 지적했습니다.


그렇다면 Brian의 답변에서 언급했듯이 memcached와 redis가 모두 필요하지 않습니까? "사람들은 종종 (dalli gem을 사용하여) memcached를 사용하도록 설정된 기본 Rails.cache를 유지합니다. 그런 다음 redis 작업을 수행하기 위해 별도의 $ redis = ... 전역 변수를 유지합니다."
Marklar 2014-10-29

4

나는 당신이 그것들을 무엇에 사용하고 있는지 모르지만 실제로 둘 다 사용하면 성능 이점을 얻을 수 있습니다 .Memcached는 Redis보다 여러 코어에서 실행되는 성능이 훨씬 우수하므로 Memcached로 가장 중요한 데이터를 캐싱하고 나머지는 Redis에 유지합니다. , 데이터베이스 기능을 활용하면 성능이 향상 될 수 있습니다.


1
그것은 전적으로 사실이 아닙니다. redis는 다중 스레드가 아닌 다중 인스턴스를 사용하므로 단일 코어 redis 인스턴스를 다중 코어 memcached 인스턴스와 비교하는 것은 특별히 관련성있는 테스트가 아닙니다. 게다가 두 시스템이 가장 빠르다는 벤치 마크를 사용할 수있는 경우 실제 세계에서는 차이가 중요하지 않을 수 있습니다.
Tom Clarkson

redis의 다중 프로세스 접근 방식은 멀티 스레딩을 사용하는 memcached의 (기본) 접근 방식보다 멀티 코어 시스템에서 더 잘 확장됩니다. antirez.com/post/update-on-memcached-redis-benchmark.html
Ludger Sprenker 2010

3
Redis의이 주요 단점은 실제로 많이 경시됩니다. 높은 동시성을 찾고 있으며 많은 코어가있는 경우 Memcached는 Redis를 중심으로 원을 실행할 수 있습니다. 샤딩은 애플리케이션에서 일관된 해싱을 구현해야하고 Redis 인스턴스간에 완벽한 배포를 얻지 못하기 때문에 좋은 솔루션이 아닙니다. 예를 들어 샤드 A가 모든 요청에 ​​사용되는 애플리케이션의 구성을 캐시하는 경우 샤드 A는 모든 요청에 ​​대해 적중되지 않은 다른 샤드보다 더 많은 요청을받습니다.
ColinM
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.