緩存數據庫Memcache

爲何用緩存數據庫

MySQL:將數據存儲在磁盤上,數據寫入讀取相對較慢php

Memcached:將數據存在內存中的數據庫,數據讀寫都快,可是數據容易丟失html

數據存儲,數據倉庫選擇MySQL這種磁盤的數據庫ios

高併發,業務大的應用選擇Memcached這種內存數據庫nginx

固然,在工做中,都是景MySQL+Memcached/Redis搭配使用web

Memcache介紹

Memcached是一款開源的、高性能的純內存緩存服務軟件。redis

Mem是內存的意思數據庫

cache是緩存的意思vim

d是daemon的意思centos

 

官網地址http://memcache.org/瀏覽器

memcache在企業中的使用場景

優勢:

  1. 對用戶來說,訪問網站的速度更快了,體驗更好了
  2. 對於網站來講,數據庫壓力下降了。只有當內存沒有數據時,纔回去請求數據庫。第一次寫入時也會請求數據庫。通常公司沒有預熱,只有當用戶讀取過數據庫,纔回放到Memcache中。
  3. 提高了網站的併發訪問,減小服務器的數量

數據庫緩存架構圖

 

memcache應用在session會話中

 

 

cookie和session

詳細瞭解cookie和session請看

他們都是key-value的形式

cookie存放在瀏覽器上

  F12 ---->Application---->在左邊欄能夠找到cookies

session放在服務器上

 

Memcache的使用

準備環境

配置了一臺centos6的模板機

在屢次重啓後,web01克隆機終於能連上了網絡,並實現了LNMP

 

安裝Memcached,同時也要安裝nc和telnet用來管理memcache

[root@cache01 ~]# yum install  memcached nc telnet -y

 

[root@cache01 ~]# rpm -ql memcached
/etc/sysconfig/memcached     # 配置文件
/usr/bin/memcached
/usr/bin/memcached-tool
/usr/lib/systemd/system/memcached.service   # 規則
/usr/share/doc/memcached-1.4.15
/usr/share/doc/memcached-1.4.15/AUTHORS
/usr/share/doc/memcached-1.4.15/CONTRIBUTORS
/usr/share/doc/memcached-1.4.15/COPYING
/usr/share/doc/memcached-1.4.15/ChangeLog
/usr/share/doc/memcached-1.4.15/NEWS
/usr/share/doc/memcached-1.4.15/README.md
/usr/share/doc/memcached-1.4.15/protocol.txt
/usr/share/doc/memcached-1.4.15/readme.txt
/usr/share/doc/memcached-1.4.15/threads.txt
/usr/share/man/man1/memcached-tool.1.gz
/usr/share/man/man1/memcached.1.gz

 

Memcache的讀、取、刪除、配置

 看一眼這兩個文件的內容

[root@cache01 ~]# cat /etc/sysconfig/memcached 
PORT="11211"     # 默認的端口,工做中請改掉
USER="memcached"   # 默認的用戶
MAXCONN="1024"    # 最大鏈接數
CACHESIZE="64"    # 最大緩存大小
OPTIONS=""
[root@cache01 ~]# cat /usr/lib/systemd/system/memcached.service 
[Unit]   介紹服務的依賴關係
Description=Memcached 
Before=httpd.service    # 要在http服務以前
After=network.target    # 要在network以後

[Service]  寫服務
Type=simple
EnvironmentFile=-/etc/sysconfig/memcached      用-號引入了文件中的變量
ExecStart=/usr/bin/memcached -u $USER -p $PORT -m $CACHESIZE -c $MAXCONN $OPTIONS  
# 上面的一行,開啓memcache的命令,就是描述如何啓動 [Install] WantedBy
=multi-user.target

怎麼根據文件中的要求來,製做一個啓動文件,

有了這個文件,就能夠用systemctl 來管理memecache

memcache的其餘參數

啓動memcache

[root@cache01 ~]# systemctl start memcached.service

 下圖是在Linux命令行中的寫法

 nc和telnet的做用差很少,都是測試端口,或者連接端口。telnet是交互式的,nc是非交互式

[root@cache01 ~]# telnet 172.16.1.21 11211
Trying 172.16.1.21...
Connected to 172.16.1.21.
Escape character is '^]'.

 

 必須指定大小

set pizza 0 0 10  # 這裏按回車
luffy.haha
STORED
set pizza 0 0 10
luffy


# 長度不夠就報錯了
CLIENT_ERROR bad data chunk 
ERROR
get pizza 
VALUE pizza 0 10
luffy.haha
END
set pizza 0 0 10
luffy.hehe
STORED
# 會覆蓋原來的值
get pizza
VALUE pizza 0 10
luffy.hehe
END

 

怎麼退出telnet的?ctrl+]

^]
telnet> quit
Connection closed.
[root@cache01 ~]# 

在命令行中使用stats,查看mc的狀態

[root@cache01 ~]# telnet 172.16.1.21 11211
Trying 172.16.1.21...
Connected to 172.16.1.21.
Escape character is '^]'.
stats
STAT pid 1409
STAT uptime 4801
STAT time 1552674611
STAT version 1.4.15
STAT libevent 2.0.21-stable
STAT pointer_size 64
STAT rusage_user 0.164849
STAT rusage_system 0.175484
STAT curr_connections 10
STAT total_connections 13
STAT connection_structures 11
STAT reserved_fds 20
STAT cmd_get 2
STAT cmd_set 3
STAT cmd_flush 0
STAT cmd_touch 0
STAT get_hits 2
STAT get_misses 0
STAT delete_misses 0
STAT delete_hits 0
STAT incr_misses 0
STAT incr_hits 0
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT touch_hits 0
STAT touch_misses 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 187
STAT bytes_written 241
STAT limit_maxbytes 67108864
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT hash_power_level 16
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT bytes 81
STAT curr_items 1
STAT total_items 2
STAT expired_unfetched 0
STAT evicted_unfetched 0
STAT evictions 0
STAT reclaimed 0
END

不管使用公網10.0.0.21仍是內網172.16.1.21.都能訪問

這樣是不安全的!

經過監聽指定網卡(內網),來限制外網的訪問

能夠加在/etc/sysconfig/memcached 文件中

[root@cache01 ~]# vim /etc/sysconfig/memcached 
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 172.16.1.21"  # 加在這裏

 

或者加在 /usr/lib/systemd/system/memcached.service 中 的[Service] ----->ExecStart 的參數中

添加好了,重啓一下,在實際生產中,不要重啓!!!重啓將丟失全部數據

[root@cache01 ~]# systemctl restart memcached.service 
[root@cache01 ~]# telnet 10.0.0.21 11211
Trying 10.0.0.21...
telnet: connect to address 10.0.0.21: Connection refused

 

 

PHP部署Memcache客戶端

實際環境中,咱們不可能經過命令行用telnet或者printf來寫如數據

LNMP環境中,咱們須要在PHP中安裝memcache客戶端

下載地址 http://pecl.php.net/package/memcache

這個網站http://pecl.php.net能夠下載不少軟件

下載完成後,上傳到服務器/server/tools/

拖拽進去依賴的軟件是lrzsz

[root@web01 tools]# tar xf memcache-2.2.5.tgz 
[root@web01 tools]# cd memcache-2.2.5
# memcache是做爲php裏面的一個功能,一個插件。和便以一個新的功能不同
#要先執行下面的命令先處理一下
[root@web01 memcache-2.2.5]# /application/php/bin/phpize  
Configuring for:
PHP Api Version:         20121113
Zend Module Api No:      20121212
Zend Extension Api No:   220121212
[root@web01 memcache-2.2.5]# ./configure --enable-memcache --with-php-config=/application/php/bin/php-config  --with-zlib-dir
[root@web01 memcache-2.2.5]# make && make install
# 安裝完成後,在最後有一個提示
Installing shared extensions:     /application/php-5.5.32/lib/php/extensions/no-debug-non-zts-20121212/
[root@web01 memcache-2.2.5]# ll /application/php-5.5.32/lib/php/extensions/no-debug-non-zts-20121212/
total 252
-rwxr-xr-x 1 root root 258008 Mar 15 19:10 memcache.so
# 看到在目錄下有一個文件,至關於生成了一個執行文件,只能在php中使用
## 增長下面的複製文件的操做
cp /application/php/lib/php.ini-production /application/php/lib/php.ini
# 做以下修改 [root@web01 memcache-2.2.5]# sed -i '$a extension=memcache.so' /application/php/lib/php.ini # 須要重啓PHP pkill php # killall php-fpm [root@web01 memcache-2.2.5]# ps -ef |grep php root 2589 1226 21 19:25 pts/0 00:00:00 grep php # 檢查php [root@web01 memcache-2.2.5]# /application/php/sbin/php-fpm -t [15-Mar-2019 19:25:52] NOTICE: configuration file /application/php-5.5.32/etc/php-fpm.conf test is successful # 啓動 [root@web01 memcache-2.2.5]# /application/php/sbin/php-fpm # 查看有沒有命令 [root@web01 memcache-2.2.5]# /application/php/bin/php -m |grep memcache
memcache

 

 

 

PHP代碼測試

cat >/application/nginx/html/blog/mc.php<<'EOF'
<?php
    $memcache = new Memcache;
    $memcache->connect('10.0.0.21', 11211) or die ("Could not connect");
    $memcache->set('key_oldboy', 'hello,oldgirl');
    $get_value = $memcache->get('key_oldboy');
    echo $get_value;
?>
EOF

 

EOF外邊加引號,表示忽略內容中的特殊符號,不解析

在php中,添加的key的時候,不用指定長度,程序本身處理了

在咱們的瀏覽器中輸入 10.0.0.7/mc.php

能夠看到 Could not connect

由於mc服務器關閉了外網的網卡,只監聽內網472.16.1.21

因此,將mc.php中的10.0.0.21 換成172.16.1.21

能夠看到 hello,oldgirl

而後在cache服務器上查看

[root@cache01 tools]# telnet 172.16.1.21 11211
Trying 172.16.1.21...
Connected to 172.16.1.21.
Escape character is '^]'.
get key_oldboy
VALUE key_oldboy 0 13
hello,oldgirl
END

[root@cache01 tools]# printf "get key_oldboy\r\n"|nc 172.16.1.21 11211
VALUE key_oldboy 0 13
hello,oldgirl
END
[root@cache01 tools]#


 

 

WEB管理memcache

官網:http://www.junopen.com/memadmin/ 
tar xf memadmin-1.0.12.tar.gz -C /application/nginx/html/blog/
瀏覽器訪問http://主機名或者IP/memadmin

 

軟件中文件的權限很高,都改爲644的

在nginx中設置只讓內網訪問

 

Memcache 監控

除了用web管理監控memcache,還能夠這樣

printf "stats\r\n"|nc 172.16.1.21 11211
①監聽port或進程
②能夠模擬用戶先set後get,比對get內容是否是set的。crond nagios zabbix
③監控命中百分比
printf 'stats\r\n'|nc 172.16.1.21 11211 |awk -vRS="\r\n" '/cmd_get/{get=$NF}/get_hits/{hits=$NF}END{print hits/get}'
④監控響應時間及須要的狀態?

 

Memcache緩存案例--緩存wordpress

咱們須要安裝插件,正常,這種插件是須要 開發人員來寫的

這有wordpress作好的插件,把文件安裝到wp-content目錄下

wordpress緩存數據緩存到memcached中:
https://cn.wordpress.org/plugins/memcached/ wordpress緩存數據緩存到redis中:
https://cn.wordpress.org/plugins/redis-cache/ wordpress會自動檢查wp-content下面是否有object-cache.php 使用memcached緩存wordpress博文數據 修改:array('127.0.0.1:11211','');爲memcached服務器ip地址

 

下載插件,解壓出object-cache.php 放在 /application/nginx/html/blog/wp-content 下

zip的壓縮包用unzip解壓

修改IP

OK!

Memcache Session 共享

通常經過程序代碼實現效率更高

方法1:經過程序實現,web01只須要往memcahce寫session,
    web02從memcahce讀session,看成普通數據讀寫(更具備通用性) 方法2:經過php的配置文件,php默認將session存儲在文件中,修改成存儲在memcached中 sed
-i 's#session.save_handler = files#session.save_handler = memcache#
;$a session.save_path = "tcp://172.16.1.21:11211"
' /application/php/lib/php.ini 使用這個功能,須要使用php的session函數

寫一個phpinfo來查看phpinfo

[root@web01 blog]# vim php_info.php
<?php
phpinfo()
?>

 

瀏覽器訪問 10.0.0.7/php_info.php

在頁面中能夠找到session相關的函數

相關文章
相關標籤/搜索