Redis是一個開源的NoSQL資料庫,以一個key對應一個value的方式並配合記憶體(RAM)來儲存資料,效能要比關聯式資料庫還要好很多,可以在許多程式語言上使用。Redis的value除了字串(string)型態之外,另外還有幾種比較特殊的結構,包括set、zset、list和hash,並提供了多種方式來操作這些欄位。
安裝Redis
要在Ubuntu Server上安裝Redis的伺服器,可以直接在終端機中執行以下指令:
Redis伺服器預設使用的TCP連接埠為6379,可以使用以下指令來查看Redis伺服器是否有確實安裝成功。
ss
指令可以顯示出Socket相關的資訊。-l
參數可以只顯示正在監聽中的連線。若使用ss
指令時都沒給任何參數的話,會忽略掉監聽中的連線。-t
參數可以只顯示TCP連線。-n
參數可以讓連接埠數字直接被輸出,而不是用一個名稱代替。-p
參數可以顯示佔用連線的行程。
如上圖,如果有看到TCP有在監聽連接埠6379,就表示Redis伺服器安裝成功了!
設定Redis
Redis伺服器的設定檔路徑為/etc/redis/redis.conf
。它預設的模樣長成這樣:
比較重要的設定項目有:
bind
:若要遠端連入Redis伺服器,就會需要設定這個項目。參考這篇文章。supervised
:設定運行Redis的init system。預設值是no
,雖然no
好像也能正常運作,但最好改成systemd
,來讓我們的init system能夠正確追蹤Redis是否還在正常運作。databases
:設定可用的資料庫數量,在索引的時候是從0
開始數,預設會使用索引值為0的資料庫。這個項目的預設值是16
,表示這個Redis伺服器可以使用16個資料庫。save
:設定在一定的間隔時間內若資料庫有發生一定程度的改變,就將記憶體中當下的資料存成檔案(快照)。save
的撰寫格式為save <seconds> <changes>
,save 60 10000
表示在60秒內至少有10000個key被改變則做一次快照。快照的預設儲存路徑為/var/lib/redis/dump.rdb
。requirepass
:設定客戶端與Redis伺服器連線時所需要的密碼。預設沒有設定,表示不啟用密碼驗證功能。maxclients
:設定最大連線數。預設沒有設定,當作10000
。maxmemory
:設定最大的記憶體使用量,如果記憶體用量達到限制,就會根據maxmemory-policy
項目設定的策略來嘗試移除key,如果無法移除,就會使該次插入或修改的操作回傳錯誤。預設沒有設定,表示不限制。maxmemory-policy
:記憶體用量達到限制時採取的策略。預設沒有設定,當作noeviction
,不移除key。其它策略如下:volatile-lru
:根據LRU演算法移除過期的key。allkeys-lru
:根據LRU演算法移除key。(不管有沒有過期)volatile-lfu
:根據LFU演算法移除過期的key。allkeys-lfu
:根據LFU演算法移除key。(不管有沒有過期)volatile-random
:隨機移除過期的key。allkeys-random
:隨機移除key。(不管有沒有過期)volatile-ttl
:移除已過期的key中,TTL最小的key。
套用Redis的新設定
改寫Redis設定檔並存檔後,新設定並不會立即套用給正在運行中的Redis伺服器。
要讓Redis伺服器重新讀取設定檔,最好先用以下指令檢查設定檔是否無誤,避免Redis伺服器因為設定檔錯誤而中斷服務。
接著再執行以下指令來重新載入Redis的設定檔:
Redis客戶端與Redis命令的使用方式
redis-cli
是Redis的客戶端指令工具。執行以下指令與Redis伺服器進行連線:
如果有設定requirepass
,要在Redis的Shell中使用auth
指令來驗證密碼。例如密碼為foobared
,就要輸入以下指令。
接著就可以開始輸入Redis的命令來操作Redis資料庫。
例如以下命令,可以建立一組key為foo
、value為bar
的資料至預設的資料庫0。
set foo bar
而以下命令,可以取得key為foo
的資料。
get foo
以下命令可以查看所有資料庫的key的數量。
info keyspace
在PHP程式中存取Redis資料庫
如果您不知道如何在Ubuntu Server運行PHP程式,可以先參考這篇文章:
要在PHP程式中存取Redis資料庫,需要有Redis相關模組的支援。利用以下指令可以查看目前PHP環境中有的模組:
如上圖,並沒有看到有Redis相關模組的存在,所以要使用以下指令來安裝:
安裝完後,就可以透過php -m
指令看到Redis相關模組了。
Redis在PHP中的用法如下:
<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->set("foo", "bar");
echo $redis->get("foo");
?>
API文件:
phpRedisAdmin
phpRedisAdmin是使用PHP+Redis環境時經常會使用的管理後台,不過並不是必要項目。如果您不需要,可以略過這部份的內容。
安裝php-mbstring
phpRedisAdmin會用到php-mbstring
模組,所以要先用以下指令來安裝:
安裝phpRedisAdmin
在終端機執行以下指令,來取得phpRedisAdmin:
接著執行以下指令,將phpRedisAdmin安裝至/usr/local/share/phpredisadmin
目錄中。
執行以下指令複製phpRedisAdmin的設定檔範本。
/usr/local/share/phpredisadmin/includes/config.inc.php
檔案就是phpRedisAdmin的設定檔啦!它預設的模樣長成這樣:
如果phpRedisAdmin和Redis伺服器是運行在在同一個作業系統內,建議可以將設定檔中scheme
欄位的值改成unix
。如果Redis伺服器有設定requirepass
,要去修改設定檔中的auth
欄位。
設定Nginx
phpRedisAdmin的PHP程式放置在/usr/local/share/phpredisadmin
目錄中,我們可以利用Nginx設定檔的root
命令來製作一個phpRedisAdmin的location
區塊。設定方式如下:
server {
index index.html index.php;
set $php_uds unix:/run/php/php7.4-fpm.sock;
location ~ \.php$ {
fastcgi_pass $php_uds;
include fastcgi.conf;
}
location = /phpredisadmin {
return 301 /phpredisadmin/;
}
location ^~ /phpredisadmin/ {
root /usr/local/share;
allow 127.0.0.1;
deny all;
if ($uri ~ \.php$) {
fastcgi_pass $php_uds;
}
include fastcgi.conf;
}
}
如此一來就可以在同一台主機透過HTTP協定發送路徑前綴為/phpredisadmin/
的請求來開啟phpRedisAdmin。如下圖:
加上allow
和deny
命令是為了要避免phpRedisAdmin被有心人士攻擊。如果要在別台主機使用phpRedisAdmin,可以加上更多的allow
命令,或者乾脆改用HTTP基本認證(帳密認證)。
事實上phpRedisAdmin本身就有提供帳密認證的功能,可以在設定檔中找到相關的設定欄位,但筆者會建議透過Nginx來統一設定帳密認證。
套用Nginx的新設定
改寫Nginx設定檔並存檔後,新設定並不會立即套用給正在運行中的Nginx伺服器。
要讓Nginx伺服器重新讀取設定檔,最好先用以下指令檢查設定檔是否無誤,避免Nginx伺服器因為設定檔錯誤而中斷服務。
接著再執行以下指令來重新載入Nginx的設定檔:
phpRedisAdmin和Redis伺服器不在同一個作業系統上
若要讓phpRedisAdmin連到其它作業系統或是其它主機上的Redis伺服器,就要去修改phpRedisAdmin的/usr/local/share/phpredisadmin/includes/config.inc.php
設定檔中的host
和port
欄位,以及將scheme
欄位的值設為tcp
。