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 指令]
#本機連線
redis-cli
#指定 port、IP 連線
redis-cli -p 6379 -h 127.0.0.1
#用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"

#取得所有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


[安裝 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');


參考:
Redis常用命令 - 歪麦博客
Redis 命令 | 菜鸟教程
Redis 数据类型 | 菜鸟教程
Redis 配置 | 菜鸟教程

其他資料:
Redis 命令参考
Redis 设计与实现(第一版)
Redis 设计与实现
Redis 教程

沒有留言:

張貼留言