Redis 현재접속자

불당   
   조회 14149   추천 0     비추천 0    

적용후에 report 하겠지만 사이트의 부하가 5-10%는 줄어들 것 같습니다.
5-10%가 뭐가 대한한데???라고 하시겠지만 그 차이는 엄청난 체감입니다.
이런 상시적인 부하의 감소는 뚜렷한 개선이 되는거죠.
문득 문의를 듣고 redis에 대한 영감이 떠올랐거든요.ㅎㅎ...
 
==
tail.sub.php의 현재접속자 정보를 넣는 코드는 진짜 엄청난 부하를 DB에 줍니다.
특히 쓰기에...
매 페이지마다 update 시키는건데... 이거는 동접자가 많은 사이트의 경우 감내하기 힘든 수준이 되죠.
그래서, Redis를 이용해서 개선 합니다.
 
// 사이트를 방문하게 되면 처음 한번 insert가 되고, 이후에는 계속 update가 이루어 집니다. 따라서 무조건 update를 먼저하게 하는게 속도를 더 빠르게 합니다.
$tmp_sql = " update $g4[login_table] set mb_id = '$member[mb_id]', lo_datetime = '$g4[time_ymdhis]', lo_location = '$lo_location', lo_url = '$lo_url', lo_referer='$referer', lo_agent='$user_agent' where lo_ip = '$remote_addr' ";
sql_query($tmp_sql, FALSE);
 
원칙은 모든 현재접속자 정보는 redis cache에 넣습니다.
g4_login에는 넣지 않습니다.
g4_login의 정보가 필요한 시점에 redis cache에서 읽어서 g4_login에 넣습니다.
 

<?
if ($g4['session_type'] = "redis") {
    // redis일때만 redis login 관리를 쓴다.
    $redis_login = new Redis();
    $redis_login->connect($g4["rhost"], $g4["rport"]);
    $redis_login->select($g4["rdb"]);
    // redis key를 정의 (where에 있는 것을 묶어서 key를 만들어 줍니다)
    $rkey = $g4["rdomain"] . "_login_" . "$remote_addr";
    $rvalue = $remote_addr . "|". $member[mb_id] . "|" . $g4[time_ymdhis] . "|" . $lo_location . "|" . $lo_url . "|" . $lo_referer . "|" . $user_agent;
    // key가 있으면 값을 가져와야죠?
    if ($redis_login->exists($rkey) && $redis_login->get($rkey)) {
        // key가 있는 경우 ttl (key가 expire 되었는지를 체크)
        if ($redis->ttl($rkey) > 0) {
            // 로그인정보를 업데이트
            $redis_login->setex($rkey, 60*$config['cf_login_minutes'], "$rvalue"); // sets key → value
        } else {
            // expire된 key는 삭제
            $redis_login->delete($rkey);
        }
    } else {
        // key가 없거나 값이 없으면 key를 넣어줍니다.
        $redis_login->setex($rkey, 60*$config['cf_login_minutes'], "$rvalue"); // sets key
    }
    // redis instance connection을 닫아줍니다.
    $redis_login->close();
} else {
    // 사이트를 방문하게 되면 처음 한번 insert가 되고, 이후에는 계속 update가 이루어 집니다. 따라서 무조건 update를 먼저하게 하는게 속도를 더 빠르게 합니다.
    $tmp_sql = " update $g4[login_table] set mb_id = '$member[mb_id]', lo_datetime = '$g4[time_ymdhis]', lo_location = '$lo_location', lo_url = '$lo_url', lo_referer='$referer', lo_agent='$user_agent' where lo_ip = '$remote_addr' ";
    sql_query($tmp_sql, FALSE);
   
    // update가 안되는 경우에는 insert를 합니다.
    if (!mysql_affected_rows())
    {
     $tmp_sql = " insert into $g4[login_table]
                     set
                         lo_ip = '$remote_addr',
                         mb_id = '$member[mb_id]',
                         lo_datetime = '$g4[time_ymdhis]',
                         lo_location = '$lo_location',
                         lo_url = '$lo_url',
                         lo_referer = '$referer',
                         lo_agent = '$user_agent'
                          ";
     sql_query($tmp_sql, FALSE);
   
     // 시간이 지난 접속은 삭제한다
     sql_query(" delete from $g4[login_table] where lo_datetime < '".date("Y-m-d H:i:s", $g4[server_time] - (60 * $config[cf_login_minutes]))."' ");
    }
}
?>
- opencode.co.kr -


제목Page 4/28
2013-11   11659   불당
2013-10   12334   불당
2013-10   14928   불당
2013-08   13010   불당
2013-06   14502   불당
2013-06   13623   불당
2013-06   13877   불당
2013-05   14978   불당
2013-05   14150   불당
2013-05   15230   불당
2013-05   15233   불당
2013-04   15843   불당
2013-03   15446   불당
2013-03   17750   불당
2013-03   15394   불당
2013-02   17597   불당
2013-05   55766   불당
2013-01   13954   불당
2013-01   14826   불당
2013-01   14135   불당