Redis重點特性DevOps
延遲
因為Redis是個單執行緒模型,客戶端過來的命令是按照順序執行的。因此網路問題、慢命令會造成阻塞導致redis效能下降。
如果發生命令阻塞就可以看到每秒命令處理數在明顯下降。要分析解決這個效能問題,需要跟蹤命令處理數的數量和延遲時間。
降低延遲的幾個技巧:
- 使用多引數命令
若是客戶端在很短的時間內傳送大量的命令過來,會發現響應時間明顯變慢,這由於後面命令一直在等待佇列中前面大量命令執行完畢。因此我們可以使用單命令多引數的方式,來減少操作。例如mset
mget hmset hmget等。 - 管道拼接,降低網路延遲
- 避免操作大集合的慢命令
1. 檢視redis延遲時間
$redis-cli.exe -c -h 127.0.0.1 -p 6379 --latency
min: 0, max: 4, avg: 0.26 (11889 samples)
本客戶端操作的平均延遲是260μs
2. 查詢慢日誌
$redis-cli.exe -h 127.0.0.1 -p 6379 slowlog get
1) 1) (integer) 2 #日誌的唯一識別符號
2) (integer) 1550406289 #被記錄命令的執行時間點,以 UNIX 時間戳格式表示
3) (integer) 14920 #查詢執行時間,以微秒為單位。例子中命令使用14毫秒。
4) 1) "CONFIG" #)執行的命令,以陣列的形式排列。
2) "set"
3) "maxclients"
4) "10000"
2) 1) (integer) 1
2) (integer) 1550404443
3) (integer) 43756
4) 1) "keys"
2) "*"
3) 1) (integer) 0
2) (integer) 1550403651
3) (integer) 41940
4) 1) "keys"
2) "*"
連線
因為Redis是單執行緒模型(只能使用單核),來處理所有客戶端的請求, 但由於客戶端連線數的增長,處理請求的執行緒資源開始降低分配給單個客戶端連線的處理時間,這時每個客戶端需要花費更多的時間去等待Redis共享服務的響應。
因為Redis是單執行緒模型(只能使用單核),來處理所有客戶端的請求,且Redis預設允許客戶端連線的最大數量是10000。若是看到連線數超過5000以上,那可能會影響Redis的效能。因此監控客戶端連線數是非常重要的,因為客戶端建立連線數的數量可能超出預期的數量,也可能是客戶端端沒有有效的釋放連線。
相關配置項:
maxclients 10000
tcp-backlog 10240 #TCP 監聽的最大容納數量 預設511
記憶體
使用redis經常會因為memory引發一些列的問題。像因為記憶體交換產生的效能問題以及延遲問題等。可以通過一下幾種方式來減少redis記憶體交換的發生
- 使用Hash
Redis在儲存小於100個欄位的Hash結構上,其儲存效率是非常高的。官方也建議我們儘可能多的使用Hash儲存。Hash的操作命令是HSET(key,
fields, value)和HGET。 - 設定key的過期時間
- 回收key
設定要maxmemory,切redis例項啟用了rdb功能就需要將maxmemory設定為系統可使用記憶體的45%,因為快照時需要一倍的記憶體來複制整個資料集,也就是說如果當前已使用45%,在快照期間會變成95%(45%+45%+5%),其中5%是預留給其他的開銷。如果沒開啟快照功能,maxmemory最高能設定為系統可用記憶體的95%。
當記憶體使用達到設定的最大閥值時,需要選擇一種key的回收策略,即配置檔案中的maxmemory-policy欄位設定
若是Redis資料集中的key都設定了過期時間,那麼volatile-ttl策略是比較好的選擇。但如果key在達到最大記憶體限制時沒能夠迅速過期,或者根本沒有設定過期時間。那麼設定為allkeys-lru值比較合適,它允許Redis從整個資料集中挑選最近最少使用的key進行刪除(LRU淘汰演算法)。
Redis還提供了一些其他淘汰策略,如下:
volatile-lru:使用LRU演算法從已設定過期時間的資料集合中淘汰資料。
volatile-ttl:從已設定過期時間的資料集合中挑選即將過期的資料淘汰。
volatile-random:從已設定過期時間的資料集合中隨機挑選資料淘汰。
allkeys-lru:使用LRU演算法從所有資料集合中淘汰資料。 allkeys-random:從資料集合中任意選擇資料淘汰。
no-enviction:禁止淘汰資料。
通過設定maxmemory為系統可用記憶體的45%或95%(取決於持久化策略)和設定maxmemory-policy為volatile-ttl或allkeys-lru(取決於過期設定),可以比較準確的限制Redis最大記憶體使用率,在絕大多數場景下使用這2種方式可確保Redis不會進行記憶體交換。倘若你擔心由於限制了記憶體使用率導致丟失資料的話,可以設定noneviction值禁止淘汰資料。
另外一定要配置
/proc/sys/vm/min_free_kbytes 讓系統及時回收記憶體
echo 102400 > /proc/sys/vm/min_free_kbytes 設定100m開始回收記憶體
相關文章
- JDK1.8最新特性--Lambda表示式(重點)JDK
- Redis 精確去重計數 —— 咆哮點陣圖Redis
- Redis 高階特性 Redis Stream使用Redis
- Redis高階特性Redis
- Redis5 的新特性 Redis StreamRedis
- Redis5.0 新特性Redis
- Redis GEO 特性簡介Redis
- Redis客戶端連線數DevOpsRedis客戶端dev
- Redis開發與運維.1.2 Redis特性Redis運維
- Redis去重方法Redis
- 重溫redis命令Redis
- 實施DevOps的痛點dev
- Redis 基礎特性講解Redis
- redis重啟指令碼Redis指令碼
- Redis基礎:redis特點Redis
- web前端技巧-ES6新特性與重點知識彙總(二)Web前端
- web前端技巧-ES6新特性與重點知識彙總(三)Web前端
- web前端技巧-ES6新特性與重點知識彙總(一)Web前端
- 深入理解 Redis 新特性:StreamRedis
- redis 帶密碼重啟Redis密碼
- Java 8新特性:字串去重Java字串
- 雲海再獲中國第一 OpenStack社群Xena版本新特性快來劃重點
- Redis 7.0 新功能新特性總覽Redis
- Redis4.0的新特性介紹Redis
- Redis知識點Redis
- redis測試點Redis
- 面試重點:webpack面試Web
- 九、JDBC(重點)JDBC
- DevOps vs. Agile有什麼共同點?dev
- DevOps知識點——3C知多少dev
- 開啟 DevOps之旅,有哪些關鍵點?dev
- 資料結構之Redis應用~常用命令~應用場景(重點)資料結構Redis
- 11.03:Redis持久化、主從、哨兵、叢集、常見問題重點回顧Redis持久化
- Zookeeper 節點特性介紹
- redis多例項重啟指令碼薦Redis指令碼
- Soul暫停IPO:看點、重點、缺點
- 事關企業安全,DevOps被 “點名”了dev
- Ajax學習(重點)