Memcached คืออะไร
Memcached คือการทำ cache บน memory ที่สามารถเข้าใช้งานได้โดยง่ายและรวดเร็ว
เพื่อลดการ query ไปที่ database และเพิ่มประสิทธิภาพในการทำงานของ application
โดยในปัจจุบันมี api สำหรับหลาย ๆ ภาษาที่จะเข้าถึง memcached ได้ เช่น php, perl, python, ruby, ...
เราสามารถเพิ่ม memcached server เข้าสู่ระบบได้โดยง่าย เพียงแต่เปิด memcached daemon ตัวใหม่
และ add เข้าไปใน memcached pool ของเราแค่นั้นเอง ถ้าเครื่องไหนเสีย ก็ set IP ของเครื่องอื่นมาแทนได้เลย
(ถ้ามี memcache run อยู่ที่ server นั้นนะ)
Sample raw memcached session
ตัวหนาคือที่พิมพ์เข้าไปครับ
[root@sample ~]#memcached -d -m 50 -l 127.0.0.1 -p 11211 -u apache [root@sample ~]#telnet 127.0.0.1 11211 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. set key1 0 0 3 abc STORED set key2 0 0 4 wxyz STORED get key1 VALUE key1 0 3 abc END gets key1 key2 VALUE key1 0 3 1 abc VALUE key2 0 4 2 wxyz END delete key1 DELETED gets key1 key2 VALUE key2 0 4 2 wxyz END
memcached paramters
-d = รัน memcached เป็น daemon (background)
-m MiB = ขนาดของ cache หน่วยเป็น Megabyte (Default 64MB)
-l IP = IP ที่จะรอรับ Request
-p Port = Port ที่จะรอรับ Request
-u Username = ให้ memcached run ด้วย user อะไร (ทำได้ก็ต่อเมื่อ run memcached ด้วย root)
memcache command format
- Set value: ใส่ค่าใหม่
set <key> <flags> <expire> <size of datablock in bytes>\r\n <datablock>\r\n
key = key name เอาไว้ใช้อ้างอิงในการเรียกดูค่า
flags = ตอนนี้ยังไม่ได้อ่านว่าใส่อะไรได้บ้างแต่ใส่ 0 ไปก็ได้
expire = เวลาที่จะหมดอายุ (ใส่ 0 คือไม่มีวันหมดอายุ)
size of datablock in bytes = ขนาดของ data ที่จะใส่เข้าไป
- Get value: เรียกดูค่าที่อยู่ใน memcached
get <key>
- Get multiple values at once: เรียกดูทีละหลาย ๆ ค่า (เพื่อประหยัด network overhead)
gets <key1> <key2> ...
- Delete value: ลบค่าที่ใส่ไว้ใน memcached
delete <key>
ข้อจำกัดของการใช้ memcached
- Key name ไม่เกิน 250 ตัวอักษร
- Data block ขนาดไม่เกิน 1 MB ต่อ Key
Caution!
- php-pecl-memcache v2.2.0 และ v2.2.1+ มี hashing funcion ที่ไม่เหมือนกัน
ถ้ามีการ add memcached server มากกว่า 1 server ให้กับ memcached object ใด ๆ
script จาก 2 version นี้จะเข้าถึงข้อมูลคนละ server กัน - -"
Furthur reading:
http://docs.google.com/Present?docid=dcw8bwss_4g5kfrgg2 -- My slide about memcached technology
Reference:
http://www.danga.com/memcached/ -- Official memcached website
Comments
สอบถามหน่อยครับผม
ผมติดตั้ง memcached ลงใน CentOs 3.4 เพื่อเอามาใช้ในการเขียนโปรแกรม java แล้ว พอจะทดสอบผ่าน telnet เมื่อลองส่งคำสั่งไป ทั้ง set get ส่งไปแล้วไม่มี respond อะไรกลับมาเลยครับ อยากทราบว่าเป็นที่อะไรและต้องแก้ไขยังไงครับ ขอบคุณครับ
CentOS 3.4 เลยเหรอครับ?
ผมใช้แต่ CentOS 5.x ครับ ไม่แน่ใจว่า 3.4 มันต่างกันมากไหม
ว่าแต่ที่ลอง telnet นี่ใช้ 127.0.0.1 หรือ ผ่าน network จริง ๆ ครับ
ถ้าลอง 127.0.0.1 แล้วยังไม่ได้นี่สงสัย memcached จะอาการแปลก ๆ แล้วหละครับ
ส่วนถ้าผ่าน network อาจจะต้องลอง check ดูว่า packet มันไปตกหล่นตรงไหนมั้ย (พูดเหมือนเป็นพัสดุไปได้ หุหุ)
ขอบคุณที่ตอบครับ ใช้ 3.4 เพราะเป็น os เดิมที่อยู่ในเครื่องครับ
พอดีพี่ที่ทำงานเค้าให้ลองทำอ่ะครับ ผมเป็นเด็กใหม่ยังไม่ค่อยรู้เรื่องอ่ะครับ
ผมลองกับ 127.0.0.1 แต่มันไม่มีอะไรตอบกลับมาเลย
ผมควรจะทำยังไงครับพี่ แนะนำผมหน่อยครับ
ลองเรียกใช้ memcached
ลองเรียกใช้ memcached แบบไม่ใช่ daemon ดูนะครับ โดยตัด -d ออก
และให้เติม -vv เข้าไปด้วย เพื่อให้ memcached print log message ออกมาให้ดูด้วย เช่น
{syntaxhighlighter brush: plain; gutter: false;}
memcached -vv -m 50 -l 127.0.0.1 -p 11211 -u apache
{/syntaxhighlighter}
จากนั้นให้เปิดอีก Terminal ดูแล้ว telnet เข้าไป โดยให้สังเกตว่า Teminal ที่เปิด memcached นั้นมีการตอบสนองอย่างไรบ้างครับ
ตัวอย่าง log message ของเครื่องผม
{syntaxhighlighter brush: plain; gutter: false;}
<4 server listening
<5 server listening
<6 send buffer was 9216, now 3728270
<6 server listening (udp)
<7 send buffer was 9216, now 3728270
<7 server listening (udp)
<8 new client connection
<8 quit
<8 connection closed.
<8 new client connection
<8 quit
<8 connection closed.
{/syntaxhighlighter}
จังหวะที่เป็น <8 นั่นคือผม telnet จากอีก Terminal เข้าไปครับ
ตามมาจาก Google
ตามมาจาก Google เช่นเดียวกันครับ : )
วันนี้ลองค้นหาคำว่า " ดู list
วันนี้ลองค้นหาคำว่า " ดู list Memcache " เจอ simicolon ขึ้นหน้าหนึ่ง อันดับ 6 ( โดยประมาณ ) ด้วยละครับ
เยี่ยมจัง
วันนี้ ผมเพิ่งหัดทำ บนเครื่องตัวเองครับ ( Ubuntu )
เยี่ยมครับว่าแต่ ประเภท telnet เข้าไปสั่งแบบ command line ยังไม่ได้ลองเลย
จงเจริญ - dek มีปัญหา เหอะๆๆ