문서 메뉴
문서 홈
/ / /
Ruby MongoDB Driver
/

쿼리 캐시

이 페이지의 내용

  • 사용법
  • 파이버와의 상호 작용
  • 쿼리 매칭
  • 제한
  • 캐시 무효화
  • 수동 캐시 무효화
  • 트랜잭션
  • 집계
  • 시스템 컬렉션
  • 쿼리 캐시 미들웨어
  • 랙 미들웨어
  • 활성 작업 미들웨어

MongoDB Ruby 드라이버는 내장 쿼리 캐시를 제공합니다. 쿼리 캐시를 활성화하면 이전에 실행된 찾기 및 애그리게이션 쿼리의 결과가 쿼리 캐시에 저장됩니다. 동일한 쿼리가 다시 수행되면 드라이버는 데이터베이스로의 불필요한 왕복을 방지하기 위해 캐시된 결과를 반환합니다.

쿼리 캐시는 기본적으로 비활성화되어 있습니다. 전역 범위뿐만 아니라 특정 블록의 컨텍스트 내에서도 활성화할 수 있습니다. 또한 드라이버는 각 웹 요청에 대해 쿼리 캐시를 자동으로 활성화하는 랙 미들웨어 를 제공합니다.

쿼리 캐시를 전역적으로 활성화하려면 다음을 수행합니다.

Mongo::QueryCache.enabled = true

마찬가지로 전역적으로 비활성화하려면 다음을 수행합니다.

Mongo::QueryCache.enabled = false

차단 컨텍스트 내에서 쿼리 캐시를 활성화하려면 다음을 수행합니다.

Mongo::QueryCache.cache do
Mongo::Client.new([ '127.0.0.1:27017' ], database: 'music') do |client|
client['artists'].find(name: 'Flying Lotus').first
#=> Queries the database and caches the result
client['artists'].find(name: 'Flying Lotus').first
#=> Returns the previously cached result
end
end

그리고 차단의 컨텍스트에서 쿼리 캐시를 비활성화하려면 다음을 수행합니다.

Mongo::QueryCache.uncached do
Mongo::Client.new([ '127.0.0.1:27017' ], database: 'music') do |client|
client['artists'].find(name: 'Flying Lotus').first
#=> Sends the query to the database; does NOT cache the result
client['artists'].find(name: 'Flying Lotus').first
#=> Queries the database again
end
end

Mongo::QueryCache.enabled? 을 호출하여 쿼리 캐시가 활성화되었는지 여부를 언제든지 확인할 수 있으며, 이 경우 true 또는 false 이 반환됩니다.

쿼리 캐시 활성화 플래그는 파이버 로컬 스토리지에 저장됩니다(Thread.current. 이는 현재 테스트되지 않았지만 원칙적으로 쿼리 캐시 상태를 파이버별로 허용합니다.

Ruby 표준 라이브러리에는 Enumerable#next 와(과)같이 파이버를 활용하는 메서드가 있습니다. 구현합니다. 이러한 메서드는 애플리케이션에서 쿼리 캐시 활성화 플래그를 설정할 때 이를 볼 수 없으며 이후 쿼리 캐시를 사용하지 않습니다. 예를 들어 다음 코드는 요청에도 불구하고 쿼리 캐시를 활용하지 않습니다.

Mongo::QueryCache.enabled = true
client['artists'].find({}, limit: 1).to_enum.next
# Issues the query again.
client['artists'].find({}, limit: 1).to_enum.next

이 코드를 next first 를 사용하도록 다시 작성하면 쿼리 캐시를 사용하게 됩니다.

Mongo::QueryCache.enabled = true
client['artists'].find({}, limit: 1).first
# Utilizes the cached result from the first query.
client['artists'].find({}, limit: 1).first

쿼리는 캐시된 결과를 생성한 원래 쿼리와 일치하는 경우 캐시된 결과를 사용할 수 있습니다. 두 쿼리가 다음 값에서 동일한 경우 일치하는 것으로 간주됩니다.

  • 네임스페이스(쿼리가 수행된 데이터베이스 및 collection)

  • 선택기(집계의 경우, 집계 파이프라인 단계)

  • Skip

  • 정렬

  • 프로젝션

  • 데이터 정렬

  • readConcern

  • 읽기 설정

예를 들어 한 쿼리를 수행한 다음 정렬 순서가 다르게 대부분 동일한 쿼리를 수행하는 경우, 해당 쿼리는 일치하는 것으로 간주되지 않으며, 두 번째 쿼리는 첫 번째 쿼리의 캐시된 결과를 사용하지 않습니다.

제한이 있는 쿼리를 수행할 때 쿼리 캐시는 더 큰 제한이 있는 기존 캐시된 쿼리(있는 경우)를 재사용합니다. 예를 들면 다음과 같습니다.

Mongo::QueryCache.cache do
Mongo::Client.new([ '127.0.0.1:27017' ], database: 'music') do |client|
client['artists'].find(genre: 'Rock', limit: 10)
#=> Queries the database and caches the result
client['artists'].find(genre: 'Rock', limit: 5)
#=> Returns the first 5 results from the cached query
client['artists'].find(genre: 'Rock', limit: 20)
#=> Queries the database again and replaces the previously cached query results
end
end

쿼리 캐시는 모든 쓰기 작업에서 부분적으로 또는 전체적으로 지워집니다. 대부분의 쓰기 작업은 기록 중인 동일한 collection에서 수행된 모든 쿼리 결과를 지웁니다. 일부 작업은 전체 쿼리 캐시를 지웁니다.

다음 작업은 동일한 데이터베이스 및 collection에서 캐시된 쿼리 결과를 지웁니다(대량 쓰기 중 포함).

  • insert_one

  • update_one

  • replace_one

  • update_many

  • delete_one

  • delete_many

  • find_one_and_delete

  • find_one_and_update

  • find_one_and_replace

다음 작업은 전체 쿼리 캐시를 지웁니다.

  • $merge 또는 $out 파이프라인 단계를 사용한 집계

  • commit_transaction

  • abort_transaction

다음 방법을 사용하여 언제든지 쿼리 캐시를 지울 수 있습니다:

Mongo::QueryCache.clear

이렇게 하면 캐시된 쿼리 결과가 모두 제거됩니다.

쿼리는 트랜잭션 컨텍스트 내에서 캐시되지만 트랜잭션이 커밋되거나 중단되면 전체 캐시가 지워집니다.

Mongo::QueryCache.cache do
Mongo::Client.new([ '127.0.0.1:27017' ], database: 'music') do |client|
session = client.start_session
session.with_transaction do
client['artists'].insert_one({ name: 'Fleet Foxes' }, session: session)
client['artists'].find({}, session: session).first
#=> { name: 'Fleet Foxes' }
#=> Queries the database and caches the result
client['artists'].find({}, session: session).first
#=> { name: 'Fleet Foxes' }
#=> Returns the previously cached result
session.abort_transaction
end
client['artists'].find.first
#=> nil
# The query cache was cleared on abort_transaction
end
end

참고

트랜잭션은 종종 "스냅샷" 읽기 고려 (read concern) 수준으로 수행됩니다. '스냅샷' 읽기 고려 (read concern)가 있는 쿼리는 '스냅샷' 읽기 고려 (read concern)가 없는 쿼리에서 캐시된 결과를 반환할 수 없으므로 트랜잭션에서 이전에 캐시된 쿼리를 사용하지 않을 수 있습니다.

쿼리가 캐시된 결과를 사용하는 경우를 이해하려면 쿼리 일치 섹션을 참조하세요.

쿼리 캐시는 집계 파이프라인의 결과도 캐시합니다. 예를 들면 다음과 같습니다.

Mongo::QueryCache.cache do
Mongo::Client.new([ '127.0.0.1:27017' ], database: 'music') do |client|
client['artists'].aggregate([ { '$match' => { name: 'Fleet Foxes' } } ]).first
#=> Queries the database and caches the result
client['artists'].aggregate([ { '$match' => { name: 'Fleet Foxes' } } ]).first
#=> Returns the previously cached result
end
end

참고

애그리게이션 결과는 모든 쓰기 작업 중에 예외 없이 캐시에서 지워집니다.

MongoDB는 database.system.* 네임스페이스 패턴을 사용하는 collection에 시스템 정보를 저장합니다. 이를 시스템 collection이라고 합니다.

시스템 collection의 데이터는 애플리케이션에서 트리거되지 않는 활동(예: 내부 서버 프로세스) 및 애플리케이션에서 실행한 다양한 데이터베이스 명령의 결과로 변경될 수 있습니다. 시스템 collection에 대한 캐시된 결과의 만료 시기를 결정하기가 어렵기 때문에 시스템 collection에 대한 쿼리는 쿼리 캐시를 우회합니다.

시스템 컬렉션에 대한 자세한 내용은 MongoDB 설명서에서 확인할 수 있습니다.

참고

쿼리 캐시가 활성화되어 있더라도 시스템 collection의 쿼리 결과는 캐시되지 않습니다.

이 드라이버는 각 웹 요청이 진행되는 동안 쿼리 캐시를 활성화하는 랙(Rack) 미들웨어를 제공합니다. 다음은 Ruby on Rails 애플리케이션에서 쿼리 캐시 미들웨어를 활성화하는 방법의 예입니다.

# config/application.rb
# Add Mongo::QueryCache::Middleware at the bottom of the middleware stack
# or before other middleware that queries MongoDB.
config.middleware.use Mongo::QueryCache::Middleware

Rails 애플리케이션에서 Rack 미들웨어를 사용하는 방법에 대한 자세한 내용은 Rails on Rack 가이드를 참조하세요.

이 드라이버는 각 작업에 대한 쿼리 캐시를 활성화하는 Active Job 미들웨어를 제공합니다. 다음은 Ruby on Rails 애플리케이션에서 쿼리 캐시 액티브 작업 미들웨어를 활성화하는 방법의 예입니다.

# config/application.rb
ActiveSupport.on_load(:active_job) do
include Mongo::QueryCache::Middleware::ActiveJob
end

돌아가기

지리 공간적 Atlas Search

다음

GridFS.