2015年9月16日 星期三

CentOS 7 安裝 Redis、php-pecl-redis(phpredis)

Redis 是一種 NoSQL 記憶體式的資料庫(key-value),跟 Memcached 很像。
但有一些差異:
  • Redis 可以將資料存至硬碟達到持久化 (RDB、AOF)
  • Memcached 是多線程,Redis is a single-threaded server
  • Redis 可儲存的資料結構比較多(strings, hashes, lists, sets, sorted sets,...)
  • Redis 有 transaction 功能,但沒有 rollback。
    兩者對於併發 race condition 中的 CAS(check-and-set),都有相對應的處理方法:Memcached::casRedis:transaction:WATCH

[安裝 Redis Server]
到 http://download.fedoraproject.org/pub/epel/ 找到最新的 EPEL repository
#新增 EPEL repo (使用 rpm 安裝)
rpm -ivh  http://download.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
#或是用 yum 指令安裝
yum install epel-release
#查看安裝資訊
yum info epel-release

#查看 redis 可用相關套件
yum list | grep redis

#安裝 Redis Server
yum install redis

#設定開機啟動
systemctl enable redis

#立即啟動
systemctl start redis

#查看redis監聽的port(預設是6379)
systemctl status redis
ss -nlp | grep redis

#查看防火牆是否有開啟
firewall-cmd --state

#查看防火牆開放的 port
firewall-cmd --list-all --zone=public

#開放 6379 port
firewall-cmd --permanent --zone=public --add-port=6379/tcp
firewall-cmd --reload

#效能測試 http://redis.io/topics/benchmarks
redis-benchmark -q -n 100000

#查目前安裝的版本
redis-server --version

[Redis 設定檔] 
/etc/redis.conf:普通單一的redis server設定檔,預設 port 是 6379
/etc/redis-sentinel.conf:管理多個redis,實現高可用性high availability功能,預設 port 是 26379 http://redis.readthedocs.org/en/latest/topic/sentinel.html

/etc/redis.conf 相關修改
#bind 設定
#0.0.0.0 全部都可連
#127.0.0.1 只能本機連
bind 127.0.0.1

#設定快取資料儲存到硬碟的頻率
#900秒內有1次更新
save 900 1
#300秒內有10次更新
save 300 10
#60秒內有10000次更新
save 60 10000

#AUTH 密碼設定
#http://redis.readthedocs.org/en/latest/connection/auth.html
#若允許不信任的IP連線,可以設定密碼(官方建議設複雜一點,因為redis速度很快,可以在短時間被惡意測試很多密碼)
requirepass 密碼

[Redis 指令]
#連線(預設 Server IP:127.0.0.1、Port:6379、無密碼)
redis-cli
#指定 Server IP、Port、密碼 連線
redis-cli -h 127.0.0.1 -p 6379 -a 密碼
#用telent連線(建議用redis-cli,redis-cli有指令自動完成提示)
telnet 127.0.0.1 6379

#有設密碼時,若連線時沒填密碼,執行命令前須先用 auth 指令認證
127.0.0.1:6379> AUTH 密碼
OK

#測試
127.0.0.1:6379> ping
PONG

#取得 server 全部設定值
127.0.0.1:6379> CONFIG GET *

#設定String類型快取資料
127.0.0.1:6379> set k1 test
OK
#取得String類型快取資料
127.0.0.1:6379> get k1
"test"

#get 只能取得 string 類型的資料
#若嘗試取得其他類型資料,會出現錯誤
#「(error) WRONGTYPE Operation against a key holding the wrong kind of value」
#string 類型資料使用:get <key>
#hash   類型資料使用(單一):hget <key> <field>
#hash   類型資料使用(全部):hgetall <key>
#list   類型資料使用:LRANGE <key> <start> <stop>
#                    例如:lrange testkey 0 -1
#set    類型資料使用:smembers <key>
#zset   類型資料使用:ZRANGE <key> <start> <stop> [WITHSCORES]
#                    例如:zrange testkey 0 -1 withscores

#查詢某個 key 內儲存的資料類型
127.0.0.1:6379> type k1
string

#取得所有key
127.0.0.1:6379> keys *

#取得PHP開頭的key
127.0.0.1:6379> keys PHP*
1) "PHPREDIS_SESSION:n47g4vh1qt2pltplkd3lhifes2"
2) "PHPREDIS_SESSION:qp2fj1dpff0rgt6lakno4nrlh1"

#查看伺服器資訊
127.0.0.1:6379> info

#切換到1號DB (編號從0開始,預設為0)
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]>


#刪除 key 為 k1 的資料
1127.0.0.1:6379> del k1
(integer) 1

#清空目前DB所有資料
127.0.0.1:6379> flushdb
OK

#清空全部DB的資料 
127.0.0.1:6379> flushall
OK

#查詢資料剩多久過期
#-1表示沒設定過期時間
#-2表示key不存在
127.0.0.1:6379> TTL k1
(integer) -1
127.0.0.1:6379> TTL ktest
(integer) -2

#設定資料多久後過期(毫秒),例如設定 k1 在 8 秒後過期
#成功返回1,失敗或key不存在返回0
127.0.0.1:6379> pexpire k1 8000
(integer) 1

#列出目前 client 端的連線
127.0.0.1:6379> CLIENT LIST

#觀察 Redis instance 接收到執行的指令
$ redis-cli monitor
或
$ redis-cli -h 127.0.0.1 -p 6379 -a 密碼 monitor

***** 查詢執行慢的log(slowlog) *****
***** slowlog 儲存在系統記憶體中 *****
#取得目前執行時間超過多久,屬於 slowlog,單位 µs (1ms=1000µs)
127.0.0.1:6379> CONFIG GET slowlog-log-slower-than
1) "slowlog-log-slower-than"
2) "10000"

#設定超過多少 µs,屬於 slowlog
127.0.0.1:6379> CONFIG SET slowlog-log-slower-than 數字

#查詢最多保存幾筆 slowlog
127.0.0.1:6379> CONFIG GET slowlog-max-len
1) "slowlog-max-len"
2) "128"

#設定最多保存幾筆 slowlog
127.0.0.1:6379> CONFIG SET slowlog-max-len 數字

#查詢 slowlog
127.0.0.1:6379> slowlog get 數量(設為-1則全部列出)

#目前 slowlog 數量
127.0.0.1:6379> SLOWLOG LEN

#重置 slowlog
127.0.0.1:6379> SLOWLOG RESET
***********************************


[安裝 php-pecl-redis(phpredis)] PHP Redis extension
#安裝,安裝後重新啟動
#https://pecl.php.net/package/redis
#https://github.com/phpredis/phpredis#readme
yum install php-pecl-redis

[PHP 連接 Redis 簡單範例]
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->auth('密碼'); //如果有設定 requirepass
$redis->set('aa', 'abcd');
echo $redis->get('aa');


參考:

其他資料:

沒有留言:

張貼留言