memcached 의 위대함 정보
개발자 memcached 의 위대함
본문
1. set 메소드에 expire time을 지정할수 있다.
캐싱아이템에 대한 만료시간을 지정할수 있음.
따라서 key exists 만 체크해서 캐시 데이타를 생성하면 된다.
=> cron 의 도움따윈 필요없음, 게다가 expire time을 초단위로 설정할수 있다.. 크론은 분단위(편법으로 초단위가능)
1) 사용자 요청이 많은 페이지의 expire_time을 1초로 지정하면, 데이타 싱크 같은거 무시해도 됨
1초면 실시간이라고 봐도 무방함
2) 게시물 리스트에서는 1-3페이지 정도 캐쉬
3) 게시물 본문은 무조건 캐쉬
2. 로컬 unix_socket을 이용하여 포트 자원의 낭비가 없다.
대용량 서비스에 최적화 할수 있음.
3. 이제 곧 mysql(5.6 버전)의 기본기능으로 탑재된다.
제발 빨리 출시되라,,, 6월엔 나온다고 했잖어.
시간 되는대로 그누보드에서 memcached 를 이용한 캐싱 클래스를 만들어보도록 하겠습니다.
(언제될지는 모름. 최근 바쁜일이 너무 많음)
만들면, 관리자님 테스트 해주시길 간절히 바라고 있음.
추천
1 비추천
0
1 비추천
0
댓글 14개

select 부분만 클래스 만들어서 적용했을시
단일 서버(고사양 아님)로 동접 천명 하고도 리소스는 20% 안쪽 사용중입니다
memcached 의 위대함은 !!!!!
폐인님의 클래스를 기다립니다!
단일 서버(고사양 아님)로 동접 천명 하고도 리소스는 20% 안쪽 사용중입니다
memcached 의 위대함은 !!!!!
폐인님의 클래스를 기다립니다!

지금 캐싱 처리를 해야 하는 부분을 정리하고 있습니다.
정리부터 하고, 클래스 형태로 넣을지, core에다가 수정할지 정해야 할것 같습니다.
(그런데 core를 아예 손안댈수는 없네요.)
아래는 정리중인 문서
1. common.php
1) dbconfig를 파일에서 읽는 부분.
- 메모리 설정으로 변경(1분 정도 캐슁)
2) db connect 부분
- 필요한경우에만 connect 하도록 전체적으로 소스 수정. db connection 은 소켓자원을 사용함으로 비용이 큼(localhost는 작다)
: common.php, /lib/common.lib.php 수정해야함
3) config_table에서 전체 정보를 읽는 부분
- 정적 데이타 임으로 캐싱주기를 1분 이상으로 설정
4) 회원 테이블에서 회원벙보를 읽는 부분
- 개인정보가 변경될수 있음으로 캐싱처리 안함
5) 게시판정보를 읽는 부분
- 정적데이타 임으로 1초에 한번 캐싱처리
6) $write 정보를 읽는 부분
- 1초단위 캐시처리
- key 네이밍에 신경써야함. board_id + "_" + wr_id 정도가 적당
7) group 정보 읽는 부분 캐슁
캐싱 함수
_cache_get_dbconfig();
_cache_get_config();
_cache_get_group();
_cache_get_write();
2. /lib/common.php
3. /bbs/board.php
4. /bbs/list.php
5. /bbs/view.php
6. /bbs/view_comment.php
7. /bbs/latest.lib.php
정리부터 하고, 클래스 형태로 넣을지, core에다가 수정할지 정해야 할것 같습니다.
(그런데 core를 아예 손안댈수는 없네요.)
아래는 정리중인 문서
1. common.php
1) dbconfig를 파일에서 읽는 부분.
- 메모리 설정으로 변경(1분 정도 캐슁)
2) db connect 부분
- 필요한경우에만 connect 하도록 전체적으로 소스 수정. db connection 은 소켓자원을 사용함으로 비용이 큼(localhost는 작다)
: common.php, /lib/common.lib.php 수정해야함
3) config_table에서 전체 정보를 읽는 부분
- 정적 데이타 임으로 캐싱주기를 1분 이상으로 설정
4) 회원 테이블에서 회원벙보를 읽는 부분
- 개인정보가 변경될수 있음으로 캐싱처리 안함
5) 게시판정보를 읽는 부분
- 정적데이타 임으로 1초에 한번 캐싱처리
6) $write 정보를 읽는 부분
- 1초단위 캐시처리
- key 네이밍에 신경써야함. board_id + "_" + wr_id 정도가 적당
7) group 정보 읽는 부분 캐슁
캐싱 함수
_cache_get_dbconfig();
_cache_get_config();
_cache_get_group();
_cache_get_write();
2. /lib/common.php
3. /bbs/board.php
4. /bbs/list.php
5. /bbs/view.php
6. /bbs/view_comment.php
7. /bbs/latest.lib.php

코어에서 쿼리문을 분류해서 캐싱하고 있습니다
코멘트 부분은 캐싱하지 않습니다 실시간이기때문에....
전 코어부분을 어쩔수 없이 손댔습니다.
미친듯이 빠릅니다...
코멘트 부분은 캐싱하지 않습니다 실시간이기때문에....
전 코어부분을 어쩔수 없이 손댔습니다.
미친듯이 빠릅니다...

저번에 쪽지로 주신 소스를 보니 expire_time을 지정 안하셨던데요.
만료시간을 1초로 주면 실시간 아닌가요??
만들고 나면 비슷하겟네요.^^
만료시간을 1초로 주면 실시간 아닌가요??
만들고 나면 비슷하겟네요.^^

그건 최근 게시물만...필요하시다고 해서 급하게 ㅠ
제 사이트는 코어만 수정했어요 ㅎㅎ
코어만 수정해서 최근글 몰록 게시물 본문
등등 다 캐싱되도록 해놧어요 ㅎㅎ
만료시간 1초로 주면 실시간 맞습니다~~^^
그리공
$memcache_obj->set($latest_skin_path.'_'.$bo_table, ob_get_contents(), MEMCACHE_COMPRESSED, 60);
보내드린 내용은 60초 설정이 되어 있었네요~
제 사이트는 코어만 수정했어요 ㅎㅎ
코어만 수정해서 최근글 몰록 게시물 본문
등등 다 캐싱되도록 해놧어요 ㅎㅎ
만료시간 1초로 주면 실시간 맞습니다~~^^
그리공
$memcache_obj->set($latest_skin_path.'_'.$bo_table, ob_get_contents(), MEMCACHE_COMPRESSED, 60);
보내드린 내용은 60초 설정이 되어 있었네요~

아 그렇군요.^^

이런 아름다운게 있네요.

$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");
$sql = 'select ~~~~~';
//set the key then check the cache
$key = md5($sql);
$get_result = $memcache->get($key);
if ($get_result) {
print_t($get_result);
echo "<br/> cached!!";
} else {
// Run the query and get the data from the database then cache it
$result = sql_query($sql);
$data = array();
for ($i = 0; $row = sql_fetch_array($result); $i++) {
$data[] = $row;
}
$memcache->set($key, $data, false, 5) or die ("Failed to save data at the server");
print_t($data);
echo "<br/> uncached!!";
}
위처럼 코드 만들어봤는데 이걸 게시판 목록에 적용해보려 합니다. 이렇게 하는게 맞는지 모르겠네요
궁금한점이 있는데 만료를 1초로 하면 캐쉬가 만료되어 쿼리를 날려야 하는데
1초당 한번은 누군가는 느리게 접속되는건가요?
$memcache->connect('localhost', 11211) or die ("Could not connect");
$sql = 'select ~~~~~';
//set the key then check the cache
$key = md5($sql);
$get_result = $memcache->get($key);
if ($get_result) {
print_t($get_result);
echo "<br/> cached!!";
} else {
// Run the query and get the data from the database then cache it
$result = sql_query($sql);
$data = array();
for ($i = 0; $row = sql_fetch_array($result); $i++) {
$data[] = $row;
}
$memcache->set($key, $data, false, 5) or die ("Failed to save data at the server");
print_t($data);
echo "<br/> uncached!!";
}
위처럼 코드 만들어봤는데 이걸 게시판 목록에 적용해보려 합니다. 이렇게 하는게 맞는지 모르겠네요
궁금한점이 있는데 만료를 1초로 하면 캐쉬가 만료되어 쿼리를 날려야 하는데
1초당 한번은 누군가는 느리게 접속되는건가요?

동시접속자가 많은 상황에서는 else 블록을 한명이 아니라 여려명이 동시에 들어올수 있습니다.
그리고 else 블록에 들어간다 하더라도 느리지는 않습니다. mysql에 부하가 많이 줄어든 상태이기 때문에 충분히 빠른 결과가 나올겁니다.
그리고 else 블록에 들어간다 하더라도 느리지는 않습니다. mysql에 부하가 많이 줄어든 상태이기 때문에 충분히 빠른 결과가 나올겁니다.

캐시의 expire_time을 길게 잡으면 문제가 없는데, realtime을 높이기 위해서 1초를 잡게되면 여러 다른 문제가 발생할수 있습니다. 가장 핵심적인게 locking 입니다.
memcached는 명시적인 locking을 제공하지 않습니다. lock key를 별도로 만들어서 체크해야 합니다.
이에 대한 회피를 위해서 구조를 잡아둔게 있는데, 샘플코드를 만드는대로 올려드리겠습니다.
memcached는 명시적인 locking을 제공하지 않습니다. lock key를 별도로 만들어서 체크해야 합니다.
이에 대한 회피를 위해서 구조를 잡아둔게 있는데, 샘플코드를 만드는대로 올려드리겠습니다.

감사합니다.
목록은 3초
내용은 1초 잡아서 테스트중입니다.
목록은 3초
내용은 1초 잡아서 테스트중입니다.

테스트 결과좀 올려주세요.
대단하다는 생각이 듭니다.
그리고 저도 트래픽 때문에 또는 동접자 수때문에 캐싱을 심각하게 고려해봤으면 좋겠습니다.
좋은 결과 기대합니다.
그리고 저도 트래픽 때문에 또는 동접자 수때문에 캐싱을 심각하게 고려해봤으면 좋겠습니다.
좋은 결과 기대합니다.
