Redis:
問題現象:
海量用戶
高併發
罪魁禍首---關係型數據庫
性能瓶頸:磁盤IO性能低下
擴展瓶頸:數據關係複雜,擴展性差,不便於大規模集羣
數據存儲類型
string hash list set sourted_set
對redis操作 成功返回(integer)1 失敗返回(integer)0
append 在原來的字段上添加數據 如果沒有 則新建
設置數值數據增加指定範圍的值
incr:key
incrby:key increment
incrbyfloat:key increment
設置數值數據減少指定範圍的值
decr:key
decrby:key increment
setex:設置數據具有指定的生命週期 單位秒 再調用一次的話 上個設置就會被清掉
psetex:跟上面的功能一樣 單位是毫秒
數據最大存儲量 512MB
數值計算最大範圍(java中的long最大值)
hash類型數據的基本操作
添加/修改數據
hset key field value
獲取數據
hget key field
hgetall key
刪除數據
hdel key field1[field2]
添加/修改多個數據
hmset key field1 value1 field2 value2
獲取多個數據
hmget key field1 field2..
獲取哈希表中字段的數量
hlen key
獲取哈希表中是否存在指定的字段
hexists key field
hash類型數據操作的注意事項
hash類型下的value只能存儲字符串,不允許存儲其他數據類型,不存在嵌套現象。如果數據未獲取到,對應的值爲(nil)
沒個hash可以存儲2^32-1個鍵值對
hash類型十分貼近對象的數據存儲形式,並且可以靈活添加刪除對象屬性。但hash設計初中不是爲了存儲大量對象而設計的,切記不可濫用,更不可將hash作爲對象列表使用。
hgetall操作可以獲取全部屬性,如果內部field過多,遍歷整體數據效率就會很低,有可能成爲數據訪問的瓶頸
hsetnx key field value 判斷當前key是否存在值 如果 存在就更改 否則就不進行操作
hash和string的區別
讀的話string 更改數據用hash
順序表 查詢快 增刪慢
鏈表 查詢慢 增刪快
雙向鏈表
list類型數據基本操作
添加/修改數據
lpush key value1 [value2]
rpush key value1 [value2]
獲取數據
lrange key start stop
lindex key index
llen key
獲取並移除數據
lpop key
rpop key
獲取所有數據可以用 lrange 0 -1
list類型數據擴展操作
規定時間內獲取並移除數據
blpop key1 [key2] timeout
brpop key1 [key2] timeout
移除指定數據
lrem key count value
set類型
新的存儲需求:存儲大量的數據,在查詢方面提供更高的效率。
需要的存儲結構:能夠保存大量的數據,高效的內部存儲機制,便於查詢
set類型:與hash存儲結構完全相同,僅存儲鍵,不存儲值(nil),並且值是不允許重複的
set類型數據的基本操作
添加數據
sadd key member1 [member2]
獲取全部數據
smembers key
刪除數據
srem key member1 [member2]
獲取集合數據總量
scard key
判斷集合中是否包含指定數據
sismember key member
隨機獲取集合中指定數量的數據
srandmember key [count]
隨機獲取集合中的某個數據並將該數據移出集合
spop key
求兩個集合的交、並、差集
sinter key1 [key2]
sunion key1 [key2]
sdiff key1 [key2]
求兩個集合的交、交、並、差集並存儲到指定集合中
sinterstore destination key1 [key2]
sunionstore destination key1 [key2]
sdiffstore destination key1 [key2]
將指定數據從原始集合中移動到目標集合中
smove source destination member
redis應用於不同類型不重複數據類型的合併
sorted_set 類型
新的存儲需求:數據排序有利於數據的有效展示,需要提供一種可以根據自身特徵進行排序的方式
需要的存儲結構:新的存儲模型,可以保存排序的數據
sorted_set類型:在set的存儲結構基礎上添加尅可排序字段
sorted_set 類型數據的基本操作
添加數據
zadd key score1 member1 [score2 member2]
獲取全部數據
zrange key start stop [WITHSCORES]
zrevrange key start stop [WITHSCORES]
刪除數據
zrem key member [member ...]
按條件獲取數據
zrangebyscore key min max [WITHSCORES] [LIMIT]
zrevrangebyscore key max min [WITHSCORES]
條件刪除數據
zremrangebyrank key start stop
zremrangebyscore key min max
獲取集合數據總量
zcard key
zcount key min max
集合交併操作
zinterstore destination numkeys key [key...]
zunionstore destination numkeys key [key...]
key通用操作
key基本操作
刪除指定key
del key
獲取key是否存在
exists key
獲取key的類型
type key
key擴展操作(時效性控制)
爲指定key設置有效期
expire key seconds
expire key milliseconds
expireat key timestamp
pexpireat key milliseconds-timestamp
獲取key的有效時間
ttl key
切換key從時效性轉換爲永久性
pttl key
key 擴展操作(查詢模式)
查詢key
keys pattern
查詢模式規則
* 匹配任意數量的任意符號 ? 配合一個任意符號 【】匹配一個指定符號
keys * 查詢所有
keys it* 查詢所有以it開頭
keys *heima 查詢所有以heima結尾
keys ??heima 查詢所有前面兩個字符任意,後面以heima結尾
keys user:? 查詢所有以user:開頭,最後一個字符任意
keys u[st]er:1 查詢所有以u開頭,以er:1結尾,中間包含一個字母,s或者t
key其他操作
爲key改名
rename key newkey 如果newkey已存在 會把之前的覆蓋
renamenx key newkey 如果newkey已存在 會失敗
對所有key排序
sort
其他key通用操作
help @generic
數據庫通用操作
db基本操作
切換數據庫
select index
其他操作
quit
ping
echo message
數據移動
move key db
數據清除
dbsize
flushdb
flushall
持久化的兩種方式
RDB和AOF
RDB 命令 save bgsave(後臺保存)
save second changes second:監控時間範圍內 changes:監控key的變化量
事務的基本操作
開啓事務
multi
作用:設定事務的開啓位置,此指令執行後,後續的所有指令均加入到事務中
執行事務
exec
作用:設定事務的結束位置,同時執行事務。與multi成對出現,成對使用
注意:加入事務的命令暫時進入到任務隊列中,並沒有立即執行,只有執行exec命令纔開始執行
取消事務
discard
作用:終止當前事務的定義,發生在multi之後,exec之前
Redis中的數據特徵
Redis是一種內存級數據庫,所有數據均存放在內存中,內存中的數據可以通過TTL指令獲取其狀態
XX:具有時效性的數據
-1:永久有效的數據
-2:已經過期的數據或被刪除的數據或未定義的數據
刪除策略對比
1定時刪除 ●節約內存,無佔用 ●不分時段佔用CPU資源,頻度高 ●拿時間換空間
2惰性刪除 ●內存佔用嚴重 ●延時執行,CPU利用率高 ●拿空間換時間
3定期刪除 ●內存定期隨機清理 ●每秒花費固定的CPU資源維護內存 ●隨機抽查,重點抽查
主從複製
單機redis的風險與問題
問題1 機器故障
●現象:硬盤故障 系統崩潰
●本質:數據丟失,很可能對業務造成災難性打擊
●結論:基本會放棄使用redis
問題2 容量瓶頸
●現象:內存不足,從16G升級到64G,從64G升級到128G.無限升級內存
●本質:窮,硬件條件跟不上
●結論:放棄使用redis
●結論:
爲了避免單點Redis服務器故障,準備多臺服務器,互相連通。將數據複製多個副本保存在不同的服務器上,鏈接在一起,並保證數據是同步的,即使有其中一臺服務器宕機,其他服務器依然可以繼續提供服務,實現Redis的高可用,同時實現數據冗餘備份
主從複製
主從複製即將master中的數據即時,有效的複製到slave中
特徵:一個master可擁有多個slave,一個slave只對應一個master
職責:
●master
●寫數據
●執行寫操作時,將出現變化的數據自動同步到slave
●讀數據(可忽略)
●slave
●讀數據
●寫數據(禁止)
主從複製工作流程
數據同步+命令傳播階段工作流程
slava先發送 psync2 ?-1 給master
master執行bgsave生成RDB文件,記錄當前的複製偏移量是offset
master發送 +FULLRESYNC runid offset 通過socket發送RDB文件給slave
slave收到+FULLRESYNC 保存master的runid和offset
清空當前全部數據,通過socket接受RDB文件,恢復RDB數據
上面這些是全量複製
期間接受客戶端命令,offset發生了變化
slave發送命令 psync2 runid offset
master接受命令,判定runid是否匹配,判定offset是否在複製緩衝區
如果 runiid 或者offset有一個不滿足,執行全量複製
如果runid或offset校驗通過,offset與offset相同,忽略
如果runid或offset校驗通過,offset與offset不相同,發送+CONTINUE offset
通過socket發送複製緩衝區中offset到offset數據
master 收到+CONTINUE
保存master的offset
接受信息後,執行bgrewriteaof,恢復數據
心跳機制
進入命令傳播階段,master與slave間需要進行信息交換,使用心跳機制進行維護,實現雙方保持在線
master心跳:
●指令:ping
●週期:由repl-ping-slave-period,默認10s
●作用:判斷slave是否在線
●查詢:INFO replication 獲取slave最後一次連接時間間隔,lag項維持在0或者1視爲正常
●slave心跳任務
●指令:REPLCONF ACK{offset}
●週期:一秒
●作用1:彙報slave自己的複製偏移量,獲取最新的數據變更指令
●作用2:判斷master是否在線
當slave多數掉線,或延遲過高時,master爲保障數據穩定性,將拒絕所有信息同步
min-slaves-to-write 2
min-slaves-max-lag 9
slave數量小於2個,或者所有slave的延遲都大於等於10s時,強制關閉master寫功能,停止數據同步。
哨兵簡介
主機宕機
將宕機的master下線
找一個slave作爲master
通知所有的slave連接新的master
啓動新的master與slave
全量複製*N+部分複製*N
哨兵
哨兵是一個分佈式系統,用於對主從結構中每臺服務器進行監控,當出現故障時通過投票機制選擇新的master來和slave相連
哨兵的作用
●監控
不斷的檢查master和slave是否正常運行
master存活檢測,master與slave運行情況檢測
●通知(提醒)
當被監控的服務器出現問題時,向其他(哨兵間,客戶端)發送通知。
●自動故障轉移
斷開master與slave鏈接,選取一個slave作爲master,將其他slave連接到新的master,並告知客戶端新的服務器地址
注意:哨兵也是一臺redis服務器,只是不提供數據服務
通常哨兵配置數量爲單數
哨兵工作原理
階段一:監控階段
●獲取各個sentinel的狀態(是否在線)
●獲取master的狀態
●master屬性
●runid
●role:master
●各個slave的詳細信息
●獲取所有slave的狀態(根據master中的slave信息)
●slave屬性
●runid
●role:slave
●master_host、master_port
●offset
哨兵會向master slave sentinal要信息,然後所有的哨兵組成圈子互相傳遞信息
哨兵會一直通知master,salve 發送hello,判斷是否在正常工作
如果一直沒有迴應,然後通知sentinal圈子這個設備掛了,其他的sentinel也發送hello,
如果發現這個哨兵說的沒錯,這個master確實掛了
階段三:故障轉移階段
所有的sentinel參與投票 選出處決者的角色 從備選的slave找出可以替代的master
有下面的四個原則
●在線的
●響應慢的
●與原master斷開時間久的
●優先原則
●優先級
●offset
●runid