共計 4151 個字符,預(yù)計需要花費 11 分鐘才能閱讀完成。
丸趣 TV 小編給大家分享一下 Redis 高級應(yīng)用的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
Redis 高級實用特性分 6 部分:
1、安全性
設(shè)置客戶端連接后進行任何其他操作時,需要使用密碼
修改 redis.conf 配置文件,requirepass password 指令就是用來設(shè)置密碼的
修改完配置文件后要重啟 redis 服務(wù)
重啟后,發(fā)現(xiàn)在命令行執(zhí)行操作時,會有以下提示。此時需要用 auth password 來授權(quán)
127.0.0.1:6379 keys *
(error) NOAUTH Authentication required.
127.0.0.1:6379 auth redis123
127.0.0.1:6379 keys *
(empty list or set)
如果不希望在命令行輸入密碼來完成授權(quán),則可以在登錄客戶端時,輸入密碼
[root@localhost init.d]# /usr/local/redis/bin/redis-cli -a redis123
127.0.0.1:6379 keys *
(empty list or set)
2、主從復(fù)制
Redis 主從復(fù)制配置和使用非常簡單。通過主從復(fù)制可以允許多個 slave server 擁有和 master server 相同的數(shù)據(jù)庫副本
主從復(fù)制的工作原理:
1、slave 與 master 建立連接后,發(fā)送 sync 同步命令
2、master 會啟動一個后臺進程,將數(shù)據(jù)庫快照保存到文件中,同時 master 主進程會開始收集新的寫命令并緩存
3、后臺完成保存后,將此文件發(fā)送給 slave
4、slave 將此文件保存到硬盤上
主從復(fù)制的特點:
a、Master 可以擁有多個 slave
b、多個 slave 可以連接同一個 master 外,還可以連接到其他 slave(這個特性是為了防止 master 出現(xiàn)故障后,slave 無法進行同步,如果 slave 還連接了其他 slave,那么 master 掛掉后,這個 slave 就會變成 master,接管服務(wù))
c、主從復(fù)制不會阻塞 master,在同步數(shù)據(jù)時,master 可以繼續(xù)處理 client 請求
d、提高系統(tǒng)的伸縮性
主從復(fù)制的配置:
在 slava 的配置文件中加入以下配置:
slaveof 192.168.1.1 6379 #指定 master 的 ip 和端口
masterauth PASSWORD # 這是 master 的密碼
注意:主從配置的注意事項:
master、slave 的配置文件中 bind 127.0.0.1 這條配置改成 eth0 網(wǎng)卡的 ip 地址,否則 redis 的端口默認監(jiān)聽在 127.0.0.1 上。這樣 slave 到 master 的端口不通。
更改 bind 的 IP 地址后,進入客戶端時使用命令:
$redis_home/bin/redis-cli -h 172.16.206.140
即使用 - h 參數(shù)指定 eth0 網(wǎng)卡的 IP 地址,默認是 127.0.0.1
3、事務(wù)處理
Redis 對事務(wù)的處理目前還比較簡單,Redis 只能保證一個 client 發(fā)起的事物中的命令可以連續(xù)的執(zhí)行,而中間不會插入其他 client 的命令。當一個 client 在一個連接中發(fā)出 multi 命令時,這個連接會進入一個事務(wù)上下文,該連接后續(xù)的命令不會立即執(zhí)行,而是先放到一個隊列中,當執(zhí)行 exec 命令時,redis 會順序的執(zhí)行隊列中的命令
例如:
172.16.206.142:6379 set age 27
172.16.206.142:6379
172.16.206.142:6379 get age
172.16.206.142:6379 multi
172.16.206.142:6379 set age 37
QUEUED
172.16.206.142:6379 set age 47\
QUEUED
172.16.206.142:6379 set age 47
QUEUED
172.16.206.142:6379 exec
1) OK
2) OK
3) OK
172.16.206.142:6379 get age
47
discard:取消一個事務(wù)
172.16.206.142:6379 get age
172.16.206.142:6379 multi
172.16.206.142:6379 set age 100
QUEUED
172.16.206.142:6379 set age 200
QUEUED
172.16.206.142:6379 discard
172.16.206.142:6379 get age
47
事務(wù)回滾:
Redis 不支持事務(wù)回滾,當隊列中有兩個事務(wù),一個完成了另外一個沒有完成,那么沒有完成的那個事務(wù)不會影響整個事務(wù)。
172.16.206.142:6379 set name zeng
172.16.206.142:6379 get age
172.16.206.142:6379 multi
172.16.206.142:6379 incr age
QUEUED
172.16.206.142:6379 incr name
QUEUED
172.16.206.142:6379 exec
1) (integer) 48
2) (error) ERR value is not an integer or out of range
172.16.206.142:6379 get name
zeng
172.16.206.142:6379
172.16.206.142:6379 get age
48
樂觀鎖:
watch 命令會監(jiān)視給定的 key,當 exec 時候如果監(jiān)視的 key 從調(diào)用 watch 后發(fā)生過變化,則整個事務(wù)會失敗。也可以調(diào)用 watch 多次監(jiān)視多個 key,這樣就可以對指定的 key 加樂觀鎖了。
4、持久化機制
Redis 是一個支持持久化的內(nèi)存數(shù)據(jù)庫,也就是說 redis 需要經(jīng)常將內(nèi)存中的數(shù)據(jù)同步到硬盤來保證持久化。Redis 支持兩種持久化方式:
1、snapshotting(快照)也是默認方式
2、Append-only file(aof)的方式
Snapshotting 方式:
快照是默認的持久化方式,這種方式是將內(nèi)存中數(shù)據(jù)以快照的方式寫入到二進制文件中,默認的文件名為 dump.rdb. 可以通過配置設(shè)置自動做持久化的方式。我們可以配置 redis 在 n 秒內(nèi)如果超過 m 個 key 被修改就自動做快照
save 900 1 #900 秒內(nèi)如果超過 1 個 key 被修改,則發(fā)起快照保存
save 300 10 #300 秒內(nèi)如果超過 10 個 key 被修改,則發(fā)起快照保存
save 60 10000
aof 方式:
由于快照方式是在一定時間間隔內(nèi)做一次,所以如果 redis 意外 down 掉的話,就會丟失最后一次快照后的所有修改。
aof 比快照方式有更好的持久化性,是由于在使用 aof 時,redis 會將每一個收到的寫命令都通過 write 函數(shù)追加到文件中,當 redis 重啟時會通過重新執(zhí)行文件中保存的寫命令來在內(nèi)存中重建整個數(shù)據(jù)庫的內(nèi)容
appendonly yes // 啟用 aof 持久化方式
#appendfsync always // 收到寫命令就立即寫入磁盤,最慢,但是保證完全的持久化
appendfsync everysec // 每秒鐘寫入磁盤一次,在性能和持久化方面做了很好的折中
#appendfsync no // 完全依賴 os,性能最好,持久化沒有保證
5、發(fā)布訂閱消息
發(fā)布訂閱(pub/sub)是一種消息通信模式,主要的目的是解除消息發(fā)布者和消息訂閱者之間的耦合,Redis 作為一個 pub/sub 的 server,在訂閱者和發(fā)布者之間起到了消息路由的功能。訂閱者可以通過 subscribe 和 psubscribe 命令向 redis server 訂閱自己感興趣的消息類型,redis 將信息類型稱為通道(channel)。當發(fā)布者通過 publish 命令向 redis server 發(fā)送特定類型的信息時,訂閱該信息類型的全部 client 都會收到此消息
測試:
Redis server 開三個會話窗口,并進入 redis 客戶端命令行
終端一訂閱 tv1、tv2 兩個頻道
subscribe tv1 tv2
Reading messages... (press Ctrl-C to quit)
1) subscribe
2) tv1
3) (integer) 1
1) subscribe
2) tv2
3) (integer) 2
終端二訂閱 tv2 頻道
subscribe tv1
Reading messages... (press Ctrl-C to quit)
1) subscribe
2) tv1
3) (integer) 1
終端三向 tv1 頻道發(fā)布消息 hello
publish tv1 hello
(integer) 2
結(jié)果:
終端一、二都收到消息:
1) message
2) tv1
3) hello
6、虛擬內(nèi)存的使用
Redis 的虛擬內(nèi)存與操作系統(tǒng)的虛擬內(nèi)存不是一回事,但是思路和目的都是相同的。就是暫時把不經(jīng)常訪問的數(shù)據(jù)從內(nèi)存交換到磁盤中,從而騰出寶貴的內(nèi)存空間用于其他需要訪問的數(shù)據(jù)。尤其是對于 redis 這樣的內(nèi)存數(shù)據(jù)庫,內(nèi)存總是不夠用的。除了可以將數(shù)據(jù)分割到多個 redis server 外。另外能夠提高數(shù)據(jù)庫容量的辦法就是使用虛擬內(nèi)存把那些不經(jīng)常訪問的數(shù)據(jù)交換到磁盤上。
配置如下:
vm-enabled yes # 開啟 vm 功能
really-use-vm yes # 確定使用虛擬內(nèi)存,這條配置需要手動添加
vm-swap-file /tmp/redis.swap #交換出來的 value 保存的文件路徑
vm-max-memory 1000000 #redis 使用的最大內(nèi)存上線
vm-page-size 32 #每個頁面的大小 32 字節(jié)
vm-pages 134217728 #最多使用多少個頁面
vm-max-threads 4 # 用于執(zhí)行 value 對象換入的工作線程數(shù)量
以上是“Redis 高級應(yīng)用的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注丸趣 TV 行業(yè)資訊頻道!