《Redis开发与运维》读书笔记
1、?數(shù)據(jù)結(jié)構(gòu)
字符串、哈希(hash)、列表(list)、集合(set)、有序集合
?
2、?Redis為什么單線程還能這么快
第一,純內(nèi)存訪問(wèn),Redis將所有數(shù)據(jù)放在內(nèi)存中,內(nèi)存的響應(yīng)時(shí)長(zhǎng)大約為100納秒,這是Redis達(dá)到每秒萬(wàn)級(jí)別訪問(wèn)的重要基礎(chǔ)。
第二,非阻塞I/O,Redis使用epoll作為I/O多路復(fù)用技術(shù)的實(shí)現(xiàn),再加上Redis自身的事件處理模型將epoll中的連接、讀寫(xiě)、關(guān)閉都轉(zhuǎn)換為事件,不在網(wǎng)絡(luò)I/O上浪費(fèi)過(guò)多的時(shí)間
第三,單線程避免了線程切換和競(jìng)態(tài)產(chǎn)生的消耗。
?
3、慢查詢配置
?????? 主要兩個(gè)參數(shù)為slowlog-log-slower-than和slowlog-max-len,慢查詢不包含命令網(wǎng)絡(luò)傳輸和排隊(duì)時(shí)間,有必要將慢查詢定期存放。
?
4、持久化
?????? 1)Redis提供了兩種持久化方式:RDB和AOF。
2)RDB使用一次性生成內(nèi)存快照的方式,產(chǎn)生的文件緊湊壓縮比更高,因此讀取RDB恢復(fù)速度更快。由于每次生成RDB開(kāi)銷(xiāo)較大,無(wú)法做到實(shí)時(shí)持久化,一般用于數(shù)據(jù)冷備和復(fù)制傳輸。
3)save命令會(huì)阻塞主線程不建議使用,bgsave命令通過(guò)fork操作創(chuàng)建子進(jìn)程生成RDB避免阻塞。
4)AOF通過(guò)追加寫(xiě)命令到文件實(shí)現(xiàn)持久化,通過(guò)appendfsync參數(shù)可以控制實(shí)時(shí)/秒級(jí)持久化。因?yàn)樾枰粩嘧芳訉?xiě)命令,所以AOF文件體積逐漸變大,需要定期執(zhí)行重寫(xiě)操作來(lái)降低文件體積。
5)AOF重寫(xiě)可以通過(guò)auto-aof-rewrite-min-size和auto-aof-rewrite-percentage參數(shù)控制自動(dòng)觸發(fā),也可以使用bgrewriteaof命令手動(dòng)觸發(fā)。
?
5、Redis阻塞
1)阻塞的內(nèi)在原因:確認(rèn)主線程是否存在阻塞,檢查慢查詢等信息,發(fā)現(xiàn)不合理使用API或數(shù)據(jù)結(jié)構(gòu)的情況,如keys、sort、hgetall等。關(guān)注CPU使用率防止單核跑滿。當(dāng)硬盤(pán)IO資源緊張時(shí),AOF追加也會(huì)阻塞主線程。
2)阻塞的外在原因:從CPU競(jìng)爭(zhēng)、內(nèi)存交換、網(wǎng)絡(luò)問(wèn)題等方面入手排查是否因?yàn)橄到y(tǒng)層面問(wèn)題引起阻塞。
?
6、內(nèi)存
?????? 當(dāng)Redis內(nèi)存不足時(shí),首先考慮的問(wèn)題不是加機(jī)器做水平擴(kuò)展,應(yīng)該先嘗試做內(nèi)存優(yōu)化,當(dāng)遇到瓶頸時(shí),再去考慮水平擴(kuò)展。即使對(duì)于集群化方案,垂直層面優(yōu)化也同樣重要,避免不必要的資源浪費(fèi)和集群化后的管理成本。
?
1)Redis實(shí)際內(nèi)存消耗主要包括:鍵值對(duì)象、緩沖區(qū)內(nèi)存、內(nèi)存碎片。
2)通過(guò)調(diào)整maxmemory控制Redis最大可用內(nèi)存。當(dāng)內(nèi)存使用超出時(shí),根據(jù)maxmemory-policy控制內(nèi)存回收策略。
3)內(nèi)存是相對(duì)寶貴的資源,通過(guò)合理的優(yōu)化可以有效地降低內(nèi)存的使用量,內(nèi)存優(yōu)化的思路包括:
·精簡(jiǎn)鍵值對(duì)大小,鍵值字面量精簡(jiǎn),使用高效二進(jìn)制序列化工具。
·使用對(duì)象共享池優(yōu)化小整數(shù)對(duì)象。
·數(shù)據(jù)優(yōu)先使用整數(shù),比字符串類(lèi)型更節(jié)省空間。
·優(yōu)化字符串使用,避免預(yù)分配造成的內(nèi)存浪費(fèi)。
·使用ziplist壓縮編碼優(yōu)化hash、list等結(jié)構(gòu),注重效率和空間的平衡。
·使用intset編碼優(yōu)化整數(shù)集合。
·使用ziplist編碼的hash結(jié)構(gòu)降低小對(duì)象鏈規(guī)模。
?
7、緩存設(shè)計(jì)
1)緩存的更新策略
低一致性業(yè)務(wù)建議配置最大內(nèi)存和淘汰策略的方式使用。
高一致性業(yè)務(wù)可以結(jié)合使用超時(shí)剔除和主動(dòng)更新,這樣即使主動(dòng)更新
出了問(wèn)題,也能保證數(shù)據(jù)過(guò)期時(shí)間后刪除臟數(shù)據(jù)。
?
?????? 2)緩存粒度控制
?
?????? 3)穿透優(yōu)化
?????? 4)雪崩優(yōu)化
a.在緩存失效后,通過(guò)加鎖或者隊(duì)列來(lái)控制讀數(shù)據(jù)庫(kù)寫(xiě)緩存的線程數(shù)量。比如對(duì)某個(gè)key只允許一個(gè)線程查詢數(shù)據(jù)和寫(xiě)緩存,其他線程等待。
b.可以通過(guò)緩存reload機(jī)制,預(yù)先去更新緩存,再即將發(fā)生大并發(fā)訪問(wèn)前手動(dòng)觸發(fā)加載緩存
c.不同的key,設(shè)置不同的過(guò)期時(shí)間,讓緩存失效的時(shí)間點(diǎn)盡量均勻
d.做二級(jí)緩存,或者雙緩存策略。A1為原始緩存,A2為拷貝緩存,A1失效時(shí),可以訪問(wèn)A2,A1緩存失效時(shí)間設(shè)置為短期,A2設(shè)置為長(zhǎng)期。
?
8、最大內(nèi)存及策略
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的《Redis开发与运维》读书笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: win7删除便笺
- 下一篇: SQL Server 2012自动备份