一.Rdis客戶端
1.輸入、輸出緩沖區(qū)
每個客戶端都有輸入緩沖區(qū),用來臨時保存命令,大小不超過1G,過多過大的內(nèi)存會造成oom,info命令和client list命令可以查看客戶端的緩沖區(qū)情況。
輸出緩沖區(qū)可配,超出大小會關閉客戶端連接,輸出緩沖區(qū)分為三種,可以適當增加salve節(jié)點的輸出緩沖區(qū)
2.客戶端的age和idle
分別代表已連接的時間和最近一次空閑的時間??臻e時間不宜太長。
3.最大連接數(shù)和timeout
超過最大空閑時間timeout,連接自動關閉,jedis連接池可以設置最小空閑時間、空閑檢測和空閑檢測的周期。
4.monitor
可以用來實時監(jiān)控其他客戶端在執(zhí)行的命令,但是如果并發(fā)量大,monitor客戶端輸出緩沖區(qū)會暴漲。
二.Rdis復制
redis復制的主從流程:
1.執(zhí)行saveof后保存主節(jié)點信息,ip、端口
2.建立網(wǎng)絡連接
3.從節(jié)點發(fā)起ping命令,主節(jié)點回復pong命令
4.權限驗證
5.開始同步數(shù)據(jù)集,從節(jié)點發(fā)送psync命令,psync包含runid(主redis的id)和偏移量,第一次發(fā)送偏移量為-1,runId為?
6.進行全量同步,主節(jié)點電泳bgsave命令保存rdb文件發(fā)給從節(jié)點,期間新出現(xiàn)的寫命令操作存到replication buffer里面,從服務器加載完rdb文件后,主服務將replication buffer記錄的命令發(fā)給從。同步期間replication buffer滿了會導致連接斷開,刪除緩存,從節(jié)點重新連接,重新開始全量復制
7.后續(xù)對主節(jié)點的寫則是通過命令傳播了
這里有個增量復制的優(yōu)化,如果主從網(wǎng)絡斷開,主服務器會把新的命令發(fā)給從的同時,會寫入repl_backlog_buffer緩沖區(qū)里面,主從都會存一個偏移量的指針,網(wǎng)絡回復后通過指針去緩沖區(qū)里面找,如果找不到,全量同步。
主從復制的時間花費:主服務的存儲rdb,傳輸rdb,從清空數(shù)據(jù),從加載rdb,從如果開啟了aof還會重寫aof
主從之間有心跳機制,主服務默認10sping一次從,從服務每一秒發(fā)一次replconf ack給主服務,上報偏移量用于檢測數(shù)據(jù)是否丟失。
三.Rdis阻塞原因
1.慢查詢,主要可能是操作大key
2.cpu,若redis綁定了cpu,在aof、rdb重寫時,只有一個cpu,重寫會占90%的cpu。另外,不要把redis和cpu密集型的服務部署在一起。
3.磁盤io瓶頸
4.aof重寫,rdb備份時會fork一個子進程,共享父進程的內(nèi)存,但會單獨拷貝一個內(nèi)存頁,如果內(nèi)存過大,fork會很耗時,因此建議單個redis內(nèi)存不要超過10G。另外如果子進程工作期間,父進程修改了大key,發(fā)生寫時復制,也會導致主進程阻塞。
5.aof的刷盤機制選擇了always
6.aof設置每秒刷盤一次,會檢測上一次刷盤的耗時,超過兩秒,會阻塞主線程直到刷盤完成。
7.設置足夠的內(nèi)存,防止發(fā)生內(nèi)存交換的現(xiàn)象
8.網(wǎng)絡原因
四.Rdis內(nèi)存
1.分為對象占用內(nèi)存,實際占用內(nèi)存,內(nèi)存碎片等等
2.可設置redis內(nèi)存上限
3.redis定時、惰性刪除過期值,其中定時刪除的邏輯是每個數(shù)據(jù)庫空間隨機檢查20個鍵->是否超過20%過期->執(zhí)行超過25毫秒進入快模式
4.建議redis運行在maxmermory>used_memory環(huán)境下,否則頻繁是用回收會降低性能。
5.內(nèi)存優(yōu)化:鍵不要寫太長的字符串,對值可以采用壓縮算法。redis還有一個內(nèi)存共享的策略,共享1-9999的常數(shù),但是在lru淘汰策略下會失效。