最近看完了《Redis開發(fā)與運(yùn)維》分享給大家。
全面講解Redis基本功能及其應(yīng)用,并結(jié)合線上開發(fā)與運(yùn)維監(jiān)控中的實(shí)際使用案例,深入分析并總結(jié)了實(shí)際開發(fā)運(yùn)維中遇到的“陷阱”,以及背后的原因, 包含大規(guī)模集群開發(fā)與管理的場景、應(yīng)用案例與開發(fā)技巧,為高效開發(fā)運(yùn)維提供了大量實(shí)際經(jīng)驗(yàn)和建議。本書不要求讀者有任何Redis使用經(jīng)驗(yàn),對入門與進(jìn)階DevOps的開發(fā)者提供有價(jià)值的幫助。主要內(nèi)容包括:Redis的安裝配置、API、各種高效功能、客戶端、持久化、復(fù)制、高可用、內(nèi)存、哨兵、集群、緩存設(shè)計(jì)等,Redis高可用集群解決方案,Redis設(shè)計(jì)和使用中的問題,最后提供了一個(gè)開源工具:Redis監(jiān)控運(yùn)維云平臺CacheCloud。
用心之作。唯一個(gè)人認(rèn)為可以再優(yōu)化的是,監(jiān)控軟件的安裝,很多配置都默認(rèn)寫在一些文件,導(dǎo)致自定義安裝目錄時(shí)帶來部分不變,,,但是依然不能妨礙書本身的精品。大力推薦 ,不管是 redis 新手 老手,都能學(xué)到很多。
Redis相關(guān)書籍里面內(nèi)容屬于特別上乘的。書中有好多以前沒有發(fā)現(xiàn)和注意的細(xì)節(jié)點(diǎn),而且內(nèi)容的連貫性,深度等各個(gè)點(diǎn)都寫的非常的好,書中也會提及很多開發(fā)人員對redis認(rèn)知的盲區(qū),該書能更好的讓你做好redis相關(guān)的工作,在授之以魚之時(shí)也授之以漁。最近也作為我強(qiáng)力推薦的一本redis好書在推薦給身邊的朋友看。
初識Redis
單線程面向快速執(zhí)行場景的內(nèi)純數(shù)據(jù)庫
特性
數(shù)據(jù)結(jié)構(gòu):string字符串(位圖bitmaps,hyperloglog),hash哈希表,list列表,set集合,zset有序集合
單線程模型
持久化方式:RDB,AOF
主從復(fù)制
5種數(shù)據(jù)類型
String
字符串類型是Redis最基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)。首先鍵都是字符串類型的, 而且其他幾種數(shù)據(jù)結(jié)構(gòu)都是在字符串的基礎(chǔ)上構(gòu)建的。字符串類型的值實(shí)際可以是字符串(簡單的字符串、復(fù)雜的字符串(JSON/XML等))、數(shù)字(整數(shù)、浮點(diǎn)數(shù))、甚至是二進(jìn)制、但是值最大不能超過512M。
List
類似 Java 中的 List ,按照插入順序排序的字符串鏈表,在插入時(shí),如果該鍵并不存在,Redis將為該鍵創(chuàng)建一個(gè)新的鏈表。與此相反,如果鏈表中所有的元素均被移除,那么該鍵也將會被從數(shù)據(jù)庫中刪除
Set
Set 就是一個(gè)集合,集合的概念就是一堆不重復(fù)值的組合。利用 Redis 提供的 Set 數(shù)據(jù)結(jié)構(gòu),可以存儲一些集合性的數(shù)據(jù)。比如在微博應(yīng)用中,可以將一個(gè)用戶所有的關(guān)注人存在一個(gè)集合中,將其所有粉絲存在一個(gè)集合。因?yàn)?Redis 非常人性化的為集合提供了求交集、并集、差集等操作,那么就可以非常方便的實(shí)現(xiàn)如共同關(guān)注、共同喜好、二度好友等功能,對上面的所有集合操作,你還可以使用不同的命令選擇將結(jié)果返回給客戶端還是存集到一個(gè)新的集合中。
Sorted Set
和Sets相比,Sorted Sets是將 Set 中的元素增加了一個(gè)權(quán)重參數(shù) score,使得集合中的元素能夠按 score 進(jìn)行有序排列,比如一個(gè)存儲全班同學(xué)成績的 Sorted Sets,其集合 value 可以是同學(xué)的學(xué)號,而 score 就可以是其考試得分,這樣在數(shù)據(jù)插入集合的時(shí)候,就已經(jīng)進(jìn)行了天然的排序。另外還可以用 Sorted Sets 來做帶權(quán)重的隊(duì)列,比如普通消息的 score 為1,重要消息的 score 為2,然后工作線程可以選擇按 score 的倒序來獲取工作任務(wù)。讓重要的任務(wù)優(yōu)先執(zhí)行。
Hash
在 Memcached 中,我們經(jīng)常將一些結(jié)構(gòu)化的信息打包成 hashmap,在客戶端序列化后存儲為一個(gè)字符串的值(一般是 JSON 格式),比如用戶的昵稱、年齡、性別、積分等。這時(shí)候在需要修改其中某一項(xiàng)時(shí),通常需要將字符串(JSON)取出來,然后進(jìn)行反序列化,修改某一項(xiàng)的值,再序列化成字符串(JSON)存儲回去。簡單修改一個(gè)屬性就干這么多事情,消耗必定是很大的,也不適用于一些可能并發(fā)操作的場合(比如兩個(gè)并發(fā)的操作都需要修改積分)。而 Redis 的 Hash 結(jié)構(gòu)可以使你像在數(shù)據(jù)庫中 Update 一個(gè)屬性一樣只修改某一項(xiàng)屬性值
全局命令
keys *:查看所有鍵
dbsize:鍵的總數(shù)
exists key:查看鍵是否存在
del key:刪除鍵
expire key seconds:鍵過期
type key::查看鍵的數(shù)據(jù)類型
單線程架構(gòu)
命令到達(dá)服務(wù)端后,按隊(duì)列依次單線程執(zhí)行
純內(nèi)存存儲、 IO多路復(fù)用技術(shù)、單線程架構(gòu)是造就 Redis高性能的三個(gè)因素。
epoll I/O多路復(fù)用提升IO性能
redis快的原因:
純內(nèi)存訪問
I/O多路復(fù)用:epoll
單線程避免線程競爭
keys全量遍歷鍵可能導(dǎo)致redis阻塞,可以在從節(jié)點(diǎn)上執(zhí)行,或者使用漸進(jìn)式的scan代替(可能漏掉期間進(jìn)行的更新)
應(yīng)用場景
緩存。
排行榜系統(tǒng)。redis提供了列表和有序集合支持。
計(jì)數(shù)器應(yīng)用。
社交網(wǎng)絡(luò)。
消息隊(duì)列系統(tǒng)。redis提供了訂閱發(fā)布和阻塞隊(duì)列功能,雖然和專業(yè)的消息隊(duì)列軟件比不夠強(qiáng)大,但是可以滿足一般的消息隊(duì)列需求
Pipeline概念
edis客戶端執(zhí)行一條命令分為如下四個(gè)過程:
1)發(fā)送命令
2)命令排隊(duì)
3)命令執(zhí)行
4)返回結(jié)果其中
1到4稱為 Round Trip Time( RTT,往返時(shí)間)。
Pipeline(流水線)機(jī)制能將一組 Redis命令進(jìn)行組裝,通過一次 RTT傳輸給 Redis,再將這組 Redis命令的執(zhí)行結(jié)果按順序返回給客戶端。
Redis命令真正執(zhí)行的時(shí)間通常在微秒級別,所以才會有 Redis性能瓶頸是網(wǎng)絡(luò)這樣的說法。
持久
-
RDB持久化方式會在一個(gè)特定的間隔保存那個(gè)時(shí)間點(diǎn)的一個(gè)數(shù)據(jù)快照。
AOF持久化方式則會記錄每一個(gè)服務(wù)器收到的寫操作。在服務(wù)啟動時(shí),這些記錄的操作會逐條執(zhí)行從而重建出原來的數(shù)據(jù)。寫操作命令記錄的格式跟Redis協(xié)議一致,以追加的方式進(jìn)行保存。