redis相關知識點

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章