2017 11-15 redis應用

一.redis介紹

(1)概念:屬于非關系型存儲數據庫——基于kv(鍵值存儲)的開源的內存存儲,數據庫結構存儲。經常被用作數據庫,消息隊列和緩存。
下載可去官網www.redis.io 或是epel源進行下載

搜狗截圖20171116091316.png

主程序/usr/bin/redis-server
監聽端口:6379/tcp
客戶端:/usr/bin/redis-cli
數據目錄:/var/lib/redis
(2)支持的數據結構
字符串、列表(數組)、hashes(關聯數組)、集合、有序集合、bitmaps、hyperloglogs、空間索引
(3)redis特點
內建的復制、Lua scripting、LRU、事務、持久存儲、高可用(Sentinel,Redis Cluster)
(4)redis:k/v
基于kv鍵值存儲,進入客戶端redis-cli
搜狗截圖20171116092655.png

通過select命令來選擇數據庫,不能超過15(15為數據庫編號,是第16個數據庫)

  • 常用命令
    使用help進行查詢幫助,Help @generic(通用命令),@string
    @list,@set,@hash,@pubsub,@sorted_set
    下面選擇幾個常用的命令演示以加深印象
    1.@string
    主要應用:增,刪,改,查


    搜狗截圖20171116094054.png

    使用get來查看mykey的內容
    如果想要在mykey增加內容就是用append命令來實現


    搜狗截圖20171116094417.png

    注意在使用set命令創建key時如果想要設置過期時間可以在后面加入EX 加時間(時間以秒為單位),這樣就是代表經過多長時間該內容就會消失
    搜狗截圖20171116095107.png

    在后面加入NX代表只創建不存在的key,如果之前存在就不創建,如果不在后面加入NX,那么創建相同的key,就會把之前的內容覆蓋
    搜狗截圖20171116095651.png
  • incr和decr使用
    set count 0


    搜狗截圖20171116100922.png
  • 查看鍵值長度


    搜狗截圖20171116100205.png

2.help @list

  • 使用lpush 命令創建key


    搜狗截圖20171116103627.png
  • lindex,lrange


    搜狗截圖20171116104209.png
  • linsert


    搜狗截圖20171116104359.png
  • rpop和lpop


    搜狗截圖20171116104644.png
  • llen——查看列表長度
  • lrem——刪除命令,lrem week 1 thu
    搜狗截圖20171116105039.png
  • lset
    搜狗截圖20171116105328.png

3.help @hash

  • hget
    hget who(key) name(field) tom(values)


    搜狗截圖20171116110223.png
  • hmget


    搜狗截圖20171116110545.png

    搜狗截圖20171116110611.png
  • hstrlen和hgetall


    搜狗截圖20171116110756.png
  • hdel


    搜狗截圖20171116110839.png

4.help @set——主要應用于集合的交差并補

設置
sadd animals dog elephant fox horse monkey cat wolf
sadd jiaqin egg chicken dog pig cat duck fish
使用smembers animals和smembers jianqin來查看


搜狗截圖20171116111825.png
  • srem——刪除key中的內容


    搜狗截圖20171116112351.png

    *sinter sdiff sunion


    搜狗截圖20171116112614.png

    搜狗截圖20171116112730.png

5.help @sorted_set——通過評分機制來劃分

  • zadd employees1 1 tom 3 jerry 4 hadern 5 bush 7 obama
    9 sanpang 10 zhangzhe
  • zscore key zrank
    搜狗截圖20171116113735.png

    *zrangebyscore
    搜狗截圖20171116113852.png
  • ZUNIONSTORE——并集存儲
  • ZINTERSTORE——交集存儲
  • ZREM ——刪除

6.help @pubsub——發布訂閱隊列

常用命令:publish——扇出(將內容發給訂閱該頻道的用戶),后來的用戶無法接收到,因為該內容扇出
subscribe——訂閱具體頻道


搜狗截圖20171116115022.png

在另一個終端上


搜狗截圖20171116115154.png

再開啟一個終端
搜狗截圖20171116115324.png
  • UNSUBSCRIBE——取消訂閱

二.配置與使用redis

配置文件——/etc/redis.conf


搜狗截圖20171116142250.png

(1).基本配置項
daemonize, supervised, pidfile


搜狗截圖20171116155110.png

loglevel,logfile
搜狗截圖20171116155208.png

databases,select 0-15來選擇數據庫


搜狗截圖20171116155326.png

(2).網絡配置項

bind IP


搜狗截圖20171116155901.png

port PORT
默認為6379,一般情況下也不建議修改端口
protected-mode


搜狗截圖20171116160156.png

tcp-backlog
unixsocket

timeout:連接的空閑超時時長;
默認設置為0,不設定空閑超時時間

(3).持久化相關配置
Redis的持久化:

  • RDB:snapshotting, 二進制格式;按事先定制的策略,周期性地將數據從內存同步至磁盤;數據文件默認為dump.rdb;
    客戶端顯式使用SAVE或BGSAVE命令來手動啟動快照保存機制;
    SAVE:同步,即在主線程中保存快照,此時會阻塞所有客戶端請求;
    BG(backgroud)SAVE:異步;一般采用bg
    yum 安裝默認開啟rdb持久連接


    搜狗截圖20171116170425.png

    特點:效率高,但是同步內容不夠精確
    stop-writes-on-bgsave-error yes
    dump操作出現錯誤時,是否禁止新的寫入操作請求;
    rdbcompression yes
    rdbchecksum yes
    dbfilename dump.rdb:指定rdb文件名
    dir /var/lib/redis:rdb文件的存儲路徑

  • AOF:Append Only File, fsync
    記錄每次寫操作至指定的文件尾部實現的持久化;當redis重啟時,可通過重新執行文件中的命令在內存中重建出數據庫;
    BGREWRITEAOF:AOF文件重寫;
    不會讀取正在使用AOF文件,而是通過將內存中的數據以命令的方式保存至臨時文件中,完成之后替換原來的AOF文件;
    該方式更精準但是效率不高,能實現時間點還原
    搜狗截圖20171116170858.png

    注意:aof和rdb不能同時開啟,會影響負載和io性能
    no-appendfsync-on-rewrite no
    是否在后臺執行aof重寫期間不調用fsync,默認為no,表示調用;
    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb
    上述兩個條件同時滿足時,方會觸發重寫AOF;與上次aof文件大小相比,其增長量超過100%,且大小不少于64MB;
    aof-load-truncated yes
  • Redis服務器啟動時用持久化的數據文件恢復數據,會優先使用AOF

(4).安全相關配置

搜狗截圖20171116160617.png

設施密碼后再次登錄就要輸入密碼


搜狗截圖20171116160915.png

或者使用redis-cli -a magedu來進行登錄


搜狗截圖20171116161206.png

rename-command
一般是對config命令來進行重命名操作,因為config命令功能強大,如果有其他用戶連入,會對redis數據庫造成威脅
在AOF或Replication環境中,但不推薦使用
搜狗截圖20171116161842.png

體現出config的危險性
config set maxclients 10002
OK
127.0.0.1:6379[15]> config get maxclients

  1. "maxclients"
  2. "10002"
    127.0.0.1:6379[15]> config rewrite
    OK


    搜狗截圖20171116163833.png

(5).Limit相關的配置

maxclients
默認設置最大值為10000
maxmemory <bytes>
maxmemory-policy noeviction


搜狗截圖20171116162256.png

淘汰策略:volatile-lru, allkeys-lru, volatile-random, allkeys-random, volatile-ttl, noeviction
maxmemory-samples 5
淘汰算法運行時的采樣樣本數;

(6).SlowLog相關的配置

slowlog-log-slower-than 10000
單位是微秒;
slowlog-max-len 128
SlowLog記錄的日志最大條目;

(7).Advanced配置

hash-max-ziplist-entries 512
hash-max-ziplist-value 64
設置ziplist的鍵數量最大值,每個值的最大空間;
client-output-buffer-limit normal 0 0 0:
client-output-buffer-limit slave 256mb(最大不超過) 64mb(一般不超過的最大內存) 60(超過64,小于256緩存時間)
client-output-buffer-limit pubsub 32mb 8mb 60
<hard-limit>——硬限制
<soft-limit>——軟限制
<soft-limit seconds>——軟限制時間限制

(8)redis-cli命令:

Server相關的命令:
CLIENT GETNAME
CLIENT KILL
CLIENT KILL [ip:port] [ID client-id] [TYPE normal|master|slave|pubsub] [ADDR ip:port] [SKIPME yes/no]

搜狗截圖20171116164416.png

CLIENT LIST
CLIENT PAUSE
CLIENT PAUSE timeout
CLIENT REPLY
CLIENT SETNAME:Set the current connection name
SHUTDOWN [NOSAVE|SAVE]
搜狗截圖20171116164504.png

搜狗截圖20171116164627.png

配置參數可運行時修改:
CONFIG GET
CONFIG RESETSTAT
CONFIG REWRITE
CONFIG SET
INFO:服務器狀態信息查看;分為多個secion;
INFO [section]
搜狗截圖20171116165028.png

搜狗截圖20171116165137.png

config resetstat
搜狗截圖20171116165325.png

三.redis主從復制

(1)特點
一個Master可以有多個slave主機,支持鏈式復制;
Master以非阻塞方式同步數據至slave主機;
(2)相關配置

slaveof——在從節點上設置對應的主節點的地址與端口號
masterauth ——進行密碼驗證,與主節點密碼相同
            
slave-serve-stale-data yes——是否允許過期的數據來影響客戶端的請求
slave-read-only yes——只允許從節點讀
*repl-diskless-sync no——需不需要啟用無磁盤的復制
 新的從節點或某較長時間未能與主節點進行同步的從節點重新與主節點通信,需要做“full synchronization",此時其同步方式有兩種style:
Disk-backend:主節點新創建快照文件于磁盤中,而后將其發送給從節點;
Diskless:主節占新創建快照后直接通過網絡套接字文件發送給從節點;為了實現并行復制,通常需要在復制啟動前延遲一個時間段;
repl-diskless-sync-delay 5
repl-ping-slave-period 10
*repl-timeout 60
repl-disable-tcp-nodelay no
repl-backlog-size 1mb
*slave-priority 100
復制集群中,主節點故障時,sentinel應用場景中的主節點選舉時使用的優先級;數字越小優先級越高,但0表示不參與選舉; 
min-slaves-to-write 3:主節點僅允許其能夠通信的從節點數量大于等于此處的值時接受寫操作;
min-slaves-max-lag 10:從節點延遲時長超出此處指定的時長時,主節點會拒絕寫入操作;

示例:配置三臺虛擬機,其中172.18.254.242最為主節點172.18.25.62和172.18.250.89作為從節點
在主節點上vim /etc/redis.conf
bind 0.0.0.0
requirepass magedu
在172.18.250.89上
vim /etc/redis.conf
bind 0.0.0.0
slaveof 172.18.254.242 6379
masterauth magedu
requirepass magedu
修改完成后重啟登錄
redis-cli -h 172.18.250.89
auth magedu


搜狗截圖20171116210030.png

在主節點上執行client list
搜狗截圖20171116210120.png

從節點連接成功,此時在主節點設置一些命令來驗證
select 15
set key whokey "why are you my honey"
get whokey
搜狗截圖20171116210320.png

在從節點上select 15
執行get whokey顯示
搜狗截圖20171116210521.png

再另一個從節點上使用redis-cli 中命令來實現主從復制
首先vim /etc/redis.conf
requirepass magedu
bind 0.0.0.0
redis-cli
搜狗截圖20171116210848.png

在主節點上


搜狗截圖20171116210956.png

連接成功
搜狗截圖20171116211214.png

執行config rewrite 將修改內容存入配置文件

(3)sentinel

1.主要完成三個功能:監控、通知、自動故障轉移
選舉:流言協議、投票協議
流言協議:當主節點無法自己主觀判斷時需要詢問其他從節點是否down,當其他從節點都一致認為主節點down就是真的down
投票協議:當with quorum>2時,代表主機down,當quorum<=2時,投票協議作廢。quorum屬于sentinel集群的機制


搜狗截圖20171116211611.png

2.配置項:
port 26379
sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel auth-pass <master-name> <password>
<quorum>表示sentinel集群的quorum機制,即至少有quorum個sentinel節點同時判定主節點故障時,才認為其真的故障;


搜狗截圖20171116211914.png

s_down: subjectively down——主觀down,只要自己認為down就是down
o_down: objectively down——客觀down,根據投票協議來設定
sentinel down-after-milliseconds <master-name> <milliseconds>
監控到指定的集群的主節點異常狀態持續多久方才將標記為“故障”;
sentinel parallel-syncs <master-name> <numslaves>

指在failover過程中,能夠被sentinel并行配置的從節點的數量;
sentinel failover-timeout <master-name> <milliseconds>
sentinel必須在此指定的時長內完成故障轉移操作,否則,將視為故障轉移操作失敗;
sentinel notification-script <master-name> <script-path>
通知腳本,此腳本被自動傳遞多個參數;
redis-cli -h SENTINEL_HOST -p SENTINEL_PORT
redis-cli>
SENTINEL masters
SENTINEL slaves <MASTER_NAME>
SENTINEL failover <MASTER_NAME>
SENTINEL get-master-addr-by-name <MASTER_NAME>

通過實際操作來驗證
在主節點上:vim /etc/redis-sentinel.conf
注意該配置文件中沒有bind這一項需要手動添加
bind 0.0.0.0
sentinel monitor mymaster 172.18.254.242 6379 2——主節點ip地址和端口,并且定義了qorum >3/2
sentinl auth-pass mymaster magedu——驗證密碼
sentinel down-after-milliseconds mymaster 5000——當主機down后設置五秒后為down機狀態
sentinel parallel-syncs mymaster 3——故障轉移過程中從節點的數量
sentinel failover-timeout mymaster 60000——故障轉移連接時間超過60秒就是失敗
配置完成后將配置文件復制給另外兩個節點
scp /etc/redis-sentinel.conf 172.18.250.89:/etc/
scp /etc/redis-sentinel.conf 172.18.250.223:/etc/
復制成功后分別執行systemctl start redis-sentinel
執行ss -ntl發現26379端口打開
在主節點上執行redis-cli -h 172.18.254.242 -p 26379
-a magedu
執行 sentinel masters——查看主節點信息


搜狗截圖20171116215103.png

執行sentinel slaves mymaster

搜狗截圖20171116215202.png

搜狗截圖20171116215236.png

此時將主節點的redis關閉,來查看
發現主節點地址發生變化,而主節點的變換機制在未設定的情況下是根據ip地址大小來確定,也可以通過設置slave-priority
100來設置優先級,數字越小優先級越高
修復機制vim /etc/redis.conf
slaveof 172.18.250.89 6379
masterauth magedu
repl-diskless-sync no
配置完成后開啟服務
再次進行查看發現
原來的主節點狀態變為slave
SENTINEL get-master-addr-by-name <MASTER_NAME>
手動觸發故障轉移
SENTINEL get-master-addr-by-name mymaster會看見新的主節點的地址

三.cluster設置

(1).redis的集群:redis集群會在所有的redis節點上分配槽點,槽點總數為16384,范圍是0-16383
這樣每個節點上都會被分配相應的槽點,這樣redis數據庫的數據就就會被分配到這些節點上,每個節點都會存有一部分數據。當客戶創建一個鍵值時,就會對鍵值進行hash運算,將計算結果對16384進行運算取模,結果范圍在0-16383,那么該鍵值如果和某個節點的取模后的數值對應上,那么數據就會存儲在此,下次用戶想要查詢時就會找到對應的節點才會找到對應的數據
(2) 集群相關的配置
cluster-enabled 是否開啟集群配置
cluster-config-file 集群節點集群信息配置文件,每個節點都有一個,由redis生成和更新,配置時避免名稱沖突
cluster-node-timeout 集群節點互連超時的閥值,單位毫秒
cluster-slave-validity-factor 進行故障轉移時,salve會 申請成為master。有時slave會和master失聯很久導致數據較舊,這樣的slave不應該成為master。這個配置用來判斷slave是否和master失聯時間過長
cluster-require-full-coverage yes:如果任何一個節點故障了,并且沒有設置從節點,導致槽不完整了,還能否接受客戶端的請求,此配置是要求有完整的槽才能接受請求,因此設置為yes
(3) 配置過程:
設置配置文件,啟用集群功能;
啟動redis后為每個節點分配slots;
CLUSTER ADDSLOTS
注意:每個slot要獨立創建;
設定集群成員關系;
CLUSTE MEET
(4)測試
三個主機不是主從關系
關掉redis-sentinel
在172.18.254.242上
vim /etc/redis.conf
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-require-full-coverage yes
cluster-node-timeout 15000
配置完成
(5)在172.18.254.242上
分配給每個節點槽點
echo [16384/3]
5461
echo [5461*2]
10922
redis-cli -a magedu cluster addlots {0..5461}
redis-cli -a magedu -h 172.18.250.89 cluster addlots {5462..10922}
redis-cli -a magedu -h 172.18.250.223 cluster asslots {10923..16383}
(6)完成集群會面
redis-cli -a magedu -h 172.18.254.242
cluster meet 172.18.250.89 6379
cluster meet 172.18.250.223 6379
使用cluster info 來查看結果
顯示槽位為16384
(7)設置鍵值
在172.18.254.242上
redis-cli -a magedu
set hellokey "hi,friends"
get kellokey
顯示 “hi,friend”
set mykey "hi,yourfriends"
提示用戶要在172.18.250.89的節點上操作,所以在172.18.250.89的主機上
redis-cli -a magedu
set mykey "hi,yourfriends"
顯示ok
set whoeverkey "no,who are you"
提示用戶要在172.18.250.223的主機上執行該操作
所以在172.18.250.223上
redis-cli -a magedu
set whoeverkey "no,who are you"
顯示ok
這就實現了redis的集群復制

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,406評論 6 538
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,034評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,413評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,449評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,165評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,559評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,606評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,781評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,327評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,084評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,278評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,849評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,495評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,927評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,172評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,010評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,241評論 2 375

推薦閱讀更多精彩內容

  • 1.1 資料 ,最好的入門小冊子,可以先于一切文檔之前看,免費。 作者Antirez的博客,Antirez維護的R...
    JefferyLcm閱讀 17,090評論 1 51
  • redis簡介 redis單純程模型,支持主從模式,提高可用性,是一個開源項目,經常用來當一個數據結構服務器。其是...
    魏鎮坪閱讀 60,569評論 2 4
  • 一.mysql的日志應用 (1)查詢日志:general_log 記錄查詢語句,日志存儲位置:文件:file表:t...
    楠人幫閱讀 587評論 0 4
  • 貓咪睡在澤澤小床上呢
    樟柯桐閱讀 125評論 0 0
  • 沒有和睦的家庭,沒有很好的背景,沒有優質的外貌,沒有獨特的才華,生活地亂七八糟。所以我需要理智,如果我想要繼續生活...
    怪了阿草閱讀 204評論 0 0