2013-05-04 3 views
1

우리는 LAMP 스택에서 실행되는 웹 애플리케이션을 가지고 있습니다. 애플리케이션은 다양한 서비스에 의존합니다. 이러한 서비스는 캐시 (memcached)에서 cron (MySQL의)을 사용하여 새로 고치는 데이터를 가져옵니다. Cron 프로세스는 5 분마다 실행됩니다.MySQL이 memcached를 새로 고칩니다

이 접근법에서는 캐시가 5 분마다 새로 고침됨에 따라 최근에 업데이트 된 데이터를 제공 할 수 없습니다.

MySQL에서 데이터가 업데이트되는 즉시 캐시 새로 고침을 트리거 할 수있는 메커니즘이 있습니까?

답변

1

이것이 최선의 해결책인지는 잘 모르겠지만 삽입/업데이트/삭제시 실행되는 MySQL 트리거를 만드는 것이 좋습니다.

그 내부에서 MySQL 트리거는 UDF을 실행합니다. UDF에서 sys_exec()을 사용하여 모든 PHP 스크립트를 실행할 수 있습니다.

Read about Triggers

Read about UDF

Read about using sys_exec() and more

+0

MySQL 테이블에서 데이터가 변경되면 CURL 요청을 실행하는 것과 비슷한 방법을 사용했습니다. – Manu

+0

안녕하세요 마누, 트리거를 통해 테이블이나 행을 잠그면 후속 쿼리가 실패하는 친구로부터 들었습니다. 사실입니까? – Pawan

+0

검색어가 실패하지 않습니다. 그들은 단지 기다려야 할 수도 있습니다. InnoDB의 경우 행을 잠글 것이고 MyISAM의 경우에는 테이블을 잠글 것이라고 생각합니다. 그러나이 점에 대해서는 확실하지 않습니다. 나는이 것에 관해 다른 질문을하는 것이 좋습니다. : P 그 질문의 링크도 여기에 게시하십시오. : D – Manu

0

것만 & 따라 memcache에 새로 고침 PHP 수준에서 MySQL의 그 갱신을 식별 어떻습니까?

<?php 

if($update_db){ // if we need to update the db then update db & memcacache together ! 

// Code to Update the database .... 

// Code to Reset the memcached keyvalue pair. 

} 

?> 

Manu가 제안한 접근 방식에서는 캐시 업데이트를 수행하는 데 실제로 필요하지 않은 비싼 db 트리거를 사용하고 있습니다.

+0

안녕하세요 Sumoanand, 감사하지만 PHP는 성능을 저하시킬 2 개의 업데이트를 트리거해야하므로이 방법의 단점이 있습니다. – Pawan

+0

죄송합니다. 이해가 가지 않습니다. 내 이해가 틀린 경우를 제외하고는이 두 가지 업데이트가 수행됩니다. 당신의 흐름 : DB 업데이트 (업데이트 1) -> db 트리거 -> memcache 업데이트 (업데이트 2)입니다. – Sumoanand

+0

요청하는 응답 시간을 의미합니다. – Pawan

1

이 문제에 대한 나의 해결책은 memcached 쿼리가있는 함수에서 MySQL 쿼리를 사용하는 것이 었습니다. 예를 들어 파이썬에서는 PHP를 모르므로 PHP로 변경해 볼 수 있습니다.

def insert(user,value): 
#execute on memcached first 
key="user:"+user 
memcClient.set(key,value) 
#then execute it on MySQL 
cursor.execute("INSERT INTO tables VALUES (%s,%s)",(user,value)) 
db.commit() 

그리고 당신은 삭제와 업데이트를 위해 동일한 작업을 수행합니다. 미안 해요. PHP로 할 수 없었습니다. 저는 십대 코더입니다. 행운을 빈다.

관련 문제