복붙노트

[REDIS] 캐시 SQL 결과에 레디 스를 사용하여

REDIS

캐시 SQL 결과에 레디 스를 사용하여

나는 SQL 기반 응용 프로그램을하고 난 레디 스를 사용하여 결과를 캐시 것을 좋아합니다. 여러 SQL 테이블과 주소록과 같은 응용 프로그램 생각할 수 있습니다. 응용 프로그램은 다음과 같은 작업을 수행합니다 :

시간의 40 % :

시간의 60 % :

이것은 나의 현재의 접근 방식입니다 :

그 꼭대기에, 나는 레디 스 룩업 테이블은 MySQL 레코드 ID와 레디 스 캐시 키를 저장 (레디 스 세트)가 있습니다. MySQL의 기록이 변경된 경우 나는 레디 스를 삭제할 수 있습니다 그 방법은 캐시 (예를 들어, 대량 업데이트).

새 레코드가 검색 결과 캐시 시스템 후에 생성되는 경우는 어떻게? 새 레코드가 검색 조건에 일치하는 경우 캐시가 삭제 될 때까지, 시스템은 항상 (캐시에 기존 레코드가 업데이트 될 때까지 일어나지 않을 것이다), (새로운 기록을 포함하지 않음) 이전의 캐시를 반환합니다.

검색은 사용자에 의해 구동되며, 검색 조건의 조합은 수많은입니다. 새로운 기록이 작성 될 때 삭제해야하는 캐시 평가할 수 없습니다.

지금까지 유일한 해결책은 기록을 만들 때 MySQL의 테이블의 모든 캐시를 제거하는 것입니다. 많은 레코드가 매일 만들어 때문에 이것은 좋은 선택이 아니다.

이 상황에서, MySQL은 위에 레디 스를 구현하는 가장 좋은 방법은 무엇인가?

해결법

  1. ==============================

    1.이 PHP와 MySQL (I 다른 언어에 대해 확실하지 오전)에 관해서는 여기에 놀라운 일이 -에 물건을 캐싱하지 memcached를 나 레디 스 실제로 빠릅니다. 훨씬 더 빨리. 당신은 당신의 응용 프로그램 및 쿼리의 MySQL을 구축하는 경우 기본적으로 - 당신은 그것을 더 나갈 것입니다.

    이 PHP와 MySQL (I 다른 언어에 대해 확실하지 오전)에 관해서는 여기에 놀라운 일이 -에 물건을 캐싱하지 memcached를 나 레디 스 실제로 빠릅니다. 훨씬 더 빨리. 당신은 당신의 응용 프로그램 및 쿼리의 MySQL을 구축하는 경우 기본적으로 - 당신은 그것을 더 나갈 것입니다.

    이제 "왜"부분.

    InnoDB의 기본 엔진은 뛰어난 엔진입니다. 특히, 메모리 관리 (할당하지 무슨 일이) 어떤 메모리 저장 솔루션 우수하다. 사실이야, 당신은 그것을 찾거나 내 말을 수 있습니다 - 그것은, 적어도, 레디 스 좋은으로 수행합니다.

    당신은 쿼리의 MySQL과 레디 스에 결과를 캐시 - 지금 무슨 일이 앱에서 발생합니다. 그러나 MySQL은 캐시 된 결과를 유지하기 위해 스마트 충분히이기도하다. 당신이 방금 한 일은 레디 스에 연결하는 데 필요한 것 추가 파일 기술자를 만드는 것입니다. 당신은 또한 MySQL이 이미 캐시, 그 결과를 캐싱 할 저장 장치 (RAM)을 사용했다.

    여기에 또 다른 흥미로운 부분은 온다 - PHP 스크립트를 제공 선호하는 방법은 PHP-FPM을 사용하는 것입니다 - 그것은 밖으로 * ​​어떤 mod_보다 훨씬 빨리 쓰레기가있다. 핵심에 이르기까지, PHP-FPM은 급부상 아이가 처리하는 감독자 과정이다. , 연결하면 여러 번 사용 - 스크립트가 제공됩니다 후 그들은 MySQL의 연결을 캐시하는 수단 종료되지 않습니다. 이것은 매우 친화적 인 자원이고 그것을 당신에 번개 빠른 연결을 할 수 있습니다 - 당신은 PHP-FPM를 사용하여 스크립트를 제공하는 경우 기본적으로, 그들은 당신이 각 요청에 대한 개폐 연결이되지 않습니다 것을 의미, MySQL로 이미 확립 된 연결을 다시합니다 MySQL은. MySQL은, 메모리를 효율적있는 캐시 된 결과를 가지고 훨씬 더 빨리 레디 스보다.

    이제이 모든 것이 당신을 위해 평균 무엇을 - 적절한 설정을 가진 것은 당신의 간단한, 쉬운, 당신은 캐시 무효화와 함께이 무엇을하지 당신은 낭비하지 않을 수도 레디 스 소거하는 모든 문제를 포함하지 않는 작은 코드가 있습니다 당신의 기억은 두 번 같은 데이터를 포함합니다.

    당신이 작업이 필요한 성분 :

    당신은 당신이 플레이에 추가 시스템을 도입하지 않았다 당신이 데이터를 돌봐 의미의 소프트웨어는 일을 할 수 있도록, 중복 데이터를하지 않았다, 당신은 당신의 코드를 간단하게 유지하고 쉽게 유지하기 위해, 게임에서 레디 스를 제거. 그것을 설치하고 실행하기 위해 더 많은 시간 정도 이상 적용되지 않습니다 - 당신이 모두에게 처음부터 소프트웨어를 컴파일 할 경우에도 최대 유용성에 대한 트레이드 오프 꽤 저렴.

    또는, 당신은 내가 쓴 것을 무시하고 레디 스를 사용하여 솔루션을 찾을 수 있습니다.

  2. ==============================

    2.우리는 같은 문제를 만났다 우리는 당신이 생각하는 같은 일을 수행하기로 결정했습니다 : 테이블의 영향을받는 모든 쿼리 캐시를 제거합니다. 당신의 말하지만 지금까지 확인 그래서 다행히도 우리의 "쓰기"가 40 %로 높게없는 것은 적합하지 않습니다. 즉 쿼리 기반 캐싱의 본질이다. 다른 방법으로는 개체 기반 캐싱을 추가 할 수 있습니다. 대신에만 검색 결과를 캐싱, 전체 테이블을 캐시 메모리 내부 검색을 수행. 우리가 메모리에 꽤 일반적인 쿼리를 수행 할 수 있도록 우리는 C # LINQ를 사용하지만 검색이 너무 후 복잡하면 당신은 운이 있습니다.

    우리는 같은 문제를 만났다 우리는 당신이 생각하는 같은 일을 수행하기로 결정했습니다 : 테이블의 영향을받는 모든 쿼리 캐시를 제거합니다. 당신의 말하지만 지금까지 확인 그래서 다행히도 우리의 "쓰기"가 40 %로 높게없는 것은 적합하지 않습니다. 즉 쿼리 기반 캐싱의 본질이다. 다른 방법으로는 개체 기반 캐싱을 추가 할 수 있습니다. 대신에만 검색 결과를 캐싱, 전체 테이블을 캐시 메모리 내부 검색을 수행. 우리가 메모리에 꽤 일반적인 쿼리를 수행 할 수 있도록 우리는 C # LINQ를 사용하지만 검색이 너무 후 복잡하면 당신은 운이 있습니다.

  3. from https://stackoverflow.com/questions/31527161/using-redis-to-cache-sql-result by cc-by-sa and MIT license