Cách cài đặt và sử dụng Memcache trên Ubuntu 14.04
Khi các trang web phát triển và tăng lưu lượng truy cập, một trong những thành phần thể hiện sự căng thẳng nhanh nhất là database backend . Nếu database của bạn không được phân phối và cấu hình để xử lý tải cao, nó có thể dễ dàng bị quá tải do lưu lượng truy cập tăng tương đối khiêm tốn.Một cách để giải quyết vấn đề này là sử dụng hệ thống bộ nhớ đệm đối tượng bộ nhớ, như memcached . Memcached là một hệ thống bộ nhớ đệm hoạt động bằng cách lưu trữ tạm thời thông tin trong bộ nhớ thường được truy xuất từ database . Yêu cầu tiếp theo đối với thông tin trong bộ nhớ sau đó cực kỳ nhanh chóng mà không gây căng thẳng cho database backend .
Trong hướng dẫn này, ta sẽ thảo luận về cách cài đặt và sử dụng memcached trên server Ubuntu 14.04.
Yêu cầu
 Trước khi  ta  bắt đầu, bạn nên có một  regular user , không phải root trên  server  của bạn, người này có quyền truy cập vào các  quyền  sudo . Nếu bạn chưa tạo  user  như vậy, bạn có thể làm như vậy  theo  các bước từ 1-4 trong hướng dẫn  cài đặt  ban đầu cho Ubuntu 14.04 của  ta .
Khi bạn đã cấu hình regular user của bạn , hãy tiếp tục với hướng dẫn này.
Cài đặt Memcached và các thành phần
Để bắt đầu, ta nên lấy tất cả các thành phần ta cần từ kho của Ubuntu. May mắn là mọi thứ ta cần đều có sẵn.
 Vì đây là hoạt động đầu tiên của  ta  với apt trong phiên này,  ta  nên cập nhật  index gói  local   của bạn . Sau đó,  ta  có thể cài đặt các chương trình của  ta .
Ta sẽ cài đặt memcached cũng như chương trình backend database MySQL và PHP để xử lý tương tác. Ta cũng đang cài đặt phần mở rộng PHP để xử lý các tương tác memcached. Bạn có thể nhận được mọi thứ mình cần bằng lệnh :
sudo apt-get update sudo apt-get install mysql-server php5-mysql php5 php5-memcached memcached  Lưu ý  có sẵn * hai phần mở rộng PHP memcache. Một phần mở rộng có tên là php5-memcache và phần còn lại có tên là php5-memcached (lưu ý dấu “d” trong ví dụ thứ hai).  Ta  đang sử dụng phần mở rộng thứ hai vì nó ổn và triển khai nhiều tính năng hơn.
Nếu bạn chưa cài đặt MySQL, cài đặt sẽ nhắc bạn chọn và xác nhận password của administrator .
Điều này sẽ cài đặt và cấu hình mọi thứ bạn cần.
Kiểm tra cài đặt
Tin hay không thì tùy bạn, memcached đã được cài đặt hoàn chỉnh và sẵn sàng hoạt động. Ta có thể kiểm tra theo một số cách khác nhau.
Cách đầu tiên là khá đơn giản. Ta chỉ có thể hỏi PHP xem nó có biết về tiện ích mở rộng memcached của ta hay không và liệu nó có được kích hoạt hay không. Ta có thể làm điều này bằng cách tạo trang thông tin PHP phổ biến.
 Điều này có thể dễ dàng thực hiện bằng cách tạo một file  có tên là info.php trong tài liệu root  của  ta . Trong Apache trên Ubuntu 14.04, root  tài liệu mặc định của  ta  là /var/www/html . Mở file  tại đây với  quyền  root:
sudo nano /var/www/html/info.php Trong file này, hãy gõ cái này ra. Về cơ bản, điều này chỉ gọi một hàm PHP thu thập và in thông tin về server của ta vào một bố cục thân thiện với web.
<?php phpinfo(); ?> Bây giờ, bạn có thể truy cập vào domain  hoặc địa chỉ IP công cộng của  server , theo sau là /info.php và bạn sẽ thấy một trang thông tin.
 <pre>
 http: // <span class = “highlight”> tên domain  hoặc IP  server  </span> /info.php
 </pre>
Nếu bạn cuộn xuống hoặc tìm kiếm tiêu đề phần “memcached”, bạn sẽ tìm thấy một cái gì đó giống như sau:
Điều này nghĩa là phần mở rộng memcached đã được kích hoạt và được tìm thấy bởi web server .
Ta cũng có thể kiểm tra xem dịch vụ memcached có đang chạy hay không bằng lệnh :
ps aux | grep memcached memcache  6584  0.0  0.0 327448  3004 ?        Sl   14:07   0:00 /usr/bin/memcached -m 64 -p 11211 -u memcache -l 127.0.0.1 demouser  6636  0.0  0.0  11744   904 pts/0    S+   14:29   0:00 grep --color=auto memcached Bạn có thể truy vấn dịch vụ để biết số liệu thống kê bằng lệnh :
echo "stats settings" | nc localhost 11211 Nếu bạn cần dừng, bắt đầu hoặc khởi động lại dịch vụ memcached, bạn có thể thực hiện việc này bằng lệnh thông tin như sau:
 <pre>
 sudo service memcached <span class = “highlight”> khởi động lại </span>
 </pre>
Kiểm tra xem Memcached có thể lưu vào bộ nhớ cache dữ liệu hay không
Bây giờ ta đã xác minh memcached đang chạy và tiện ích mở rộng PHP của ta để kết nối với nó đã được bật, ta có thể cố gắng để nó lưu trữ dữ liệu.
Ta sẽ làm điều này bằng cách tạo một tập lệnh PHP khác. Lần này, nó sẽ phức tạp hơn.
 Mở một file  có tên cache_test.php trong root  tài liệu của  ta :
sudo nano /var/www/html/cache_test.php Bên trong, hãy bắt đầu bằng cách tạo các thẻ shell bọc PHP:
 <pre>
 <? php
 ?>
 </pre>
 Trong đó,  ta  sẽ tạo một version  mới của đối tượng PHP Memcached và lưu trữ nó trong một biến.  Ta  sẽ xác định vị trí mà đối tượng PHP này có thể kết nối với dịch vụ memcached thực sự đang chạy trên  server  của  ta . Memcached chạy trên cổng 11211 theo mặc định:
 <pre>
 <? php
 <span class = “highlight”> $ mem = new Memcached (); </span>
 <span class = “highlight”> $ mem-> addServer (“127.0.0.1”, 11211); </span>
 ?>
 </pre>
 Tiếp theo,  ta  sẽ yêu cầu version  Memcached của  ta  truy vấn khóa từ bộ nhớ cache của  ta . Khóa này có thể được gọi là bất cứ thứ gì, vì  ta  chưa tạo ra nó.  Ta  sẽ sử dụng "blah". Kết quả của yêu cầu này sẽ được lưu trữ thành một biến $result :
 <pre>
 <? php
 $ mem = new Memcached ();
 $ mem-> addServer (“127.0.0.1”, 11211);
 <span class = “highlight”> $ result = $ mem-> get (“blah”); </span>
 ?>
 </pre>
Tiếp theo, ta chỉ cần kiểm tra xem có gì được trả lại hay không. Nếu memcached tìm thấy một khóa có tên “blah”, ta muốn nó in ra giá trị được liên kết với khóa đó. Nếu memcached không thể tìm thấy khóa phù hợp, ta nên in ra một thông báo như vậy.
Sau đó, ta nên đặt khóa với một giá trị để lần tiếp theo ta yêu cầu giá trị, memcached sẽ tìm thấy giá trị mà ta cung cấp cho nó:
 <pre>
 <? php
 $ mem = new Memcached ();
 $ mem-> addServer (“127.0.0.1”, 11211);
$ result = $ mem-> get (“blah”);
 <span class = “highlight”> if ($ result) {</span>
 <span class = “highlight”> echo $ result; </span>
 <span class = “highlight”>} khác {</span>
 <span class = “highlight”> echo “Không tìm thấy khóa phù hợp. Tôi sẽ thêm nó ngay bây giờ! ”; </span>
 <span class = “highlight”> $ mem-> set (“blah”, “Tôi là dữ liệu! Tôi bị giữ trong memcached!”) hoặc chết (“Không thể lưu bất kỳ thứ gì vào memcached…”); </span>
 <span class = “highlight”>} </span>
 ?>
 </pre>
Đến đây, kịch bản của ta đã xong. Nếu ta truy cập trang này trong trình duyệt web của bạn , ta có thể thấy cách hoạt động của trang này:
 <pre>
 http: // <span class = “highlight”> tên domain  hoặc IP  server  </span> /cache_test.php
 </pre>
Ban đầu bạn sẽ thấy một trang trông như thế này:
Tuy nhiên, nếu ta làm mới trang, ta sẽ thấy một thông báo khác:
Như bạn thấy , dịch vụ memcached của ta hiện đang lưu trữ dữ liệu mà tập lệnh của ta đã đặt.
Kiểm tra giá trị database tạm thời lưu vào bộ nhớ đệm
Bây giờ ta đã kiểm tra khả năng lưu trữ dữ liệu trong memcached, ta có thể chứng minh một kịch bản thực tế hơn: tạm thời lưu trữ các kết quả từ một truy vấn database .
Tạo dữ liệu mẫu trong MySQL
Để làm điều này, trước tiên ta cần lưu trữ một số thông tin trong database của bạn .
Kết nối với version MySQL của bạn với quyền là admin-user bằng lệnh vào đây. Bạn sẽ phải nhập password root MySQL mà bạn đã đặt trong quá trình cài đặt:
mysql -u root -p Sau đó, bạn sẽ nhận được một dấu nhắc MySQL.
Đầu tiên, ta muốn tạo một database để thử nghiệm. Sau đó, ta sẽ chọn database :
CREATE DATABASE mem_test; USE mem_test; Hãy tạo một  user  được gọi là test với password  testing123 có quyền truy cập vào database  mà  ta  đã tạo:
GRANT ALL ON mem_test.* TO test@localhost IDENTIFIED BY 'testing123'; Bây giờ,  ta  sẽ tạo một bảng thực sự cơ bản và chèn một bản ghi vào đó. Bảng sẽ được gọi là sample_data và nó sẽ chỉ có một index  và một trường chuỗi:
CREATE TABLE sample_data (id int, name varchar(30)); INSERT INTO sample_data VALUES (1, "some_data"); Bây giờ, ta đã tạo cấu trúc và dữ liệu được chèn vào. Ta có thể thoát khỏi MySQL:
exit Tạo tập lệnh PHP để lưu vào bộ nhớ đệm dữ liệu MySQL
Bây giờ ta đã có dữ liệu trong MySQL, ta có thể tạo một tập lệnh PHP khác sẽ hoạt động theo cách tương tự như một ứng dụng PHP production .
Nó sẽ tìm kiếm dữ liệu trong memcached và trả về nếu nó tìm thấy dữ liệu. Nếu nó không tìm thấy dữ liệu, nó sẽ truy vấn từ chính database và sau đó lưu trữ kết quả trong memcached cho các truy vấn sau này.
 Để bắt đầu, hãy tạo một tập lệnh PHP khác trong root  tài liệu của  ta .  Ta  sẽ gọi script này là database_test.php :
sudo nano /var/www/html/database_test.php Bắt đầu theo cách tương tự như kịch bản cuối cùng của ta . Ta sẽ tạo một version PHP memcached và sau đó cho nó biết vị trí của dịch vụ memcached đang chạy trên server của ta , giống như ta đã làm lần trước:
 <pre>
 <? php
 $ mem = new Memcached ();
 $ mem-> addServer (“127.0.0.1”, 11211);
 ?>
 </pre>
Tiếp theo, trong lần khởi hành đầu tiên từ tập lệnh cuối cùng, ta sẽ phải xác định cách PHP có thể kết nối với database MySQL của ta . Ta cần chỉ định thông tin đăng nhập cho user mà ta đã tạo và sau đó ta cần cho người đó biết database nào sẽ sử dụng:
 <pre>
 <? php
 $ mem = new Memcached ();
 $ mem-> addServer (“127.0.0.1”, 11211);
 <span class = “highlight”> mysql connect (“localhost”, “test”, “testing123”) hoặc chết ( lỗi mysql ()); </span>
 <span class = “highlight”> mysql select db (“mem test”) or die (mysql error ()); </span>
 ?>
 </pre>
 Tiếp theo,  ta  sẽ phải thiết kế truy vấn mà  ta  cần để tìm nạp dữ liệu mà  ta  đã chèn vào bảng  của bạn .  Ta  sẽ lưu trữ điều này vào một biến $query .
 Sau đó,  ta  sẽ tạo một biến $querykey để lưu trữ khóa mà memcached sẽ sử dụng để tham chiếu thông tin của  ta .
Ta tạo khóa này bằng cách sử dụng chuỗi “KEY” và sau đó thêm tổng kiểm tra md5 (một phương pháp băm) của truy vấn của ta vào cuối. Điều này sẽ đảm bảo mỗi khóa là duy nhất nếu ta sử dụng kỹ thuật này trên một tập dữ liệu lớn hơn. Nó cũng đảm bảo một truy vấn phù hợp sẽ tạo ra cùng một khóa cho các yêu cầu tiếp theo.
 <pre>
 <? php
 $ mem = new Memcached ();
 $ mem-> addServer (“127.0.0.1”, 11211);
 mysql connect (“localhost”, “test”, “testing123”) hoặc chết ( lỗi mysql ());
 mysql select db (“mem test”) or die (mysql error ());
 <span class = “highlight”> $ query = “CHỌN ID TỪ dữ liệu mẫu WHERE name = 'some data'”; </span>
 <span class = “highlight”> $ querykey = “KEY”. md5 ($ query); </span>
 ?>
 </pre>
 Tiếp theo,  ta  sẽ tạo một biến $result , giống như tập lệnh cuối cùng của  ta . Điều này sẽ giữ kết quả từ truy vấn đã ghi nhớ của  ta , giống như trước đây.  Ta  đang yêu cầu memcached cho khóa truy vấn mà  ta  đã tạo để xem liệu nó có bản ghi được xác định bởi khóa đó trong hệ thống của nó hay không.
 <pre>
 <? php
 $ mem = new Memcached ();
 $ mem-> addServer (“127.0.0.1”, 11211);
 mysql connect (“localhost”, “test”, “testing123”) hoặc chết ( lỗi mysql ());
 mysql select db (“mem test”) or die (mysql error ());
 $ query = “CHỌN tên TỪ dữ liệu mẫu WHERE id = 1”;
 $ querykey = “KEY”. md5 ($ truy vấn);
 <span class = “highlight”> $ result = $ mem-> get ($ querykey); </span>
 ?>
 </pre>
Bây giờ ta đã sẵn sàng thực hiện logic kiểm tra thực tế sẽ xác định điều gì sẽ xảy ra khi kết quả được tìm thấy trong memcached. Nếu kết quả được tìm thấy, ta muốn in dữ liệu mà ta đã lấy ra và cho user biết rằng ta có thể truy xuất trực tiếp từ memcached:
 <pre>
 <? php
 $ mem = new Memcached ();
 $ mem-> addServer (“127.0.0.1”, 11211);
 mysql connect (“localhost”, “test”, “testing123”) hoặc chết ( lỗi mysql ());
 mysql select db (“mem test”) or die (mysql error ());
 $ query = “CHỌN tên TỪ dữ liệu mẫu WHERE id = 1”;
 $ querykey = “KEY”. md5 ($ truy vấn);
$ result = $ mem-> get ($ querykey);
 <span class = “highlight”> if ($ result) {</span>
 <span class = “highlight”> print “<p> Dữ liệu là:”. $ kết quả [0]. “</p>”; </span>
 <span class = “highlight”> print “<p> Lưu vào bộ nhớ đệm thành công! </p> <p> Dữ liệu được truy xuất từ bộ nhớ đệm! </p>”; </span>
 <span class = “highlight”>} </span>
 ?>
 </pre>
 Bây giờ, hãy thêm logic cho kịch bản thay thế. Nếu kết quả không được tìm thấy,  ta  muốn sử dụng truy vấn mà  ta  đã tạo để yêu cầu MySQL cung cấp dữ liệu.  Ta  sẽ lưu trữ điều này vào biến $result mà  ta  đã thực hiện. Điều này sẽ ở dạng một mảng.
 Sau khi  ta  có kết quả của truy vấn,  ta  cần thêm kết quả đó vào memcached để dữ liệu sẽ ở đó vào lần tiếp theo  ta  làm điều đó.  Ta  có thể thực hiện việc này bằng cách cung cấp khóa memcached mà  ta  muốn sử dụng để tham chiếu dữ liệu ( ta  đã tạo khóa này với biến $querykey ), bản thân dữ liệu (được lưu trữ trong biến $result từ truy vấn MySQL) và thời gian để bộ nhớ cache dữ liệu trong vài giây.
Ta sẽ lưu nội dung của bạn vào bộ nhớ cache trong 10 giây. Trong thế giới thực, rất có thể sẽ có lợi khi lưu nội dung vào bộ nhớ cache lâu hơn. Có lẽ gần 10 phút (600 giây) nếu nội dung của bạn không thay đổi nhiều. Để thử nghiệm, một giá trị nhỏ hơn cho phép ta xem những gì đang xảy ra nhanh hơn mà không cần khởi động lại dịch vụ bộ nhớ đệm của ta .
 Sau đó,  ta  sẽ in ra một thông báo tương tự với kết quả truy vấn và cho  user  biết điều gì đã xảy ra.  Ta  nên thêm toàn bộ khối này làm khối else cho khối trước của  ta  if :
 <pre>
 <? php
 $ mem = new Memcached ();
 $ mem-> addServer (“127.0.0.1”, 11211);
 mysql connect (“localhost”, “test”, “testing123”) hoặc chết ( lỗi mysql ());
 mysql select db (“mem test”) or die (mysql error ());
 $ query = “CHỌN tên TỪ dữ liệu mẫu WHERE id = 1”;
 $ querykey = “KEY”. md5 ($ truy vấn);
$ result = $ mem-> get ($ querykey);
 if ($ kết quả) {
 print “<p> Dữ liệu là:”. $ kết quả [0]. “</p>”;
 print “<p> Lưu vào bộ nhớ đệm thành công! </p> <p> Dữ liệu được truy xuất từ bộ nhớ đệm! </p>”;
 } <span class = “highlight”> else {</span>
 <span class = “highlight”> $ result = mysql tìm nạp mảng ( truy vấn mysql ($ query)) hoặc chết ( lỗi mysql ()); </span>
 <span class = “highlight”> $ mem-> set ($ querykey, $ result, 10); </span>
 <span class = “highlight”> print “<p> Dữ liệu là:”. $ kết quả [0]. “</p>”; </span>
 <span class = “highlight”> print “<p> Không tìm thấy dữ liệu trong memcached. </p> <p> Dữ liệu được truy xuất từ MySQL và được lưu trữ trong memcached cho lần sau. </p>”; </span>
 <span class = “highlight”>} </span>
 ?>
 </pre>
Đây là kịch bản đã hoàn thành của ta . Nó sẽ cố gắng lấy dữ liệu từ memcached và trả về. Nếu không, nó sẽ truy vấn trực tiếp từ MySQL và lưu kết quả vào bộ nhớ cache trong 10 giây.
Kiểm tra tập lệnh
Bây giờ ta đã viết tập lệnh, ta có thể chạy nó bằng cách truy cập vị trí file trong trình duyệt web của ta :
 <pre>
 http: // <span class = “highlight”> tên domain  hoặc IP  server  </span> /database_test.php
 </pre>
Lần đầu tiên ta truy cập trang, ta sẽ thấy kết quả giống như sau:
Nếu ta làm mới điều này (trong vòng 10 giây kể từ lần truy cập cuối cùng của ta ), trang sẽ hiển thị một thông báo khác:
Nếu ta đợi một chút nữa, nội dung đã lưu trong bộ nhớ đệm sẽ hết hạn và lại bị xóa khỏi bộ nhớ đệm. Ta có thể làm mới tại thời điểm này để nhận lại thông báo đầu tiên, vì server phải quay lại database để nhận các giá trị thích hợp.
Kết luận
Bây giờ, bạn đã hiểu rõ về cách hoạt động của memcached và cách bạn có thể tận dụng nó để giữ cho web server của bạn không đánh database liên tục cho cùng một nội dung.
Mặc dù các tập lệnh PHP mà ta tạo trong hướng dẫn này chỉ là ví dụ, chúng sẽ cung cấp cho bạn một ý tưởng tốt về cách hệ thống hoạt động. Nó cũng sẽ cung cấp cho bạn một ý tưởng tốt về cách cấu trúc mã của bạn để bạn có thể kiểm tra memcached và quay lại database nếu cần.
<div class = “author”> Bởi Justin Ellingwood </div>
Các tin liên quan
Cách thiết lập NFS Mount trên Ubuntu 14.042014-04-30
Cách cài đặt và cấu hình Postfix trên Ubuntu 14.04
2014-04-29
Cách cài đặt và cấu hình Postfix trên Ubuntu 14.04
2014-04-29
Cách thêm swap trên Ubuntu 14.04
2014-04-28
Cách cài đặt WordPress trên Ubuntu 14.04
2014-04-24
Cách cài đặt và bảo mật phpMyAdmin trên Ubuntu 14.04
2014-04-23
Cách cài đặt Git trên Ubuntu 14.04
2014-04-23
Cách cài đặt Solr trên Ubuntu 14.04
2014-04-23
Cách cài đặt Ruby on Rails trên Ubuntu 14.04 bằng RVM
2014-04-22
Cách cài đặt và cấu hình Slim Framework trên Ubuntu 14.04
2014-04-22

