Memcached là gì?
Memcached
lầ một hệ thống dùng bộ nhớ để lưu trữ các đối tượng cần truy xuất nhanh,
nó là hệ thống cached phân tán (có thể thiết lập quản lý truy xuất ở nhiều máy chủ),
mục đích chính của Memcached là tăng tốc ứng dụng web, giảm tải truy vấn database.
Memcached dùng bộ nhớ vật lý thật của máy để lưu trữ dữ liệu theo cặp key/value,
ứng dụng nào dùng đến Memcached thì truy vấn đến nó bằng các API
tương ứng
để lưu hay lấy giá trị.
Trang chủ: https://memcached.org/
Nguyên tắc hoạt động đơn giản: Giả sử ứng dụng của bạn có dùng đến Memcached
, khi nhận được một truy vấn có yêu cầu lấy dữ liệu nào đó, thì ứng dụng sẽ kiểm tra xem có lưu trong Memcached
hay không, nếu có nó sẽ lấy dữ liệu đã lưu và trả về cho user (rất nhanh vì không truy xuất từ bộ nhớ, giảm tải CPU vì không phải tính toán để tạo ra đối tượng). Nếu đối tượng chưa được lưu trong Memcached
thì nó truy vấn đến CSDL, tính toán để tạo ra đối tượng, lưu lại và Memcached
rồi trả về cho user, và các yêu câu sau thì chỉ việc lấy kết quả từ Memcached
.
Cài đặt Memcached trên CentOS
# yum -y update # yum -y install memcached
Sau khi có Memcached, thiết lập để nó chạy cùng hệ thống
Trên CentOS 6 # chkconfig memcached on Trên CentOS 7 # systemctl enable memcached
Memcached
là dịch vụ lắng nghe ở cổng 11211
, nên muốn các ứng dụng Client truy cập được vào Memcached có mở cổng này
Mở cổng 11211 cho Memcached
Trên CentOS 6 # iptables -I INPUT -p udp --dport 11211 -j DROP # iptables -I INPUT -p tcp --dport 11211 -j DROP Trên CentOS 6 - nếu muốn an toàn, chỉ Local truy cập được Memcached (an toàn) # iptables -I INPUT -p udp --dport 11211 -j DROP # iptables -I INPUT -p tcp --dport 11211 -j DROP # iptables -I INPUT -p udp -s 127.0.0.1 --dport 11211 -j ACCEPT # iptables -I INPUT -p tcp -s 127.0.0.1 --dport 11211 -j ACCEPT Trên CentOS 7 # firewall-cmd --permanent --zone=public --add-port=11211/tcp
Chạy dịch vụ Memcached
# systemctl start memcached
Cấu hình dịch vụ Memcached
File cấu hình của Memcached tại /etc/sysconfig/memcached
, nếu muốn thay đổi một số thông số thì chỉnh ở file này
# vi /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS=""
CACHESIZE="64"
thiết lập sử dụng 64MB bộ nhớ để làm cache, nếu nhiều ram thừa tăng số này nên
Để an toàn, chỉ cho phép các ứng dụng trên cùng máy truy cập vào cached thiết lập
OPTIONS="-l 127.0.0.1 -U 0"
Chỉnh lại thiết lập rồi thì khởi động lại Memcached
# systemctl restart memcached
Ứng dụng Memcached cho PHP
Nếu muốn PHP truy cập được server Memcached thì cần cài thêm extension có tên memcache
pecl install memcached
Nếu có sử dụng PHP-FPM thì cần khởi động lại
systemctl restart php-fpm
Kiểm tra xem PHP đã tải module memcache.so chưa
# php -m | grep memcache
Nếu thấy có dòng memchaced thì đã cài đặt thành công. Nếu chưa có,
bạn có thể cần thêm vào php.ini: extension=memcache.so
Sau đây tìm cách tăng tốc ứng dụng PHP của bạn bằng cách sử dụng Memcached
Dùng Memcached lưu PHP SESSION
Như là biết mỗi phiên làm việc của PHP có thể khởi tạo một biến $_SESSION
để trao đổi lưu giữ dữ liệu giữa các phiên làm việc. Mặc định kết thúc phiên làm việc thì Session lưu ra một file trên đĩa, và phục hồi cho phiên làm việc tiếp theo nếu cookie phù hợp. Nơi lưu các file session đặt ở thiết lập session.save_path
trong php.ini
Giờ muốn Memcached là nơi session được lưu giữ, để tăng tốc ứng dụng PHP thì mở file php.ini (php.ini ở đâu) ra và thêm vào cuối thiết lập sau:
session.save_handler = memcached session.save_path = "192.168.1.10:11211" memcached.sess_locking = 0 memcached.sess_prefix = 'memc.sess.'
Trong đó 192.168.1.10
là IP của Server, hãy thay bằng IP trên Server của bạn,
hoặc localhost
nếu PHP và Memcached nằm trên cùng một Server thật (lưu ý phù hợp với options của Memcached ở trên). memcached.sess_prefix
thiết lập tiền tố các key lưu trong trong Memcache, sau này bạn xem nhưng key nào có tiền tố do bạn đặt, biết đó là do PHP Session lưu.
Sau đó khởi động lại các Apache (http) hoặc nginx nếu có dùng nginx, cũng như php-fpm
# systemctl restart httpd # systemctl restart nginx # systemctl restart php-fpm
Từ đây Session đã lưu trong Memcached
Dùng Memcached trong ứng dụng PHP
<? $keycache = 'key_luu_tru_noi_dung_abc'; $memcached = new \Memcached(); $memcached->addServer('127.0.0.1', '11211'); $objectget = $memcached->get($keycache); if ($objectget !== false) { //Có đối tượng lưu trong cached var_dump($objectget); } else { //Không có đối tượng với key trên trong cached } //Không có cached ... //Thi hành các lệnh PHP mong muốn //Lưu đối tượng nào đó vào cached để truy cập sau $obj = ['abc','xyz']; $memcached->add($keycache, $obj); //Xóa một key nào đó $memcached->delete($key); ?>
zend-cache Zend Framework dùng Memcached
Nếu có sử dụng Zend Framework, thì thành phần zend-cache
của nó có adapter để sử dụng Memcached, đồng thời phù hợp chuẩn
PRS-6 (Cache Interface)
use Zend\Cache\StorageFactory; // Tạo đối tượng Cache $cache = StorageFactory::factory([ 'adapter' => [ 'name' => \Zend\Cache\Storage\Adapter\Memcache::class, 'options' => [ 'ttl' => 86400, //Thời gian (s) lưu cache 'servers' => '127.0.0.1', //IP server Memcached, thay bằng của bạn 'namespaceSeparator' => '.', 'lib_options' => [ \Memcached::OPT_PREFIX_KEY => 'mywebsite.'//Tiền tố lưu cache cho web ] ], ], ]); $key = 'abc-mot-key-nao-do'; $rs = null; $objectget = $cache->getItem($key, $rs); if ($rs) { //Đối tượng lưu lấy được var_dump($objectget); } else { //Không có lưu cache, hoặc đã hết hạn } //Lưu một giá trị vào cache $ob = ["abc", "xyz"]; $cache->setItem($key, $ob);
Sử dụng Memcached unix socket
Cách chạy dịch vụ Memcached ở trên, nó lắng nghe ở cổng chỉ định, sau đó các ứng dụng kết nối đến nó thông qua giao thức tcp. Nếu các dịch vụ cùng chạy trên một máy (ví dụ PHP-FPM và Memcached) thì có thể thiết lập kết nối giữa PHP và Memcached qua unix socket thay cho tcp để tăng tốc truy cập.
Có thể thiết lập để khi Memcached chạy nó tạo ra file sock, ví dụ file sock là: /tmp/memcached.sock
,
thì file cấu hình /etc/sysconfig/memcached
có thể cập nhật thành:
# PORT="11211" USER="memcached" MAXCONN="1024" CACHESIZE="500" OPTIONS="-s '/tmp/memcached.sock' -a 0766"
Sau đó khởi động lại
systemctl restart memcached
Từ đây các dịch vụ có thể kết nối bằng cách dùng file /tmp/memcached.sock
Ví dụ, trong php.ini có thể sửa thành:
session.save_handler = memcached ;session.save_path = "192.168.1.11:11211" session.save_path = "/tmp/memcached.sock" memcached.sess_locking = 0 memcached.sess_prefix = 'memc.sess.'
Kết nối từ code PHP:
$memcached = new \Memcached(); $memcached->addServer('/tmp/memcached.sock', 0);
Chú ý là có công cụ dòng lệnh để giám sát cơ bản memcached là memcached-tool
, bạn có thể xem thống kê bằng
cách gõ
memcached-tool 192.168.1.11:11211
Hoặc nếu dùng unix socket
memcached-tool /tmp/memcached.sock
Bạn có thể truy vấn thêm bằng cách sử dụng tham số theo hướng dẫn từ việc gõ
memcached-tool 192.168.1.11:11211 -h