간단한 Rails.cache
인터페이스를 통해 Rails 3 앱의 일부 캐싱에 memcached를 사용 하고 있으며 이제 redis 및 resque로 일부 백그라운드 작업 처리를 수행하고 싶습니다.
둘 다 사용할 수있을만큼 충분히 다르다고 생각합니다. 그러나 heroku에서는 memcached와 redis를 모두 사용하는 데 별도의 수수료가 있습니다. 둘 다 사용하는 것이 합리적입니까, 아니면 redis 만 사용하도록 마이그레이션해야합니까?
가장 최근에 사용한 키가 캐시에서 자동으로 푸시되고 유지하기 위해 캐시 데이터가 필요하지 않기 때문에 캐시에 memcached를 사용하는 것을 좋아합니다. Redis는 대부분 저에게 처음이지만 기본적으로 영구적이며 키가 캐시에서 자동으로 만료되지 않는다는 것을 이해합니다.
편집 : 내 질문에 더 명확하고 싶었습니다. 둘 다 대신 Redis 만 사용하는 것이 가능하다는 것을 알고 있습니다. 그렇게하는 데 특정한 단점이 있는지 알고 싶은 것 같아요? 구현과 인프라를 모두 고려할 때 Redis를 사용해서는 안되는 이유가 있습니까? (즉, 간단한 캐싱을 위해 memcached가 더 빠릅니까?) 어느 쪽이든 확실한 것을 찾지 못했습니다.
답변
이미 수행 한 캐싱을 위해 memcached에서 redis로 마이그레이션하는 것이 충분히 쉽다고 가정하면 redis를 사용하여 간단하게 유지하겠습니다.
redis에서 지속성은 선택 사항이므로 원하는 경우 memcached와 매우 유사하게 사용할 수 있습니다. 캐시를 영구적으로 만드는 것이 재시작 후 많은 캐시 누락을 방지하는 데 유용하다는 것을 알 수도 있습니다. Expiry도 사용할 수 있습니다. 알고리즘은 memcached와 약간 다르지만 대부분의 목적에 적합하지는 않습니다 . 자세한 내용 은 http://redis.io/commands/expire 를 참조하십시오.
답변
저는 redis-store 의 작성자이며 Redis 명령을 직접 사용할 필요가 없습니다 :expires_in
. 다음과 같은 옵션을 사용하면됩니다 .
ActionController::Base.cache_store = :redis_store, :expires_in => 5.minutes
Redis를 사용할 때의 장점은 견뢰도이며 제 보석과 함께 이미 Rack::Cache
, Rails.cache
또는 I18n
.
답변
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 인스턴스를, 다른 하나는 영구 스토리지를위한 것입니까? 나는 이것이 사용되는 것을 보지 못했지만 그것이 가능할 것이라고 생각합니다.
답변
이 주제에 대한 내 대답을 확인하는 것이 좋습니다.
Rails와 캐싱, Memcache와 Redis간에 쉽게 전환 할 수 있습니까?
본질적으로 내 경험을 통해 나는 캐싱을 위해 memcached, 데이터 구조 및 더 지속적인 스토리지를 위해 redis를 별도로 유지하는 것을 옹호합니다.
답변
Redis Labs ( Memcached Cloud 및 Redis Cloud 추가 기능 을 제공하는) 의 팀 에게 Rails 캐싱에 어떤 제품을 추천할지 물었습니다 . 그들은 일반적으로 Redis Cloud를 권장하고 Memcached Cloud는 주로 레거시 목적으로 제공되며 Memcached Cloud 서비스는 실제로 Redis Cloud를 기반으로 구축된다는 점을 지적했습니다.
답변
나는 당신이 그것들을 무엇에 사용하고 있는지 모르지만 실제로 둘 다 사용하면 성능 이점을 얻을 수 있습니다 .Memcached는 Redis보다 여러 코어에서 실행되는 성능이 훨씬 우수하므로 Memcached로 가장 중요한 데이터를 캐싱하고 나머지는 Redis에 유지합니다. , 데이터베이스 기능을 활용하면 성능이 향상 될 수 있습니다.