關於Redis監控及緩存相關問題

關於Redis監控

什麼是Redis?

Remote Dictionary Server(Redis) 遠程字典服務器是完全開源免費的,用C語言編寫的,遵守BSD開源協議,Redis是一個高性能的(key/value)分佈式內存數據庫,基於內存運行,並支持持久化的NoSQL數據庫,它也通常被稱爲數據結構服務器,因爲值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等類型。

Redis特點:

  1. 性能極高 – Redis讀的速度是11W次/s,寫的速度是81K次/s(Redis 的數據是存在內存中,存寫速度非常快)

  2. 支持持久化,將內存中的數據保存在磁盤中,重啓可以再次加載使用。

  3. 豐富的數據類型,Redis不僅僅支持簡單的key-value類型的數據,同時還提供Strings, Lists, Hashes, Sets 及 Ordered Sets 等數據結構的存儲。

  4. 支持數據的備份,即master-slave模式的數據備份。

Redis使用場景

查詢出的數據保存到Redis中,下次查詢的時候直接從Redis中拿到數據。不用和數據庫進行交互,減輕數據庫壓力。

 

 

Redis性能指標:Performance

名稱 描述
latency Redis響應一個請求的時間
instantaneous_ops_per_sec 平均每秒處理請求總數
hi rate(calculated) 緩存命中率(計算出來的

Redis內存指標: Memory

名稱 描述
used_memory 已使用內存
mem_fragmentation_ratio 內存碎片率
evicted_keys 由於最大內存限制被移除的key的數量
blocked_clients 由於BLPOP,BRPOP,or BRPOPLPUSH而備阻塞的客戶端

Redis基本活動指標:Basic activity

名稱 描述
connected_clients 客戶端連接數
conected_laves slave數量
master_last_io_seconds_ago 最近一次主從交互之後的秒數
keyspace 數據庫中的key值總數

Redis持久性指標: Persistence

名稱 描述
rdb_last_save_time 最後一次持久化保存磁盤的時間戳
rdb_changes_sice_last_save 自最後一次持久化以來數據庫的更改數

Redis錯誤指標:Error

名稱 描述
rejected_connections 由於達到maxclient限制而被拒絕的連接數
keyspace_misses key值查找失敗(沒有命中)次數
master_link_down_since_seconds 主從斷開的持續時間(以秒爲單位)

Redis監控方式

redis-benchmark

redis-stat

redis-faina

redislive

monitor

showlog

 

redis-cli

性能監控:

redis-cli info | grep ops # 每秒操作數

內存監控:

Redis消耗的資源
# ./redis-cli info | grep used | grep human       
used_memory_human:2.99M  # 內存分配器從操作系統分配的內存總量
used_memory_rss_human:8.04M  #操作系統看到的內存佔用,top命令看到的內存
used_memory_peak_human:7.77M # redis內存消耗的峯值
used_memory_lua_human:37.00K   # lua腳本引擎佔用的內存大小
​
由於BLPOP,BRPOP,or BRPOPLPUSH而備阻塞的客戶端
# ./redis-cli info | grep blocked_clients
blocked_clients:0  
​
由於最大內存限制被移除的key的數量
# ./redis-cli info | grep evicted_keys
evicted_keys:0  #
​
Redis內存碎片率
./redis-cli info | grep mem_fragmentation_ratio
mem_fragmentation_ratio:2.74 
​
Redis已使用內存
# ./redis-cli info | grep used_memory:
used_memory:3133624  
​
Redis由於超出最大連接數限制而被拒絕的客戶端連接次數,如果這個數字很大,則意味着服務器的最大連接數設置得過低,需要調整maxclients
# ./redis-cli info | grep connected_clients
connected_clients:1
​
Redis key值查找失敗(沒有命中)次數
# ./redis-cli info | grep keyspace
keyspace_misses:0   
​
Redis主從斷開的持續時間(以秒爲單位)
# ./redis-cli info | grep rdb_changes_since_last_save
rdb_changes_since_last_save:0  
​
複製積壓緩衝區如果設置得太小,會導致裏面的指令被覆蓋掉而找不到偏移量,從而觸發全量同步
# ./redis-cli info | grep backlog_size
repl_backlog_size:1048576
​
Redis通過查看sync_partial_err變量的次數來決定是否需要擴大積壓緩衝區,它表示主從半同步複製失敗的次數
# ./redis-cli info | grep sync_partial_err
sync_partial_err:1
​
​

1.get:獲取慢查詢日誌

2.len:獲取慢查詢日誌條目數

3.reset:重置慢查詢日誌

Redis命令交互

slowlog-log-slower-than 1000 # 設置慢查詢的時間下線,單位:微秒
slowlog-max-len 100 # 設置慢查詢命令對應的日誌顯示長度,單位:命令數

 

Redis info命令使用

 

1.server:服務器運行的環境參數
2.clients:客戶端相關信息
3.memory:服務器運行內存統計數據
4.persistence:持久化信息
5.stats:通用統計數據
6.Replication:主從複製相關信息
7.CPU:CPU使用情況
8.cluster:集羣信息
9.Keypass:鍵值對統計數量信息
​
##命令格式
#./redis-cli info 按塊獲取信息 | grep 需要過濾的參數
例
#./redis-cli info stats | grep ops
​
 #./redis-cli 
> info server
​

 

Redis性能測試命令

#./redis-benchmark -c 100 -n 5000  #說明:100個連接,5000次請求對應的性能

 

關於緩存的幾個問題

緩存穿透

描述:

故意去請求緩存中不存在的數據,從而去數據庫中查,數據庫中也沒有,所以無法加到緩存,下次還是直接查詢數據庫,所以高併發的時候就導致數據庫崩了。

解決方案:

1)利用互斥鎖,緩存失效的時候,先去獲得鎖,得到鎖了,再去請求數據庫。沒得到鎖,則休眠一段時間重試。

2)數據庫沒查到數據,也往緩存中寫入一個空值,但是設置失效時間短一點,防止惡意攻擊。

緩存擊穿

描述:

緩存擊穿是指緩存中沒有但數據庫中有的數據,緩存的數據剛好過期(失效),這時併發用戶特別多,同時讀緩存沒讀到數據,直接在數據庫去取數據,引起數據庫壓力瞬間增大,造成過大壓力 ,可能導致數據庫崩潰。

 

解決方案:

1、當多個線程同時去查詢數據庫的這條數據,那麼我們可以在第一個查詢數據的請求上使用一個互斥鎖來鎖住它 ,其他的線程走到這一步拿不到鎖就等着,等第一個線程查詢到了數據,然後做緩存。後面的線程進來發現已經有緩存了,就直接走緩存

2、可以將爆款的緩存失效時間設置爲永久。

 

緩存雪崩

描述:

緩存雪崩是指緩存中數據大批量到過期時間,而大量查詢打到數據庫上,引起數據庫壓力過大甚至down機。和緩存擊穿不同的是,緩存擊穿指併發查同一條數據,緩存雪崩是不同數據都過期了,很多數據都查不到從而查數據庫。

 

解決方案:

  1. 緩存預熱就是系統上線後,將相關的緩存數據直接加載到緩存系統。這樣就可以避免在用戶請求的時候,先查詢數據庫,然後再將數據緩存的問題。

  2. 設置不同的過期時間,讓緩存失效的時間點儘量均勻。

  3. 設置熱點數據永遠不過期。

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