Redis是一個開源的NoSQL資料庫,以一個key對應一個value的方式並配合記憶體(RAM)來儲存資料,效能要比關聯式資料庫還要好很多,可以在許多程式語言上使用。Redis的value除了字串(string)型態之外,另外還有幾種比較特殊的結構,包括set、zset、list和hash,並提供了多種方式來操作這些欄位。



安裝Redis

要在Ubuntu Server上安裝Redis的伺服器,可以直接在終端機中執行以下指令:

sudo apt install redis-server

ubuntu-server-redis-php

Redis伺服器預設使用的TCP連接埠為6379,可以使用以下指令來查看Redis伺服器是否有確實安裝成功。

sudo netstat -tlnp | grep redis

netstat指令可以顯示出網路連線、路由表、介面統計、偽裝連線和多播成員的資訊。-l參數可以只顯示正在監聽中的連線。若使用netstat指令時都沒給任何參數的話,會忽略掉監聽中的連線。-t參數可以只顯示TCP連線。-n參數可以讓IP可以直接被輸出,而不需透過DNS反查其對應的網域名稱。-p參數可以顯示佔用連線的行程。

ubuntu-server-redis-php

如上圖,如果有看到TCP有在監聽連接埠6379,就表示Redis伺服器安裝成功了!

設定Redis

Redis伺服器的設定檔路徑為/etc/redis/redis.conf。它預設的模樣長成這樣:

ubuntu-server-redis-php

比較重要的設定項目有:

  • 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-server /etc/redis/redis.conf

ubuntu-server-redis-php

接著再執行以下指令來重新載入Redis的設定檔:

sudo systemctl restart redis

ubuntu-server-redis-php

Redis客戶端與Redis命令的使用方式

redis-cli是Redis的客戶端指令工具。執行以下指令與Redis伺服器進行連線:

redis-cli

ubuntu-server-redis-php

如果有設定requirepass,要在Redis的Shell中使用auth指令來驗證密碼。例如密碼為foobared,就要輸入以下指令。

auth foobared

ubuntu-server-redis-php

接著就可以開始輸入Redis的命令來操作Redis資料庫。

例如以下命令,可以建立一組key為foo、value為bar的資料至預設的資料庫0。

set foo bar

而以下命令,可以取得key為foo的資料。

get foo

ubuntu-server-redis-php

以下命令可以查看所有資料庫的key的數量。

info keyspace

ubuntu-server-redis-php

在PHP程式中存取Redis資料庫

如果您不知道如何在Ubuntu Server運行PHP程式,可以先參考這篇文章:

https://magiclen.org/ubuntu-server-nginx-php/

要在PHP程式中存取Redis資料庫,需要有Redis相關模組的支援。利用以下指令可以查看目前PHP環境中有的模組:

php -m

ubuntu-server-redis-php

如上圖,並沒有看到有Redis相關模組的存在,所以要使用以下指令來安裝:

sudo apt install php-redis

ubuntu-server-redis-php

安裝完後,就可以透過php -m指令看到Redis相關模組了。

ubuntu-server-redis-php

Redis在PHP中的用法如下:

<?php    
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);
            
    $redis->set("foo", "bar");
    echo $redis->get("foo");                                                         
?>

API文件:

https://github.com/phpredis/phpredis/blob/develop/README.markdown

phpRedisAdmin

phpRedisAdmin是使用PHP+Redis環境時經常會使用的管理後台,不過並不是必要項目。如果您不需要,可以略過這部份的內容。

安裝php-mbstring

phpRedisAdmin會用到php-mbstring模組,所以要先用以下指令來安裝:

sudo apt install php-mbstring

ubuntu-server-redis-php

安裝phpRedisAdmin

在終端機執行以下指令,來取得phpRedisAdmin:

curl -s http://getcomposer.org/installer | php

ubuntu-server-redis-php

接著執行以下指令,將phpRedisAdmin安裝至/usr/local/share/phpredisadmin目錄中。

sudo php composer.phar create-project -s dev erik-dubbelboer/php-redis-admin /usr/local/share/phpredisadmin

ubuntu-server-redis-php

執行以下指令複製phpRedisAdmin的設定檔範本。

sudo cp /usr/local/share/phpredisadmin/includes/config.sample.inc.php /usr/local/share/phpredisadmin/includes/config.inc.php

ubuntu-server-redis-php

/usr/local/share/phpredisadmin/includes/config.inc.php檔案就是phpRedisAdmin的設定檔啦!它預設的模樣長成這樣:

ubuntu-server-redis-php

如果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。如下圖:

ubuntu-server-redis-php

加上allowdeny命令是為了要避免phpRedisAdmin被有心人士攻擊。如果要在別台主機使用phpRedisAdmin,可以加上更多的allow命令,或者乾脆改用HTTP基本認證(帳密認證)

事實上phpRedisAdmin本身就有提供帳密認證的功能,可以在設定檔中找到相關的設定欄位,但筆者會建議透過Nginx來統一設定帳密認證。

套用Nginx的新設定

改寫Nginx設定檔並存檔後,新設定並不會立即套用給正在運行中的Nginx伺服器。

要讓Nginx伺服器重新讀取設定檔,最好先用以下指令檢查設定檔是否無誤,避免Nginx伺服器因為設定檔錯誤而中斷服務。

sudo nginx -t

ubuntu-server-nginx

接著再執行以下指令來重新載入Nginx的設定檔:

sudo nginx -s reload

ubuntu-server-nginx

phpRedisAdmin和Redis伺服器不在同一個作業系統上

若要讓phpRedisAdmin連到其它作業系統或是其它主機上的Redis伺服器,就要去修改phpRedisAdmin的/usr/local/share/phpredisadmin/includes/config.inc.php設定檔中的hostport欄位,以及將scheme欄位的值設為tcp