캐싱의 개념은 컴퓨터 과학에서 중요한 개념이며 웹 앱 구축과 직접적인 관련이 있습니다. 높은 수준에서 캐싱은 메모리 조회가 데이터베이스 쿼리보다 더 빠르고 계산 집약적이라는 사실을 활용합니다. 반복적으로 수행될 수 있는 데이터베이스 쿼리가 있는 경우 결과를 캐시에 캐싱하면 실행 흐름 속도가 빨라집니다. Rails 애플리케이션도 예외는 아닙니다. Redis와 같은 메모리 기반 캐시를 사용하여 데이터를 캐시하고 애플리케이션 성능을 향상시키는 경우가 많기 때문입니다.

데이터베이스 캐시를 사용한다는 아이디어는 비생산적으로 들릴 수 있습니다. 그럼에도 불구하고 Rails의 Solid Cache와 같은 느린 데이터베이스 지원 캐시를 사용하면 더 저렴한 스토리지를 통해 더 오랜 기간 동안 더 많은 항목을 캐시할 수 있으므로 직관에 반해 애플리케이션 속도가 빨라질 수 있습니다. Rails 7.1에는 Solid Cache가 도입되어 데이터베이스 기반 애플리케이션 캐시가 Rails 애플리케이션에 편리한 옵션이 되었습니다!
Rails 캐시 작동 방식
Ruby on Rails의 캐싱은 애플리케이션 성능을 최적화하는 데 중요한 부분입니다. 개발자가 성능을 향상시키기 위해 사용할 수 있는 캐싱 유형에는 페이지 캐싱, 작업 캐싱, 조각 캐싱, 하위 수준 캐싱, SQL 캐싱 등이 있습니다. 이 글에서는 간단하고 구성 가능한 cache_store와 호환되는 저수준 캐싱에 대해 주로 설명하겠습니다. .
Rails 프레임워크의 큰 부분인 ActiveSupport를 사용하면 cache_store를 통해 캐시와 상호 작용하고 구성할 수 있습니다. . config/environments/에서 , 캐시 저장소 선택을 포함하여 다양한 구성의 각 환경 이름을 가진 파일이 있습니다.
cache_store 값 설정
Redis는 매우 인기 있는 캐시 저장소이며 업계 전반에 걸쳐 널리 채택되었습니다. 애플리케이션이 프로덕션에서 캐싱을 위해 Redis를 사용하는 경우 config/environments/production.rb에서 다음 Ruby 줄을 볼 수 있습니다. :
config.cache_store = :redis_cache_store
Redis는 메모리 캐시이기 때문에 사용되며, 메모리는 전통적으로 디스크 액세스나 데이터베이스 쿼리보다 읽기 액세스 시간이 훨씬 빠릅니다.
Rails에서 데이터베이스 쿼리 캐싱
자주 변경되지 않는 데이터를 반환하는 값비싼 데이터베이스 쿼리의 결과를 저장하기 위해 낮은 수준의 캐싱을 사용할 수 있습니다. 다음과 같이 보일 수 있습니다:
Rails.cache.fetch("courses", expires_in: 12.hours) do
Courses.all
end
Redis를 캐시 저장소로 사용하는 경우 이 코드는 먼저 키 "courses"에 지난 12시간 동안의 값이 있는지 확인합니다. 그렇다면 코드 블록을 실행하지 않고 해당 값을 반환합니다. 캐시에 해당 값이 없으면 "캐시 누락"이라고 합니다. 캐시 미스가 발생하면 인터프리터가 블록을 실행하고 결과를 캐시에 저장한 다음 결과를 반환하게 됩니다.
Rails 솔리드 캐시란 무엇인가요?
위에서 살펴본 캐싱 패턴은 예를 들어 API 호출 및 데이터베이스 쿼리보다 메모리 액세스가 빠르기 때문에 성능 이점을 제공합니다. 그러나 메모리는 비싸다 , 따라서 제한됩니다. 메모리는 제한되어 있으므로 캐시에 저장하는 내용과 그 기간을 최소화해야 합니다. 캐시의 메모리가 빨리 부족해지기 때문에 모든 것을 무기한으로 캐시할 수는 없습니다. 캐싱으로 인한 성능상의 이점은 모두 절충에 관한 것입니다. 시간이 많이 걸리는 작업을 반복할 필요가 없도록 일부 항목을 한동안 캐시합니다.
Rails 7.1 릴리스에는 ActiveRecord::Cache::Store의 옵션인 Solid Cache가 함께 제공되었습니다. 캐시 저장소로 SQL 데이터베이스를 사용합니다. 캐시에서 읽을 때마다 속도가 느려지지만 기술 발전과 많은 데이터베이스에 내장된 메모리 캐시 덕분에 그 차이는 여전히 유용합니다.
SQL 데이터베이스를 캐시 저장소로 사용하면 더 적은 비용으로 몇 배 더 많은 저장소를 얻을 수 있으므로 애플리케이션이 더 오랜 기간 동안 더 많은 데이터를 캐시할 수 있습니다. Basecamp 팀은 이로 인해 애플리케이션 속도가 어떻게 향상되었는지에 대한 기사를 작성했는데, 이는 직관에 반하는 것처럼 보일 수 있습니다.
솔리드 캐시는 언제 사용해야 하나요?
Redis와 같은 메모리 캐시는 일반적으로 캐시에서 더 빠른 읽기를 제공하지만 Solid Cache는 여러 시나리오에서 이러한 옵션에 대한 좋은 대안을 제시합니다.
애플리케이션에서 대량의 데이터를 캐싱해야 하는 경우 이를 메모리에 저장하는 데 엄청난 비용이 들 수 있습니다. 솔리드 캐시를 사용하면 적은 비용으로 훨씬 더 큰 캐시 크기를 사용할 수 있습니다.
애플리케이션이 몇 밀리초의 추가된 캐시 검색 시간에 크게 민감하지 않은 경우 Solid Cache는 성능과 비용 간의 탁월한 균형을 제공합니다. 대기 시간 증가 가능성을 감당할 수 있다면 Solid Cache가 좋은 솔루션입니다.
이와 별도로, 별도의 Redis 인스턴스를 관리하는 것이 비현실적인 설정에서 Solid Cache는 Redis를 지원할 필요 없이 기존 데이터베이스에서 캐싱을 처리할 수 있도록 하여 배포를 단순화합니다.
솔리드 캐시 설치
Solid Cache Readme에는 이를 Rails 애플리케이션에 도입하는 데 유용한 지침이 있습니다. 먼저 Gemfile에 gem을 추가하세요:
gem "solid_cache"
다음으로, Bundler를 사용하여 설치하세요:
bundle install
다음으로 데이터베이스가 Solid Cache와 작동하도록 마이그레이션을 추가합니다. 다음을 실행하세요:
bin/rails solid_cache:install:migrations
마지막으로 생성된 마이그레이션을 실행하세요:
bin/rails db:migrate
Rails 앱에서 솔리드 캐시 구현
기존 캐시에 대해 Solid Cache를 교체하는 것은 일반적으로 간단합니다. 환경 구성(예:config/environments/production.rb) , cache_store를 변경하세요. 다음으로 설정:
config.cache_store = :solid_cache_store
이것이 Solid Cache를 캐시 저장소로 사용하기 시작하는 데 필요한 전부입니다! 다른 모든 ActiveSupport::Cache::Store을 지원합니다. 구성 옵션과 데이터베이스 샤딩 또는 기타 고유한 요구 사항을 지원하는 추가 옵션이 있습니다.
이는 프로덕션의 캐시 저장소만 변경하므로 다른 환경에서 테스트하는 경우 해당 환경에서도 값을 변경하는 것이 좋습니다.
Rails에서 솔리드 캐시로 전환하시겠습니까?
Rails 7.1의 Solid Cache 도입은 Rails 캐싱 전략의 세계에서 중요한 발전을 가져왔습니다. 이 솔루션은 Redis와 같은 메모리 기반 캐시에 대한 기존 선호에 도전하면서 애플리케이션 성능 최적화에 대한 새로운 관점을 제공합니다.
캐싱을 위해 SQL 데이터베이스를 활용함으로써 Solid Cache는 애플리케이션이 장기간 더 많은 양의 데이터를 저장할 수 있도록 하여 메모리 스토리지의 비용과 용량으로 인한 한계를 극복합니다. 이 접근 방식은 효과적으로 캐시할 수 있는 항목의 양을 늘릴 뿐만 아니라 훨씬 더 큰 성능 이점을 제공할 수 있는 잠재력도 있습니다.
즉, 전환 결정은 애플리케이션의 특정 요구 사항에 따라 달라집니다. 애플리케이션이 고속 캐싱의 이점을 크게 누리고 Redis를 지원하는 인프라가 있는 경우 Solid Cache가 필요하지 않을 수도 있습니다. 그러나 스택에 다른 서비스를 추가하지 않고 방대한 양의 데이터를 캐시하는 비용 효율적인 방법을 찾고 있다면 Solid Cache를 고려해 볼 가치가 있습니다. 단지 Redis 지원을 피하고 싶은 경우에도 Solid Cache가 귀하의 앱에 충분할 수 있습니다.
이 기사가 마음에 드셨다면 Honeybadger 뉴스레터에 가입하여 이와 같은 Ruby 및 Rails 기사를 더 많이 받아보세요.