วันเสาร์ที่ 31 มกราคม พ.ศ. 2558

Memcache คุณค่า ที่คุณคู่ควร (ปัญหา query ที่ได้ data เดิมๆ...ไม่จำเป็นต้องทำบ่อยๆ)


Memcache คุณค่าที่คุณควร

มื่อระบบที่พวกคุณทำอยู่นั้น เป็นระบบที่แสดงผลลัพธ์จาก database (ไม่ว่าจะใช้ของอะไรก็แล้วแต่) ที่ซ้ำๆเดิมๆ เป็นระยะเวลาพอสมควร และไม่ว่า user สักกี่คนหรือ user กลุ่มใหญ่ๆ เข้ามาใช้ระบบของคุณ ก็เห็นผลลัพธ์เหมือนๆกัน.......ประเด็นอยู่ที่ว่า เราจะ query มันออกมาทำไมหลายๆรอบเพื่อผลลัพธ์เดิมๆ 

แล้วถ้ายิง database มีขนาดที่ใหญ่มาก ทำให้การ query ข้อมูลออกมาจากฐานข้องมูลมีความล่าช้า หรือไม่ก็มีผู้ใช้จำนวนมากเข้ามาใช้บริการ ก็จะทำให้ DBMS จะต้องเข้าไปอ่านข้อมูลจาก Harddisk ขึ้นมาทำให้เกิดปัญหาคอขวดเมื่อมีผู้ใช้งานปริมาณมาก

เราจึงมีวิธีแก้ปัญหาโดยการนำข้อมูลที่ถูกใช้บ่อยๆมาเก็บเอาไว้ใน cache ซึ้งเราจะนำข้อมูลเหล่านี้ออกมาใช้ได้ในทันที โดยไม่ต้องไป query ใน database อีก

Server มี Memcache หรือยังกว่า

connect(‘localhost’, 11211) or die (“Could not connect”);
// ติดต่อกับ server โดย localhost และ 11211 คือ port สำหรับติดต่อ memcache
echo “Version : “.$memcache->getVersion();
// getVersion เพิ่อดูว่า server ติดตั้งโปรแกรมเวอร์ชันอะไร

แต่ถ้ายังไม่มีผมก็จะแนะนำวิธีการติดตั้งไอ้เจ้า Memcache โดยคลิกไปตาม link นี้นะครับ (เป็น Cent OS นะแจ๊ะ)
https://support.hostatom.com/knowledgebase.php?action=displayarticle&id=78

โดยถ้าเรียบร้อยก็เอาละ!!! มาเริ่มกันเลย

connect(‘localhost’, 11211);
คือการ connect เข้าไปยัง Memcache
$key = md5($sql);
เข้ารหัส query (query อะไรก็แล้วแต่เลยจร้า) เป็น key ของ memcache เพื่อใช้เรียก memcache (หรือจะใช้ key เป็นอะไรก็แล้วแต่เลยเจ้าฮะ)
 $getResult = $memcache->get($key);
 คือการดึงข้อมูลออกจาก Memcache โดยใช้ Key ที่ถูกเข้ารหัสก่อนหน้านี้ (การเรียกใช้ข้อมูลเป็นไปในลักษณะ key - value)

แต่ทว่า........Memcache ยังไม่ได้ถูกบันทึกค่าอะไรลงไปเลยนิ ผลลัพธ์ก็ไม่ได้ออกมา ดังนั้นเขา(จากที่เคยเห็นเขาทำกัน...อ๊ะ หรือผมคนเดียวที่เขียนแบบนี้) จึงนิยมเขียนโปรแกรมเพื่อตรวจสอบว่ามี value อยู่ใน memcache หรือไม่ โดยถ้ามีก็ให้นำออกมาใช้ ถ้าไม่มีก็ให้ query แล้วนำผลลัพธ์ ออกมา set ค่า key และ value เข้าไปใหม่และกำหนดระยะเวลาที่จะเครีย memcache ด้วยเพื่อที่จะได้มีข้อมูลที่มีการอัพเดทเอาไปใช้

if($getResult){
      echo "Load Data From Memcache";
      print_r($getResult);
}
$setResule ไม่เป็นค่าว่างก็แปลว่ามีข้อมูลอยู่
else {
echo “Load Data From Database"; 
$result = mysql_query($sql) or die(mysql_error());
$arr = array();
while($rs = mysql_fetch_array($result)){
array_push($arr, array(
‘id’ => $rs[‘id’],
‘title’ => $rs[‘title’],
‘detail’ => $rs[‘detail’],
‘time’ => $rs[‘time’]
));
$memcache->set($key, $arr, MEMCACHE_COMPRESSED, 120);
        print_r($arr);
- $key คือ key ที่ใช้ระบุข้อมูลเวลาที่จะนำข้อมูลออกจาก Memcache
- $arr คือ ข้อมูลที่ได้จากการ query
(ปล. mysql_query เลิกใช้ได้แล้วนะครับคุณผู้อ่าน ไปใช้ PDO กันเถิดชาวไทย ในที่นี้ผมไม่อยากจะเขียนให้มันยาวเท่านั้น เลยใช้ไปก่อน)
- MEMCACHE_COMPRESSEDMEMCACHE_COMPRESSED คือการเก็บข้อมูลลง Memcache โดยการบีบอัดข้อมูล
- 120 คือเวลาที่จะบันทึกข้อมูลนี้เอาไว้ 120 วินาที เมื่อครบ 120 วินาที ข้อมูลของ key นี้จะถูกเคลียร์

การใช้ Memcache ก็ง่ายนิดเดียวครับ ลดภาระของ DBMS ไปได้ตั้งเยอะ ก็บอกแล้ว "Memcache คุณค่า ที่คุณคู่ควร"

วันศุกร์ที่ 30 มกราคม พ.ศ. 2558

ติดตั้ง Mongodb กับ Mac OS X

Install Mongodb กับ Mac OS X

จะเริ่มจากการเข้าไปยัง terminal ของ Mac OS X ก่อน โดยเราจะใช้วิธีติดตั้งผ่าน brew ดังนั้น ถ้าผู้ใดยังมิได้ติดตั้ง brew แล้วไซร้(อินกับละครไปนิด) เชิญติดตั้งตาม link นี้เลยจ้า

ติดตั้ง >>> brew 

แต่ไม่ต้องการเรียนรูปอะไรเกี่ยวกับ brew มากมาย ขอมีติดเครื่องไว้สำหรับติดตั้งนู่นนี่นั่น ก็พิมพ์ลงไปเลยแล้วก็รอครับ
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
ติดตั้ง mongodb

ขั้นตอนที่ 1 ถ้าเรามีไอ้เจ้า brew อยู่แล้วก็อาจจข้ามไปได้เลยจ๊ะ
brew update
ขั้นตอนที่ 2 ติดตั้ง mongodb
brew install mongodb
หรือเราจะให้ mongodb ของเรา SSL Support ด้วยก็ตามนี้เลย
brew install mongodb --with-openssl
เท่านี้ การติดตั้งก็เสร็จสมบูรณ์

แล้ว Run Mongodb มาใช้ยังไงละ
1. เราจะต้องสร้าง data directory ขึ้นมาสะก่อนเด้อ
mkdir -p /data/db
-p หมายความว่าให้สร้าง Directory ที่ยังไม่มี ก่อนที่จะไปถึง /db ให้ด้วยน๊ะ ในที่นี้หมายถึง /data

2. Run MongoDB
แต่ก่อนจะ Run ก็ดูพวก Permissions ก่อนด้วยนะครัช
mongod
เท่านี้ mongodb ก็จะรันรอรับการ connect เข้ามาใช้งานแล้ว

แล้วถ้าอยากรู้ว่าไอ้เจ้า mongodb ของเรานั้นมันไปอยู่ที่ใดบนเครื่อง ก็สามารถใช้คำสั่ง
brew info mongo
เพื่อไปดูรายละเอียดต่างของ mongodb ของเรา เช่น ที่อยู่ ,version ,บลาๆๆๆๆ
และสำหรับ v 2.6.6 ก็จะไปอยู่ที่
cd /usr/local/Cellar/mongodb/2.6.6
ลองใช้คำสั่ง cd เข้าไปดูได้ และไอ้เจ้า mongod ที่รันอยู่ของเรานั้น ก็อยู่ใน /bin นั้นและครับ

การเข้าไปใช้งาน Mongodb

เราจะใช้คำสั่ง
mongo
จากนั้นเราก็จะเข้าไป MongoDB Shell


แต่การใช้งาน Mongodb , คำสั่ง , แนวคิดต่างๆ แนะนำให้เข้าไปที่ url ด้านล่าง เข้าไปอ่านให้หมดเลยครับ ว่าอะไรเป็นอะไร
http://mongodb.in.th/
ที่นี้ เรามาลองใช้คำสั่งกับมันเล่นๆดูดีกว่า
db.unicorns.insert({name: ‘Monster’, gender: ‘f’, weight: 450})
collection ชื่อว่า unicorns ถูกเพิ่ม document ลงไปโดยรายละเอียดคือ 
name: 'Monster'gender: 'f'weight: 450

หลังจากพิมพ์ลงไปก็จะได้ผมลัพธ์ดังนี้
โดยมันตอบกลับกลับมาว่า
WriteResult({"nInserted":1})
ซึ้งแปลว่า Insert สำเร็จไปแล้วน๊ะ 1 document
ที่นี้มาลองค้นคืนข้อมูลที่ insert มาเมื่อสักครู่กันดูดีกว่า
db.unicorns.find()
 ถ้าเปรียบกับภาษา SQL ก็เปรียบเหมือน SELECT * FROM unicorns ละครับ
จากรูปภาพผมได้ใส่ข้อมูลที่มีรายระเอียดดังนี้เข้าไปด้วย
name: 'Aurora'gender: 'f'weight: 450
เพื่อที่จะดำเนินเรื่องไปสู่การ Delete แบบมีเงื่อนไข จากนั้นก็จะ find() ค้นหาให้ดูอีกรอบแล้วยังมีข้อมูลอยู่ได้นั้นเอง ฮาๆๆๆๆ .... มะ!!! เริ่มเลย
  db.unicorns.remove({name: 'Aurora'});
ลบ document ที่มี name ชื่อว่า Aurora
db.unicorns.find()

 ผลลัพธ์ที่ได้ออกมาก็คือ Aurora โดนลบไปแล้วจ้าาาาาาา

          *** ก็ขอให้ทุกคนสนุกกับการใช้งาน Mongodb นะครับ เป็นฐานข้อมูลที่น่าสนใจมากสำหรับงานหลายๆงานเลยทีเดียว พบกันใหม่ใน Blog หน้า สำหรับ Blog นี้ สวัสดีครับ (แหม่!!! เหมือนพูดจบรายการ TV เลยนะ)