redis高級實用教程

一、設置redis外網訪問

更改redis.conf 文件

# vim redis.conf
bind 127.0.0.1      # 註釋掉改行
protected-mode yes # 更改模式爲no(redis3.2後)

二、設置密碼驗證

更改redis.conf配置文件

requirepass redhat

或者通過set設置

127.0.0.1:6379> config get requirepass      # 查看密碼設置
1) "requirepass"
2) ""
127.0.0.1:6379> config set requirepass "redhat"   # 設置密碼
OK
127.0.0.1:6379> config get requirepass       # 已設置認證,無法繼續訪問
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth "redhat"                  # 鍵入密碼
OK
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) "redhat"

三、redis主從複製

redis 主從複製特點

(1) master 可以擁有多個slave
(2) 多個slave 可以連接同一個master 外,還可以連接到其他slave
(3) 主從複製不會阻塞master,在同步數據時,master 可以繼續處理client 請求
(4) 提高系統的伸縮性

redis 主從複製過程

當配置好slave 後,slave 與master 建立連接,然後發送sync 命令。無論是第一次連接還是重新連接,master 都會啓動一個後臺進程,將數據庫快照保存到文件中,同時master 主進程會開始收集新的寫命令並緩存。後臺進程完成寫文件後,master 就發送文件給slave,slave將文件保存到硬盤上,再加載到內存中,接着master 就會把緩存的命令轉發給slave,後續master 將收到的寫命令發送給slave。如果master 同時收到多個slave 發來的同步連接命令,master 只會啓動一個進程來寫數據庫鏡像,然後發送給所有的slave。

redis主從複製配置

安裝多個實例

# cp redis.conf redis_slave.
# vim redis_slave.conf

更改以下內容:

pidfile /var/run/redis_slave.pid    
port 6378
logfile "/wh_k/redis-2.8.17/src/redis_slave.log"
dbfilename dump_slave.rdb

修改配置文件redis_slave.conf (主從配置)

# vim redis_slave.conf

添加以下內容:

# slaveof <masterip> <masterport>
slaveof 192.168.61.128 6379
masterauth redhat     # master主服務器有密碼,需添加此配置,“redhat”爲主服務器密碼

啓動slave連接數據庫

# ./redis-server ../redis_slave.conf
# ./redis-cli -h 192.168.61.128 -p 6378

測試

mater端:

127.0.0.1:6379> select 2
OK
127.0.0.1:6379[2]> keys *
(empty list or set)

slave端:

192.168.61.128:6378> select 2
OK
192.168.61.128:6378[2]> keys *
(empty list or set)

master端插入數據:

127.0.0.1:6379[2]> set name Whk
OK
127.0.0.1:6379[2]> set age 18
OK
127.0.0.1:6379[2]> mget name age
1) "Whk"
2) "18"

slave端測試:

192.168.61.128:6378[2]> keys *
1) "name"
2) "age"
192.168.61.128:6378[2]> mget name age
1) "Whk"
2) "18"

查看角色(主、備)

192.168.61.128:6378[2]> info
...
...
...
# Replication
role:slave

四、redis事務

簡單事務控制

127.0.0.1:6379[1]> set age 10
OK
127.0.0.1:6379[1]> multi    # 標記事務塊開始
OK
127.0.0.1:6379[1]> set age 15
QUEUED
127.0.0.1:6379[1]> set age 20
QUEUED
127.0.0.1:6379[1]> exec  # 調用
1) OK
2) OK
127.0.0.1:6379[1]> get age
"20"

取消事務discard(事務回滾)

127.0.0.1:6379[1]> get age
"20"
127.0.0.1:6379[1]> multi
OK
127.0.0.1:6379[1]> set age 15
QUEUED
127.0.0.1:6379[1]> set age 10
QUEUED
127.0.0.1:6379[1]> discard
OK
127.0.0.1:6379[1]> get age
"20"

監視命令watch

watch 命令會監視給定的key,當exec 時候如果監視的key 從調用watch 後發生過變化,則整個事務會失敗。也可以調用watch 多次監視多個key.這 樣就可以對指定的key 加樂觀鎖了。注意watch 的key 是對整個連接有效的,事務也一樣。如果連接斷開,監視和事務都會被自動清除。當然了exec,discard,unwatch 命令都會清除連接中的所有監視。

redis事務可以理解爲一個打包的批量執行腳本,但批量指令並非原子化的操作,中間某條指令的失敗不會導致前面已做指令的回滾,也不會造成後續的指令不做。

127.0.0.1:6379[1]> get age
"20"
127.0.0.1:6379[1]> set name whk
OK
127.0.0.1:6379[1]> 
127.0.0.1:6379[1]> watch age
OK
127.0.0.1:6379[1]> multi
OK
127.0.0.1:6379[1]> incr age
QUEUED
127.0.0.1:6379[1]> incr name
QUEUED
127.0.0.1:6379[1]> exec
1) (integer) 21
2) (error) ERR value is not an integer or out of range
127.0.0.1:6379[1]> get age
"21"                                     # age已發生變化
127.0.0.1:6379[1]> get name
"whk"    # name未變化

五、發佈和訂閱消息

Redis 發佈訂閱(pub/sub)是一種消息通信模式:發送者(pub)發送消息,訂閱者(sub)接收消息,客戶端可以訂閱任意數量的頻道。有新消息通過PUBLISH 命令發送給頻道 channel1 時, 這個消息就會被髮送給訂閱它的另幾個客戶端

打開客戶端1訂閱消息:

127.0.0.1:6379> SUBSCRIBE Wechat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "Wechat"
3) (integer) 1

打開客戶端2發佈消息:

127.0.0.1:6379> PUBLISH Wechat "Hello world !"
(integer) 1
127.0.0.1:6379> PUBLISH Wechat "Beautifull"
(integer) 1

打開客戶端1查看消息:

127.0.0.1:6379> SUBSCRIBE Wechat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "Wechat"
3) (integer) 1
1) "message"
2) "Wechat"
3) "Hello world !"
1) "message"
2) "Wechat"
3) "Beautifull"

六、redis 數據備份與恢復

創建備份save

該命令將在 redis 安裝目錄中創建dump.rdb文件(默認src下)

127.0.0.1:6379> SAVE 
OK

恢復備份

將dump.rdb移至安裝目錄下啓動服務即可。

後臺備份bgsave

127.0.0.1:6379> bgsave
Background saving started

7、性能測試

redis 性能測試是通過同時執行多個命令實現的。

[root@Centos6 src]# ./redis-benchmark -n 10000 -q
PING_INLINE: 50505.05 requests per second
PING_BULK: 48309.18 requests per second
SET: 58823.53 requests per second
GET: 60975.61 requests per second
INCR: 60606.06 requests per second
LPUSH: 61349.69 requests per second
LPOP: 59880.24 requests per second
SADD: 61728.39 requests per second
SPOP: 59880.24 requests per second
LPUSH (needed to benchmark LRANGE): 64516.13 requests per second
LRANGE_100 (first 100 elements): 27777.78 requests per second
LRANGE_300 (first 300 elements): 11737.09 requests per second
LRANGE_500 (first 450 elements): 9115.77 requests per second
LRANGE_600 (first 600 elements): 6702.41 requests per second
MSET (10 keys): 39840.64 requests per second

爲提升性能,可以採用管道技術:管道技術可以在服務端未響應時,客戶端可以繼續向服務端發送請求,並最終一次性讀取所有服務端的響應。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章