1.前言php
上一篇講述了持續集成工具Jenkins的使用,本篇講述如今比較流行的兩個NoSQL數據庫Memcached和Redis的安裝和使用。html
Memcached 是一個高性能的分佈式內存對象緩存系統,用於動態Web應用以減輕數據庫負載。它經過在內存中緩存數據和對象來減小讀取數據庫的次數,從而提升動態、數據庫驅動網站的速度。Memcached基於一個存儲鍵/值對的HashMap。其守護進程(daemon )是用C寫的,可是客戶端能夠用任何語言來編寫,並經過memcached協議與守護進程通訊。作過Java或C#中Web應用的能夠把它類比於application這個對象,至關於一個內存中的字典,能夠實現根據key到value的快速映射查詢,所不一樣的是application對象中緩存的數據只能供同一個進程內的其它對象訪問,而Memcached能夠提供給跨服務器的其它進程訪問。node
Redis是一個key-value存儲系統。和Memcached相似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操做,並且這些操做都是原子性的。在此基礎上,redis支持各類不一樣方式的排序。與memcached同樣,爲了保證效率,數據都是緩存在內存中。區別的是redis會週期性的把更新的數據寫入磁盤或者把修改操做寫入追加的記錄文件,而且在此基礎上實現了master-slave(主從)同步。nginx
整體說來,同爲Key-Value類型的存儲系統,Memcached與Redis有幾個大的不一樣之處:git
身份驗證:Memcached不支持身份驗證,Redis支持簡單身份驗證;github
持久化:Memcached不支持持久化,Redis支持持久化;web
存儲類型:Memcached進支持string(字符串),Redis支持string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。redis
內存佔用:在Memcached中全部沒有過時的數據都會在內存中保存,而在Redis中並非全部數據一直保存在內存中,Redis會根據必定算法將不經常使用的value寫入到硬盤中(與key有關的數據會一直保存在內存中);算法
分佈式:Memcached自己沒有帶分佈式功能,須要客戶端實現分佈式算法(比較經常使用的是一致性哈希算法,consistent hashing),而Redis的分佈式由服務器端來實現。sql
事務性:Memcached自己沒有事務的概念,可是能夠經過CAS協議來保證一致性;Redis引入數據庫中的事務概念來保證數據的完整性和一致性。
本人在項目中都用過這兩種NoSQL,下面講一講它們的安裝和使用。
2.準備
2.1.libevent-2.1.8
這是Memcached的依賴庫,須要在編譯安裝Memcached以前編譯安裝好,下載地址爲:https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libevent-2.1.8-stable.tar.gz。
2.2.Memcached
官方網址爲:http://memcached.org/,最新版爲1.5.2,下載地址:http://memcached.org/files/memcached-1.5.2.tar.gz。
2.3.Redis
官方網址爲:https://redis.io/,最新版本爲4.0.2,下載地址爲:http://download.redis.io/releases/redis-4.0.2.tar.gz。
2.4 PHP版Memcached管理程序memcache
注意這個不是指Memcached程序,而是一個用PHP編寫的Memcached服務器端工具,體積至關小僅僅就一個網頁,須要的能夠從https://gitee.com/zhoufoxcn/MemcachedMonitor.git下載,那一個php網頁便是。另外一個ASPX文件是本人寫過的一個單網頁版ASP.NET服務器端程序。
注:還有一個比較有名的PHP網頁管理程序叫MemAdmin,網址是:http://www.junopen.com/memadmin/,下載地址爲:http://www.junopen.com/memadmin/memadmin-1.0.12.tar.gz,安裝的時候須要安裝PHP memcache擴展,過程稍微複雜一些,但功能也多一些。
2.5.PHP版Redis管理程序phpRedisAdmin
這是一個php腳本編寫的redis管理工具,git版本庫地址爲:https://github.com/erikdubbelboer/phpRedisAdmin,這個工具還須要另一個php庫支持,它的git版本庫地址爲https://github.com/nrk/predis.git,具體作法就是將predis庫放在phpRedisAdmin目錄下的vendor子目錄下便可。固然也可使用Redis Desktop Manager,這個一個非Web管理工具,支持常見的操做系統。
提示:在安裝過程當中常常會遇到提示運行make test,在編譯安裝Redis時若是你運行make test會獲得提示「You need tcl 8.5 or newer in order to run the Redis test」,能夠經過命令「yum install –y tcl」來安裝。
3.編譯安裝
假定libevent-2.1.8-stable.tar.gz、memcached-1.5.2.tar.gz及redis-4.0.2.tar.gz都下載後放在服務器/root目錄下。
3.1編譯安裝libevent
首先檢查有沒有安裝libevent
rpm -q libevent
若是有,則運行以下命令卸載:
rpm -e --nodeps libevent-2.0.21-4.el7.x86_64
接着就運行下面的命令來編譯安裝libevent了。
cd /root
tar zxvf libevent-2.1.8-stable.tar.gz
cd libevent-2.1.8-stable
./configure --prefix=/usr/local/libevent/
make && make install
若是沒有錯誤則編譯安裝成功,安裝目的路徑爲:/usr/local/libevent。
測試libevent是否安裝成功:
ls -al /usr/local | grep libevent
3.2編譯安裝Memcached
運行以下命令對Memcached進行編譯安裝:
cd /root
tar -xvf memcached-1.5.2.tar.gz
cd memcached-1.5.2
./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent/
make && make install
若是沒有錯誤,則編譯安裝成功,安裝目的路徑爲:/usr/local/memcached,經過以下命令查看:
[root@common ~]# ls -an /usr/local/memcached/
total 0
drwxr-xr-x 5 0 0 45 Oct 21 15:58 .
drwxr-xr-x. 19 0 0 265 Oct 25 16:42 ..
drwxr-xr-x 2 0 0 23 Oct 21 15:58 bin
drwxr-xr-x 3 0 0 23 Oct 21 15:58 include
drwxr-xr-x 3 0 0 17 Oct 21 15:58 share
能夠經過執行以下命令來啓動Memcached:
/usr/local/memcached/bin/memcached -u root –d
能夠經過執行以下命令來查看Memcached的運行狀況:
ps -ef |grep memcached
或者經過查看端口11211的監聽狀況:
netstat -anp | grep 11211
3.3編譯安裝Redis
cd /root
tar xzf redis-4.0.2.tar.gz
cd redis-4.0.2
make
make PREFIX=/usr/local/redis install
注意上面的命令中「PREFIX」要大寫,一般在一遍編譯安裝時是小寫的,我在安裝的時候也用小寫,結果沒法安裝到/usr/local/redis目錄,在/usr/local/redis/bin目錄下有6個文件,以下:
[root@common ~]# ls -an /usr/local/redis/bin
total 21768
drwxr-xr-x 2 0 0 134 Oct 25 16:42 .
drwxr-xr-x 4 0 0 28 Oct 25 16:44 ..
-rwxr-xr-x 1 0 0 2450872 Oct 25 16:42 redis-benchmark
-rwxr-xr-x 1 0 0 5742384 Oct 25 16:42 redis-check-aof
-rwxr-xr-x 1 0 0 5742384 Oct 25 16:42 redis-check-rdb
-rwxr-xr-x 1 0 0 2605144 Oct 25 16:42 redis-cli
lrwxrwxrwx 1 0 0 12 Oct 25 16:42 redis-sentinel -> redis-server
-rwxr-xr-x 1 0 0 5742384 Oct 25 16:42 redis-server
在上述文件中,其中:
redis-benchmark:性能測試工具,測試Redis在你的系統及配置下的讀寫性能;
redis-check-aof:用於修復出問題的aof文件;
redis-check-rdb:用於修復出問題的rdb文件;
redis-cli:Redis的命令行操做工具;
redis-sentinel:Redis的集羣管理工具;
redis-server:Redis的服務端啓動程序
而後執行以下命令將配置文件移動到redis安裝目錄下
mkdir /usr/local/redis/etc
cp redis.conf /usr/local/redis/etc
由於默認狀況下Redis不是在後臺運行,須要更改redis.conf中的配置:
vim /usr/local/redis/etc/ redis.conf
將redis.conf中的「daemonize」改成yes。
經過以下命令能夠啓動Redis:
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
其中「/usr/local/redis/bin/redis-server」是redis監聽程序的路徑,「/usr/local/redis/etc/redis.conf」是配置文件路徑。
啓動成功後就能夠看到Redis很獨特的啓動界面,以下:
4.配置
4.1Memcached配置
4.1.1Memcached經常使用參數說明
在前面的安裝過程當中簡要介紹了一下如何在命令行下運行Memcached,但大部分都是採用了默認設置,實際上Memcached支持更多靈活設置,下面介紹一下Memcached的啓動參數。
Memcached經常使用參數說明:
-p:設置端口號(默認爲:11211)
-U:UDP監聽端口(默認爲 11211,爲 0 時關閉)
-l:綁定地址(默認:全部都容許,即不管內外網或者本機均可訪問,由於Memcached不支持身份驗證因此有安全隱患,若設置爲127.0.0.1就只能本機訪問)
-d:獨立進程運行
-u:綁定使用指定用於運行進程<username>
-m:容許最大內存用量,單位M (默認爲 64 MB)
-P:將PID寫入文件<file>,這樣可使得後邊進行快速進程終止, 須要與-d 一塊兒使用
4.1.2將Memcached配置爲service
爲了省去每次開機後手動啓動Memcached的麻煩,在/usr/lib/systemd/system/下建立memcached.service文件,文件內容以下:
[Unit]
Description=memcached 1.5.2
After=network.target
[Service]
#PIDFile=/usr/local/memcached/memcached.pid
Type=forking
ExecStart=/usr/local/memcached/bin/memcached -d -m 256 -u root -p 11211
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
而後增長執行權限:
chmod 755 /usr/lib/systemd/system/memcached.service
而後能夠執行以下命令來檢驗是否配置正確:
systemctl enable memcached.service:設置memcached這個service隨系統一塊兒啓動
systemctl disable memcached.service:禁止memcached這個service隨系統一塊兒啓動
systemctl start memcached.service:啓動memcached這個service
systemctl stop memcached.service:中止memcached這個service
4.2Redis配置
4.2.1Redis經常使用參數說明
Redis的配置信息存放於redis.conf文件,主要有如下參數:
bind:指定只接受哪些IP的請求,如bind 192.168.1.100 10.0.0.1,默認爲bind 127.0.0.1;
port:指定在哪一個端口監聽,默認爲6379;
pidfile:指定pid文件位置,當Redis以守護進程方式運行時,Redis默認會把pid寫入/var/run/redis.pid文件
daemonize:指定是否以守護進程方式運行服務,默認是no,大多數狀況下須要將其改成yes;
timeout:當客戶端閒置多長時間後關閉鏈接,若是指定爲0,表示關閉該功能;
loglevel: 指定日誌記錄級別,Redis總共支持四個級別:debug、verbose、notice、warning,默認爲verbose
logfile: 日誌記錄方式,默認爲標準輸出,若是配置Redis爲守護進程方式運行,而這裏又配置爲日誌記錄方式爲標準輸出,則日誌將會發送給/dev/null
databases: 設置數據庫的數量,默認數據庫爲0,可使用SELECT <dbid>命令在鏈接上指定數據庫id
save: 指定在多長時間內,有多少次更新操做,就將數據同步到數據文件,能夠多個條件配合,格式爲:save <seconds> <changes>,例如默認的配置:
save 900 1
save 300 10
save 60 10000
分別表示900秒(15分鐘)內有1個更改,300秒(5分鐘)內有10個更改以及60秒內有10000個更改,當知足上述條件之一都會將數據同步到數據文件
rdbcompression:指定存儲至本地數據庫時是否壓縮數據,默認爲yes,開啓了節約空間但多佔用CPU,關閉了節約CPU但佔用較大空間,視狀況 選擇
dbfilename:指定本地數據庫文件名,默認值爲dump.rdb,知足save參數指定的條件後數據就會同步到這個文件dir:指定本地數據庫存放目錄
slaveof:設置當本機爲slav服務時,設置master服務的IP地址及端口,在Redis啓動時,它會自動從master進行數據同步,格式爲:slaveof <masterip> <masterport>
masterauth:當master服務設置了密碼保護時,slav服務鏈接master的密碼
requirepass:設置Redis鏈接密碼,若是配置了鏈接密碼,客戶端在鏈接Redis時須要經過AUTH <password>命令提供密碼,默認關閉
maxclients:設置同一時間最大客戶端鏈接數,默認無限制,Redis能夠同時打開的客戶端鏈接數爲Redis進程能夠打開的最大文件描述符數,若是設置 maxclients 0,表示不做限制。當客戶端鏈接數到達限制時,Redis會關閉新的鏈接並向客戶端返回max number of clients reached錯誤信息
maxmemory:指定Redis最大內存限制,Redis在啓動時會把數據加載到內存中,達到最大內存後,Redis會先嚐試清除已到期或即將到期的Key,當此方法處理 後,仍然到達最大內存設置,將沒法再進行寫入操做,但仍然能夠進行讀取操做。Redis新的vm機制,會把Key存放內存,Value會存放在swap區
appendonly:指定是否在每次更新操做後進行日誌記錄,Redis在默認狀況下是異步的把數據寫入磁盤,若是不開啓,可能會在斷電時致使一段時間內的數據丟失。由於 redis自己同步數據文件是按上面save條件來同步的,因此有的數據會在一段時間內只存在於內存中,默認爲no
appendfilename:指定更新日誌文件名,默認爲appendonly.aof
appendfsync:指定更新日誌條件,共有3個可選值: no:表示等操做系統進行數據緩存同步到磁盤(快);always:表示每次更新操做後手動調用fsync()將數據寫到磁盤(慢,安全);everysec:表示每秒同步一次(折衷,默認值)
4.2.2將Redis配置爲service
爲了省去每次開機後手動啓動Redis的麻煩,在/usr/lib/systemd/system/下建立redis.service文件,文件內容以下:
[Unit]
Description=Redis
After=network.target
[Service]
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
ExecStop=/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 shutdown
[Install]
WantedBy=multi-user.target
而後增長執行權限:
chmod 755 /usr/lib/systemd/system/redis.service
而後能夠執行以下命令來檢驗是否配置正確:
systemctl enable redis.service:設置service隨系統一塊兒啓動
systemctl disable redis.service:禁止service隨系統一塊兒啓動
systemctl start redis.service:啓動service
systemctl stop redis.service:中止service
5.檢驗配置
5.1Memcached狀態查看
將memcache.php解壓後放到Web服務器目錄(固然服務器得配置支持php),在這裏爲圖省事直接將其放置在/usr/local/nginx-1.12.0/html/nosql/目錄(有關php與nginx的編譯安裝,請看本系列的第5篇及第7篇),而後打開/usr/local/nginx-1.12.0/html/nosql/memcache.php頁面,裏面包含了登陸時的用戶名和密碼及服務器等配置信息,以下:
define('ADMIN_USERNAME','admin'); // Admin Username
define('ADMIN_PASSWORD','123456'); // Admin Password
define('DATE_FORMAT','Y/m/d H:i:s');
define('GRAPH_SIZE',200);
define('MAX_ITEM_DUMP',50);
$MEMCACHE_SERVERS[] = '127.0.0.1:11211'; // add more as an array
主要修改管理員登陸用戶名、密碼和Memcached服務器信息便可。修改後將其放入任何一可支持php的web環境下,便可在輸入身份驗證信息後查看MemCached服務器狀態,以下圖所示:
5.2Redis狀態查看
將從git版本庫獲取到的代碼上傳到/usr/local/nginx-1.12.0/html/nosql/phpRedisAdmin(有關php與nginx的編譯安裝,請看本系列的第5篇及第7篇,nginx-1.12.0安裝在usr/local/nginx-1.12.0),而後啓動Redis、Nginx和PHP-FPM,打開http://localhost/nosql/phpRedisAdmin/便可看到以下界面:
能夠從管理界面上對key/value管理,也能夠點擊那個藍色的感嘆號按鈕查看Redis服務器信息,以下圖所示:
上文提到的另外一個Redis管理工具Redis Desktop Manager比這個要直觀一點,不過須要根據操做的本地計算機的操做系統類型不一樣而選擇不一樣版本。
6.總結
本文主要講述了NoSQL領域的兩個比較經常使用的應用Memcached和Redis來介紹其安裝和配置過程,並捎帶講述了一下可視化管理界面。其實在NoSQL領域還有其它不錯的解決方案,好比mongodb等。另外,時間有限沒有講如何集羣化部署了,見過有人使用Memcached做爲集羣站點的Session服務器,你們有興趣能夠研究一下。
周金橋
2017-10-30
聲明:本文首發於本人我的微信訂閱號:zhoujinqiaoIT,其後會同時在本人的CSDN、51CTO及oschina三處博客發佈,本人會負責在此四處答疑。