關於Redis監控
什麼是Redis?
Remote Dictionary Server(Redis) 遠程字典服務器是完全開源免費的,用C語言編寫的,遵守BSD開源協議,Redis是一個高性能的(key/value)分佈式內存數據庫,基於內存運行,並支持持久化的NoSQL數據庫,它也通常被稱爲數據結構服務器,因爲值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等類型。
Redis特點:
-
性能極高 – Redis讀的速度是11W次/s,寫的速度是81K次/s(Redis 的數據是存在內存中,存寫速度非常快)
-
支持持久化,將內存中的數據保存在磁盤中,重啓可以再次加載使用。
-
豐富的數據類型,Redis不僅僅支持簡單的key-value類型的數據,同時還提供Strings, Lists, Hashes, Sets 及 Ordered Sets 等數據結構的存儲。
-
支持數據的備份,即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機。和緩存擊穿不同的是,緩存擊穿指併發查同一條數據,緩存雪崩是不同數據都過期了,很多數據都查不到從而查數據庫。
解決方案:
-
緩存預熱就是系統上線後,將相關的緩存數據直接加載到緩存系統。這樣就可以避免在用戶請求的時候,先查詢數據庫,然後再將數據緩存的問題。
-
設置不同的過期時間,讓緩存失效的時間點儘量均勻。
-
設置熱點數據永遠不過期。