메뉴 건너뛰기

PHP
2016.03.06 06:33

PHP 4 Memcache

조회 수 58 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

Memcached - 윈디하나의 솔라나라

목차

개요

  • memcached 는 이름 그대로 메모리를 사용해 캐시서비스를 제공해주는 데몬이다. memcache 라는 이름의 라이브러리는 여러가지가 있지만, 여기서 설명하는 건 데몬이다.
  • memcached 는 LiveJournal을 개발한 Brad Fitzpatrick 이 2003년 최초 개발했다. 솔라나라를 포함해, 유투브나 아마존, 위키피디아, 소스포지, 트위터 등 많은 대형 사이트에서 사용되고 있는 데몬이다.
  • memcached 의 기능은 단순히 키-값쌍으로 메모리에 저장하고 가져오는 기능이 전부이지만, 내부적으로는 모든 커맨드는 O(1)에 수렴하는 수행시간을 가진다. 또한 자체 슬랩(Slab) 메모리 할당 알고리즘을 통해 메모리 관리 효율성을 높여 가동시간(uptime)이 늘어나도 성능 저하나 메모리 단편화가 적다.
  • memcached 에 대해 아래와 같은 사용은 지양해야 한다.
    • 파일의 캐시로 사용하지 말아야 한다. 파일 캐시는 운영체제에서 제공되는 것을 사용하는 것이 더 효율적이며, 만약 memcached에서 캐시하려면 OS의 파일 캐시를 끄는 것도 고려해야 한다. memcached는 파일을 읽고 가공한 것을 캐시하는 것이 좋다고 생각한한다.
    • 데이터베이스 쿼리 결과의 캐시로 사용하지 말아야 한다. 위와 비슷한 이유다. 요즘 나오는 대부분의 상용 DBMS는 쿼리 결과를 캐시해주기 때문에 이중으로 캐시할 필요 없다. 이는 오히려 성능 저하를 불러온다. 쿼리 결과를 가공한 것을 캐시하는 것이 좋다고 생각한다.
    쉽게 말해 이중으로 캐시하지 말라는 의미다.
  • memcached 운용시에는 다음과 같은 것을 주의해 운용해야 한다.
    • 시스템의 메모리 상황를 상시 모니터링 해, 스왑과 락이 일어나지 않도록 해야한다. memcached 는 스왑이 일어나지 않을 정도로 메모리는 여유있다는 가정하에 개발되기 때문이다. 메모리가 부족해 스왑이 일어나 메모리에 저장했던 컨텐츠가 스왑 디스크에 저장되면, 심각한 속도 저하가 있을 것이다.
    • memcached 의 히트/미스 비율을 상시 모니터링 하자. 당연히 캐시 히트 비율이 높을 수록 더 좋은 서비스를 제공할 수 있다. 히트/미스 비율이 낮다면 캐시할 대상을 변경해보는것도 고려해자. 구체적인 수치는 서비스마다 다르지만 99%이상은 되어야 만족할 만한 성능 향상이 나오지 않을까 생각한다. (솔라나라에서 사용하는 memcached 는 히트 비율이 90% 정도다)
  • memcached 를 사용한 표준적인 코드는 아래와 같다. 공식 홈페이지에서 가져왔다.
    function get_foo(foo_id)
        foo = memcached_get("foo:" . foo_id)
        return foo if defined foo
    
        foo = fetch_foo_from_database(foo_id)
        memcached_set("foo:" . foo_id, foo)
        return foo
    end
    
    foo 를 얻어오는 함수의 의사코드이다. memcached 에서 얻어왔다면 그것을 리턴해주고, 얻어올 수 없다면 데이터베이스에서 가져온 후 memcached에 넣고 가져온 것을 리턴한다. 또한 memcached 처리중에 오류가 발생해도, 서비스 프로세스는 그대로 진행되도록 서비스를 구성하고 프로그래밍해야 한다. 예를 들어 memcached 가 다운되었어도 서비스는 (비록 성능이 저하되었더라도) 계속 진행되어야 한다.
  • 링크

설치

  • libevent 이벤트 라이브러리

    # wget --no-check-certificate https://sourceforge.net/projects/levent/files/libevent/libevent-2.0/libevent-2.0.22-stable.tar.gz
    # tar xvfz libevent-2.0.22-stable.tar.gz
    # cd libevent-2.0.22-stable
    # ./configure CFLAGS="-I/usr/local/ssl/include" CPPFLAGS="-I/usr/local/ssl/include"
    # make
    # make install
    
  • memcached

    root@wl ~/src # wget http://www.memcached.org/files/memcached-1.4.25.tar.gz
    root@wl ~/src # tar xvfz memcached-1.4.25.tar.gz
    root@wl ~/src # cd memcached-1.4.25
    root@wl ~/src/memcached-1.4.25 # ./configure --enable-sasl --enable-dtrace 1)
    root@wl ~/src/memcached-1.4.25 # gmake
    root@wl ~/src/memcached-1.4.25 # gmake install
    
    1) 만약 64비트로 컴파일하려면 --enable-64bit옵션을 붙여 컴파일한다. libevent 도 64비트로 컴파일 되어있어야 한다.

실행

  • memcached 설정 및 실행

    • 데몬을 실행하기에 앞서, 서비스를 할 포트 번호와, 데몬에서 사용할 최대 메모리 양을 정한다. 기본 포트는 11211 이며, 사용할 메모리는 64MB이 기본 값이다.
    • memcached 는 별도의 설정 파일이 없으며, 따라서 설정 사항은 데몬 실행시 인자로 전달해야 한다.
    아래 커맨드는 daemon사용자의 권한을 사용하고, 64MB 메모리를 사용하고, 큰 페이지를 사용하며, 127.0.0.1만 바인드(외부 접속 불가)하는 데몬을 띄운다. PID 파일은 /tmp/memcached.pid에 있다. 옵션으로 slab_reassign,slab_automove,lru_crawler,lru_maintainer,maxconns_fast,hash_algorithm=murmur3를 사용하도록 한다. murmur3 해시 알고리즘에 대해서는 MurmurHash3를 읽어보자.
    root@wl ~ # memcached -u daemon -d -m 64 -l 127.0.0.1 -p 11211 -L -P /tmp/memcached.pid \
    	-o slab_reassign,slab_automove,lru_crawler,lru_maintainer,maxconns_fast,hash_algorithm=murmur3 1)
    
    1) 이 문서에서 사용한 옵션은 시험적인 옵션을 포함한다. 따라서 memcached 의 버전에 따라 변경될 수 있다.

    memcached 는 별도의 종료 명령을 제공하지 않는다. 따라서 kill(1) 을 사용해 종료한다.

    root@wl ~ # kill `cat /tmp/memcached.pid`
    
  • memcached 주요 스위치

    • -l <addr>: 바인드할 주소
    • -p <num>: TCP 포트 번호 (기본값: 11211)
    • -U <num>: UDP 포트 번호 (기본값: 11211, 0 인경우 사용안함)
    • -s <file>: UNIX 소켓 경로 (네트워크 지원 안함)
    • -a <mask>: UNIX 소켓 마스크 (기본값: 700)
    • -d: 데몬으로 실행
    • -u <username>: 전환할 사용자 이름(루트로 실행시)
    • -m <num>: 최대 메모리(MB단위, 기본값: 64)
    • -M: 데이터 저장시 메모리가 부족할 경우 오류를 반환(기본값은 오래된 데이터를 삭제)
    • -c <num>: 최대 접속 개수 (기본값: 1024)
    • -P <file>: PID 파일 저장 위치. -d 옵션 사용시 사용
    • -f <factor>: 증가 팩터값. (기본값: 1.25)
    • -n <bytes>: 키+값+플래그를 저장할 최소 단위(기본값: 48)
    • -L: large memory pages 사용(가능한경우)
    • -t <num>: 사용할 쓰레드 개수 (기본값: 4)
    • -b: 백로그 큐 제한(기본값: 1024)
    • -I <bytes>: Slab 페이지 크기 제한(기본값: 1mb)
    • -V: 버전 출력 후 종료
    • -v: 로그 보임
    • -vv: 자세한 로그 보임(slab 할당상태 보임)
    • -vvv: 매우 자세한 로그 보임
    • -h: 도움말
    • -i: 라이선스 보임
    • -o: 콤마로 구분된 실험적/확장 옵션 활성화. 다음과 같은 옵션이 있으며 자세한 사항은 memcached -h참조.
      • maxconns_fast
      • hashpower
      • tail_repair_time
      • hash_algorithm
      • lru_crawler
      • lru_crawler_sleep
      • lru_crawler_tocrawl
      • lru_maintainer
      • hot_lru_pct
      • warm_lru_pct
      • expirezero_does_not_evict
  • memcached 프로토콜 예제

    memcached 의 프로토콜은 두가지다. 바이너리 프로토콜과 아스키 프로토콜이 그것인데, 아스키 프로토콜은 telnet 등을 사용해 아래와 같이 이용할 수 있다. 부하가 많이 걸리는 곳에서는 바이너리 프로토콜이 아스키 프로토콜에 비해 성능이 '약간' 좋은 것으로 알려져있다.
    root@wl ~ # telnet localhost 11211 
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    stats settings 1)
    STAT maxbytes 67108864
    STAT maxconns 1024
    STAT tcpport 11211
    STAT udpport 11211
    STAT inter 127.0.0.1
    STAT verbosity 0
    STAT oldest 0
    STAT evictions on
    STAT domain_socket NULL
    STAT umask 700
    STAT growth_factor 1.25
    STAT chunk_size 48
    STAT num_threads 4
    STAT num_threads_per_udp 4
    STAT stat_key_prefix :
    STAT detail_enabled no
    STAT reqs_per_event 20
    STAT cas_enabled yes
    STAT tcp_backlog 1024
    STAT binding_protocol auto-negotiate
    STAT auth_enabled_sasl no
    STAT item_size_max 1048576
    STAT maxconns_fast no
    STAT hashpower_init 0
    STAT slab_reassign no
    STAT slab_automove 0
    STAT tail_repair_time 3600
    END
    stats slabs
    STAT 1:chunk_size 80
    STAT 1:chunks_per_page 13107
    ...
    STAT total_malloced 47156640
    END
    stats conns
    STAT 25:addr tcp:127.0.0.1:11211
    STAT 25:state conn_listening
    STAT 25:secs_since_last_cmd 498
    STAT 28:addr udp:127.0.0.1:11211
    STAT 28:state conn_read
    STAT 28:secs_since_last_cmd 498
    STAT 29:addr udp:127.0.0.1:11211
    STAT 29:state conn_read
    STAT 29:secs_since_last_cmd 498
    STAT 30:addr udp:127.0.0.1:11211
    STAT 30:state conn_read
    STAT 30:secs_since_last_cmd 498
    STAT 31:addr udp:127.0.0.1:11211
    STAT 31:state conn_read
    STAT 31:secs_since_last_cmd 498
    STAT 32:addr tcp:127.0.0.1:33176
    STAT 32:state conn_parse_cmd
    STAT 32:secs_since_last_cmd 0
    END
    set mykey 0 100 2
    hi 2)
    STORED
    get mykey 3)
    VALUE mykey 0 2
    hi
    END
    Ctrl+]
    telnet> Ctrl+D
    Connection to localhost closed.
    root@wl ~ # 
    
    1) 세팅 확인
    2) 데이터 저장
    3) 데이터 추출
  • TIME_WAIT 튜닝

    TCP 스펙상 접속을 끊은 후 TIME_WAIT 가 발생할 수 있다. (물론 서버의 TIME_WAIT는 클라이언트에서 ACK를 주지 않은 경우이고 이는 클라이언트의 버그로 볼 수 있긴 하지만 여기서는 논외로 한다) TIME_WAIT 의 개수는 netstat(1M)을 사용해 확인 가능하다. 예를 들어 netstat -na | grep TIME_WAIT | wc -l명령으로 시스템에 현재 몇개의 TIME_WAIT 가 있는지 확인해볼 수 있다. 자세한건 윈디하나의 솔라나라: IPFilter - netstat 용 상태 변화 차트 (TCP 접속 해제시)를 읽어보자.

    TIME_WAIT 가 발생하는 기간은 30 ~ 240 초로 설정할 수 있는데, 대부분의 운영체제에서는 240초가 기본값이다. 하지만 이 값은 memcached 를 운용하는 환경에서는 너무 길다. 트래픽이 많은 곳에서 memcached 와 빈번하게 통신하다 보면, TIME_WAIT가 수만개 이상 발생하는 경우가 있고, 이로인해 memcached 에 접속이 안되는 현상이 발생하는 경우가 있기 때문이다. (어느 정도까지 문제 없는지는 운영체제마다, 설정마다 다르다) 따라서 각 운영체제 마다 이를 줄여주는 옵션이 있다. memcached 를 실행한 서버에서 아래와 같이 30초로 세팅한다. 참고로 일반적인 상황에서는 최소 60초 이상으로 설정할 것을 권장한다.

    • 솔라리스
      root@wl ~ # ndd -set /dev/tcp tcp_time_wait_interval 30000
      root@wl ~ # export EVENT_NOEVPORT=1
      
    • 리눅스
      root@wll ~ # vi /etc/sysctl.conf 
      net.ipv4.ip_local_port_range = 16384 65534
      net.ipv4.tcp_fin_timeout = 30
      net.ipv4.tcp_tw_reuse = 1
      root@wll ~ # sysctl -p
      
    • 윈도
      C:\>edit tcptimewait.reg
      [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
      "TcpTimedWaitDelay"=dword:0000001e
      C:\>regedit /S tcptimewait.reg
      
    TIME_WAIT 문제가 해결되지 않으면 Unix Socket 을 사용할 것을 고려해야 한다.
  • SLAB 튜닝

    • memcached는 큰 메모리를 할당한 후, 메모리 단편화를 줄이기 위해 slab를 구성해 사용한다. 일괄적으로 slab를 할당해놓지만 만약 커다란 slab 덩어리가 필요하지 않다면(캐시에 들어가는 객체의 크기를 모두 알고 있다면) 필요 없는 덩어리를 피해 할당하는 것이 메모리 사용 효율을 늘일 수 있다.
    • 아무런 옵션을 주지 않으면 아래와 같이 42개가 할당된다.
      root@wl ~ # memcached -vv
      slab class   1: chunk size        80 perslab   13107
      slab class   2: chunk size       104 perslab   10082
      slab class   3: chunk size       136 perslab    7710
      slab class   4: chunk size       176 perslab    5957
      slab class   5: chunk size       224 perslab    4681
      slab class   6: chunk size       280 perslab    3744
      slab class   7: chunk size       352 perslab    2978
      slab class   8: chunk size       440 perslab    2383
      slab class   9: chunk size       552 perslab    1899
      slab class  10: chunk size       696 perslab    1506
      slab class  11: chunk size       872 perslab    1202
      slab class  12: chunk size      1096 perslab     956
      slab class  13: chunk size      1376 perslab     762
      slab class  14: chunk size      1720 perslab     609
      slab class  15: chunk size      2152 perslab     487
      slab class  16: chunk size      2696 perslab     388
      slab class  17: chunk size      3376 perslab     310
      slab class  18: chunk size      4224 perslab     248
      slab class  19: chunk size      5280 perslab     198
      slab class  20: chunk size      6600 perslab     158
      slab class  21: chunk size      8256 perslab     127
      slab class  22: chunk size     10320 perslab     101
      slab class  23: chunk size     12904 perslab      81
      slab class  24: chunk size     16136 perslab      64
      slab class  25: chunk size     20176 perslab      51
      slab class  26: chunk size     25224 perslab      41
      slab class  27: chunk size     31536 perslab      33
      slab class  28: chunk size     39424 perslab      26
      slab class  29: chunk size     49280 perslab      21
      slab class  30: chunk size     61600 perslab      17
      slab class  31: chunk size     77000 perslab      13
      slab class  32: chunk size     96256 perslab      10
      slab class  33: chunk size    120320 perslab       8
      slab class  34: chunk size    150400 perslab       6
      slab class  35: chunk size    188000 perslab       5
      slab class  36: chunk size    235000 perslab       4
      slab class  37: chunk size    293752 perslab       3
      slab class  38: chunk size    367192 perslab       2
      slab class  39: chunk size    458992 perslab       2
      slab class  40: chunk size    573744 perslab       1
      slab class  41: chunk size    717184 perslab       1
      slab class  42: chunk size   1048576 perslab       1
      
      이는 -f 와 -n 옵션을 사용해 변경할 수 있다.
      windy@maid ~ $ memcached -vv -f 2 -n 10000 -I 10000000
      slab class   1: chunk size     10032 perslab     996
      slab class   2: chunk size     20064 perslab     498
      slab class   3: chunk size     40128 perslab     249
      slab class   4: chunk size     80256 perslab     124
      slab class   5: chunk size    160512 perslab      62
      slab class   6: chunk size    321024 perslab      31
      slab class   7: chunk size    642048 perslab      15
      slab class   8: chunk size   1284096 perslab       7
      slab class   9: chunk size   2568192 perslab       3
      slab class  10: chunk size  10000000 perslab       1
      
      memcached 의 stats slabs명령을 통해 slab 마다 할당되어있는 객체의 개수를 알아낼 수 있다. 각 slab가 꽉 차지 않도록 관리해야 한다.
  • memcached 와 DTrace

    현재 지원되는 프로바이더와 프로브는 아래와 같다. (아래 예제를 따라하기 전에 먼저 memcached 데몬을 실행해야 한다)
    root@wl ~ # dtrace -l -m memcached
       ID   PROVIDER            MODULE                          FUNCTION NAME
     2752 memcached16537         memcached                      assoc_delete assoc-delete
     2753 memcached16537         memcached                        assoc_find assoc-find
     2754 memcached16537         memcached                      assoc_insert assoc-insert
     2755 memcached16537         memcached               complete_update_bin command-add
     2756 memcached16537         memcached              complete_nread_ascii command-add
     2757 memcached16537         memcached               complete_update_bin command-append
     2758 memcached16537         memcached              complete_nread_ascii command-append
     2759 memcached16537         memcached              complete_nread_ascii command-cas
     2760 memcached16537         memcached                      do_add_delta command-decr
     2761 memcached16537         memcached            process_delete_command command-delete
     2762 memcached16537         memcached                process_bin_delete command-delete
     2763 memcached16537         memcached               process_get_command command-get
     2764 memcached16537         memcached                   process_bin_get command-get
     2765 memcached16537         memcached                      do_add_delta command-incr
     2766 memcached16537         memcached               complete_update_bin command-prepend
     2767 memcached16537         memcached              complete_nread_ascii command-prepend
     2768 memcached16537         memcached               complete_update_bin command-replace
     2769 memcached16537         memcached              complete_nread_ascii command-replace
     2770 memcached16537         memcached               complete_update_bin command-set
     2771 memcached16537         memcached              complete_nread_ascii command-set
     2772 memcached16537         memcached                 process_bin_touch command-touch
     2773 memcached16537         memcached                          conn_new conn-allocate
     2774 memcached16537         memcached                          conn_new conn-create
     2775 memcached16537         memcached                         conn_free conn-destroy
     2776 memcached16537         memcached                 dispatch_conn_new conn-dispatch
     2777 memcached16537         memcached                        conn_close conn-release
     2778 memcached16537         memcached                      do_item_link item-link
     2779 memcached16537         memcached                    do_item_remove item-remove
     2780 memcached16537         memcached                   do_item_replace item-replace
     2781 memcached16537         memcached             do_item_unlink_nolock item-unlink
     2782 memcached16537         memcached                    do_item_unlink item-unlink
     2783 memcached16537         memcached                    do_item_update item-update
     2784 memcached16537         memcached                    conn_set_state process-command-end
     2785 memcached16537         memcached                   process_command process-command-start
     2786 memcached16537         memcached              dispatch_bin_command process-command-start
     2787 memcached16537         memcached                    do_slabs_alloc slabs-allocate
     2788 memcached16537         memcached                    do_slabs_alloc slabs-allocate-failed
     2789 memcached16537         memcached                     do_slabs_free slabs-free
     2790 memcached16537         memcached                  do_slabs_newslab slabs-slabclass-allocate
     2791 memcached16537         memcached                  do_slabs_newslab slabs-slabclass-allocate-failed
    
    아래와 같이 memcached_watch.d 스크립트를 작성해 DTrace 를 실행하고 위의 프로토콜 예제를 다시 따라하면 [command-set fired]가 출력될 것이다. Ctrl+C를 눌러 종료한다.
    root@wl ~ # cat memcached_watch.d
    /* TO RUN: dtrace -s memcached_watch.d -p `pgrep -x memcached` -q */
    dtrace:::BEGIN
    {
            printf("Hit Ctrl-C to end.\n");
    }
    memcached*:::command-set
    {
            printf("command-set fired\n");
    }
    root@wl ~ # dtrace -s memcached_watch.d -p `pgrep -x memcached` -q
    Hit Ctrl-C to end.
    command-set fired
    ^C
    

InnoDB의 memcached 통합

  • MySQL 5.6 부터 InnoDB 스토리지 엔진에 memcached API를 지원한다. 성능은 memcached 정도로 빠르지만 데이터는 InnoDB 엔진에 테이블로 '저장'되기 때문에 크래시로 인한 부담이 없어진다. 또한 테이블로 저장되기 때문에 SQL을 통해서도 접근할 수 있으며 이때문에 각종 통계나 관리에 유리하다. 더 자세한 내용은 MySQL 5.6 Reference Manual :: 14 Storage Engines :: 14.2 The InnoDB Storage Engine :: 14.2.9 InnoDB Integration with memcached을 참고하자.
  • 설치

    윈디하나의 솔라나라: MySQL 5.6을 참고해 설치한다.
  • 설정

    memcached 용 스키마를 생성하고, 플러그인을 로드한다. memcached 데몬의 포트는 11222로 설정했다.
    root@wl /usr/local/mysql/share # mysql -u root < innodb_memcached_config.sql
    root@wl /usr/local/mysql/share # mysql -u root
    mysql> install plugin daemon_memcached soname "libmemcached.so";
    Query OK, 0 rows affected (0.02 sec)
    root@wl /usr/local/mysql/share # vi /etc/my.cnf
    daemon_memcached_option=-p11222
    
    위와 같이 설정한 후 서버를 재시작한다. 11222 포트가 열린것을 확인하자.
  • 설정 변경

    memcached 는 컨텐츠의 캐릭터 셋이나, 키의 길이에 제한이 없지만, InnoDB에 저장되는 MySQL기반의 memcached는 테이블 정의에 영향 받는다. 필자는 innodb_memcached_config.sql 파일에서 생성하는 demo_test 테이블을 아래와 같이 바꿔주었다.
    mysql> use test;
    mysql> drop table demo_test;
    mysql> CREATE TABLE demo_test (
    	c1 VARCHAR(128),
    	c2 text,
    	c3 INT,
    	c4 BIGINT UNSIGNED,
    	c5 INT,
    	primary key(c1)
    ) ENGINE = INNODB DEFAULT CHARSET=utf8;
    
  • 테스트

    아래와 같이 간단히 테스트해볼 수 있다.
    root@wl ~ # telnet 127.0.0.1 11222
    set a11 10 0 9
    123456789
    STORED
    get a11
    VALUE a11 0 9
    123456789
    END
    quit
    
    MySQL 서버를 재시작한다.
    root@wl ~ # telnet 127.0.0.1 11222
    get a11
    VALUE a11 10 9
    123456789
    END
    quit
    
    캐시 내용이 사라지지 않는다. 기본 세팅을 사용했기 때문에, 데이터는 test.demo_test 테이블에 저장된다. 아래와 같이 저장된 데이터를 쿼리해볼 수 있다.
    root@maid ~ # mysql -u root
    mysql> use test
    Database changed
    mysql> show tables;
    +----------------+
    | Tables_in_test |
    +----------------+
    | demo_test      |
    +----------------+
    1 row in set (0.03 sec)
    
    mysql> select * from demo_test;
    +-----+--------------+------+------+------+
    | c1  | c2           | c3   | c4   | c5   |
    +-----+--------------+------+------+------+
    | a11 | 123456789    |   10 |    1 |    0 |
    | AA  | HELLO, HELLO |    8 |    0 |    0 |
    +-----+--------------+------+------+------+
    2 rows in set (0.06 sec)
    
    mysql> exit
    

JAVA/JSP

  • JAVA에서 memcached 를 사용하기 위한 라이브러리 중 spymemcached에 대해 소개한다.
  • 설치는 spymemcached-2.11.7.jar 를 받아 CLASS PATH에 복사해놓으면 된다.
  • 홈페이지: spymemcached
memcache.java
다운로드 (717 바이트)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package test;
 
import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.HashMap;
 
import net.spy.memcached.MemcachedClient;
 
/**
 * Memcached Sample.
 * WindyHana's Solanara - Memcached http://www.solanara.net/solanara/memcached
 * java test.MemcachedSample
 */
public class MemcachedSample {
    /**
     * 테스트 함수
     * @param args
     */
    @SuppressWarnings("unused")
    public static void main(String[] args) {
        MemcachedClient c;
        try {
            c = new MemcachedClient(new InetSocketAddress("localhost", 11211));
            c.set("someKey", 3600, new HashMap<String, Object>());
            Object myObjeckt = c.get("someKey");
            c.delete("someKey2");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

PHP

PHP에서 memcached 를 사용하기 위한 모듈은 두가지를 제공한다. PECL:memcache, PECL:memcached 가 그것인데, 두가지 모두 memcached 에 접속해 사용한다. 단지 PECL:memcache는 memcached 에 직접 접속하는 PHP 모듈이고, PECL:memcached 는 libMemcached 를 통해 memcached 에 접속하는 모듈이라는 점이 다르다. PHP에서의 사용 방법이나 지원 함수도 조금씩 다르므로 매뉴얼을 확인하자.
  • PECL:memcache 를 설치하기 위해서는 autoconf 가 필요하다. 윈디하나의 솔라나라: Autotools - autoconf를 참고해 autoconf 를 설치하자.
  • PECL:memcache 설치 및 설정

    우선 아래와 같이 소스를 컴파일해 memcache.so 를 생성한다.
    root@wl ~/src # mkdir phpmemcache
    root@wl ~/src # cd phpmemcache
    root@wl ~/src/phpmemcache # /usr/local/php/bin/pecl download memcache
    root@wl ~/src/phpmemcache # tar xvf memcache-2.2.7.tgz
    root@wl ~/src/phpmemcache # cd memcache-2.2.7
    root@wl ~/src/phpmemcache/memcache-2.2.7 # /usr/local/php/bin/phpize
    root@wl ~/src/phpmemcache/memcache-2.2.7 # CFLAGS="-xc99" ./configure -with-php-config=/usr/local/php/bin/php-config
    root@wl ~/src/phpmemcache/memcache-2.2.7 # make
    root@wl ~/src/phpmemcache/memcache-2.2.7 # cp memcache.php /usr/local/php/lib/php
    root@wl ~/src/phpmemcache/memcache-2.2.7 # cp ./modules/memcache.so /usr/local/php/lib/php/extensions
    
    다음에는 php.ini를 수정해 memcache.so 모듈을 로드해야 한다. 윈디하나의 솔라나라: AMPPHP 설정를 참조해 extension_dir 을 설정하고 아래와 같이 extension 을 추가해야 한다.
    root@wl ~ # vi /usr/local/php/lib/php.ini
    ...
    extension=memcache.so
    
  • memcached 세션 설정

    PHP의 세션 핸들러로 memcached 를 설정할 수 있으며, 저장 경로로 두개 이상의 memcached 데몬을 사용할 수 있다. php 세션을 위한 memcached 의 키값은 [memc.sess.key] 형식으로 정해진다.
    root@wl ~ # vi /usr/local/php/lib/php.ini
    session.save_handler = memcache
    session.save_path = "127.0.0.1:11211"
    
  • PHP - memcache 테스트

    memcache.phps
    다운로드 (534 바이트)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    <?php session_start(); ?>
    <pre>
    <?php
    $presessdata = @$_SESSION["data"];
    $_SESSION["data"] = @$_SESSION["data"] + 1;
     
    $memcache = new Memcache;
    $memcache->connect("localhost", 11211);
    print_r($memcache->getStats());
     
    $items = array(
        'key1' => 'value1',
        'key2' => 'value2',
        'key3' => 'value3'
    );
    foreach ($items as $k => $v) {
        $memcache->set($k, $v);
    }
    var_dump($memcache->get(array('key1', 'key3')));
    var_dump($memcache->get('key2'));
    var_dump($memcache->get('key4'));
    ?>
    SESSION: <?php echo $_SESSION["data"]; ?>
    </pre>
    아래와 유사하게 출력되어야 한다.
    Array
    (
        [pid] => 16700
        [uptime] => 425530
        [time] => 1333412724
        [version] => 1.4.15
        [libevent] => 2.0.20-stable
        [pointer_size] => 32
        [rusage_user] => 6.387770
        [rusage_system] => 4.913250
        [curr_connections] => 5
        [total_connections] => 57
        [connection_structures] => 7
        [reserved_fds] => 20
        [cmd_get] => 148
        [cmd_set] => 45
        [cmd_flush] => 0
        [cmd_touch] => 0
        [get_hits] => 100
        [get_misses] => 48
        [delete_misses] => 6
        [delete_hits] => 0
        [incr_misses] => 0
        [incr_hits] => 0
        [decr_misses] => 0
        [decr_hits] => 0
        [cas_misses] => 0
        [cas_hits] => 0
        [cas_badval] => 0
        [touch_hits] => 0
        [touch_misses] => 0
        [auth_cmds] => 0
        [auth_errors] => 0
        [bytes_read] => 66307
        [bytes_written] => 36315
        [limit_maxbytes] => 67108864
        [accepting_conns] => 1
        [listen_disabled_num] => 0
        [threads] => 4
        [conn_yields] => 0
        [hash_power_level] => 16
        [hash_bytes] => 262144
        [hash_is_expanding] => 0
        [expired_unfetched] => 0
        [evicted_unfetched] => 0
        [bytes] => 27437
        [curr_items] => 20
        [total_items] => 45
        [evictions] => 0
        [reclaimed] => 0
    )
    array(2) {
      ["key1"]=>
      string(6) "value1"
      ["key3"]=>
      string(6) "value3"
    }
    string(6) "value2"
    bool(false)
    SESSION: 1
RSS ATOM XHTML 1.0 CSS3

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
48 Apache APM 설치 apache 2.4 / php 5.5 / mariadb 10.0 맨하탄노숙자 2017.05.23 1
47 Apache APM 맨하탄노숙자 2017.02.06 14
46 PHP How To Use Systemctl to Manage Systemd Services and Units 맨하탄노숙자 2016.07.19 28
45 PHP php-fpm systemctl 추가 맨하탄노숙자 2016.07.19 26
44 php gd-library 소스 경로 및 컴파일 옵션 맨하탄노숙자 2016.04.17 42
43 PHP PHP 5.2.17 컴파일시 오류 발생 file 맨하탄노숙자 2016.04.17 45
42 Apache 스토리지 웹서버 secret 맨하탄노숙자 2016.04.17 0
41 Apache Apache의 Worker / Prefork 방식의 차이점과 세팅 방법 맨하탄노숙자 2016.04.17 33
40 Apache [CENTOS] apache web server switching from prefork to worker MPM 맨하탄노숙자 2016.04.17 76
» PHP PHP 4 Memcache 맨하탄노숙자 2016.03.06 58
38 NGINX nginx location 설정 맨하탄노숙자 2016.02.18 76
37 NGINX nginx 파일 공유 및 암호 설정하기 맨하탄노숙자 2016.02.18 169
36 NGINX nginx에서 동영상 스트리밍 서비스하기 맨하탄노숙자 2016.02.18 49
35 PHP PHP/cURL download progress monitoring 맨하탄노숙자 2016.02.15 37
34 PHP cURL download progress in PHP file 맨하탄노숙자 2016.02.15 75
33 이미지 다운로드시 다운로드 진행상황 표시 file 맨하탄노숙자 2016.02.15 65
32 PHP 파일 업로드 진행상황표시 file 맨하탄노숙자 2016.02.15 67
31 PHP 다운로드 구현 상태 (진행 상황 표시) 맨하탄노숙자 2016.02.15 49
30 PHP UTF-8 파일 다운로드 함수 맨하탄노숙자 2016.02.15 66
29 PHP down.php 다운로드 구현 맨하탄노숙자 2016.02.15 71
Board Pagination Prev 1 2 ... 3 Next
/ 3