一 介紹
redis是一個(gè)開源的搞疗,可基于內(nèi)存也可持久化的日志型嗓蘑、KEY-VALUE數(shù)據(jù)庫,并提供多種語言的API的非關(guān)系型數(shù)據(jù)庫匿乃。傳統(tǒng)數(shù)據(jù)庫遵循ACID桩皿。而Nosql(NOT only sql)是不同于傳統(tǒng)的關(guān)系型數(shù)據(jù)庫的數(shù)據(jù)庫管理系統(tǒng),遵循CAP定理幢炸。
二 Redis支持的數(shù)據(jù)類型
1泄隔、String 字符串:格式 set key value? ?#redis的String可以包含任何數(shù)據(jù)。比如jpg圖片或者序列化的對(duì)象宛徊。String類型是redis最基本的數(shù)據(jù)類型佛嬉,一個(gè)鍵最大能存儲(chǔ)512MB。
2闸天、hash 哈希:格式:hmset name key1 value1 key2 value2 #redis是一個(gè)鍵值對(duì)集合暖呕。redis hash 是一個(gè)String類型的feild和value的映射表,hash 特別適用于存儲(chǔ)對(duì)象苞氮。
3湾揽、List 列表:簡單的字符串列表,按照插入順序排列。添加一個(gè)元素到列表的頭部(左邊)或者尾部(右邊)库物,
lpush name value? ?#在key 對(duì)應(yīng)list的頭部添加字符串元素??
rpush name value? #在key對(duì)應(yīng)list的尾部添加字符串元素
lrem name index key #對(duì)應(yīng)list中刪除 count個(gè)和value相同的元素
llen name #返回key對(duì)應(yīng)list的長度
4霸旗、Set 集合: sadd name value? redis的set是String類型無序集合。集合是通過哈希表實(shí)現(xiàn)的戚揭,所以添加定硝、刪除,查找的復(fù)雜度都是O(1)毫目。
5蔬啡、Zset 有序集合 : zadd name score value #redis zset和set 一樣,也是String類型元素的集合镀虐,且不允許重復(fù)箱蟆。不同的是每個(gè)元素都會(huì)關(guān)聯(lián)一個(gè)double 類型的分?jǐn)?shù)。redis 正是通過分?jǐn)?shù)來為集合中的成員進(jìn)行從小到大的排序刮便。zset的成員是唯一的空猜,但分?jǐn)?shù)(score)是可以重復(fù)的。
三 持久化
持久化就是把內(nèi)存的數(shù)據(jù)寫到磁盤中去恨旱,防止服務(wù)器宕機(jī)了內(nèi)存數(shù)據(jù)丟失辈毯。
redis提供了2種持久化方案:RDB(默認(rèn))和AOF :
rdb是redis Database縮寫 功能核心函數(shù) rdbsave (生成RDB文件)和rdbLoad(從文件加在內(nèi)存)兩個(gè)函數(shù)
AOF是 Append only file縮寫 每當(dāng)執(zhí)行服務(wù)器(定時(shí))任務(wù)或者函數(shù)時(shí)flushAppendOnlyFile函數(shù)都會(huì)被調(diào)用,這個(gè)函數(shù)執(zhí)行以下兩個(gè)工作搜贤,aof寫入保存:write #根據(jù)條件谆沃,將aof-buf中的緩存寫入到AOF文件; save #根據(jù)條件仪芒,調(diào)用fsync或者fdatasync函數(shù)唁影,將AOF文件保存到磁盤中。存儲(chǔ)結(jié)構(gòu):內(nèi)容為redis 通訊協(xié)議(RESP)格式的命令文本存儲(chǔ)掂名。
四 RESP 据沈?
五? Redis架構(gòu)模式
單機(jī)版
特點(diǎn):簡單
缺點(diǎn):1、內(nèi)存容量有限饺蔑;2锌介、處理能力有限 ;3猾警、無法高可用
集群:主從復(fù)制
redis的復(fù)制(replication)功能允許用戶根據(jù)一個(gè)redis服務(wù)器來創(chuàng)建任意多個(gè)該服務(wù)器的復(fù)制品孔祸,其中被復(fù)制的服務(wù)器為主服務(wù)器(master),而通過復(fù)制創(chuàng)建出來的服務(wù)器復(fù)制品則為從服務(wù)器(slave)肿嘲。只要主從服務(wù)器之間的網(wǎng)絡(luò)鏈接正常融击,主從服務(wù)器兩者會(huì)具有相同的數(shù)據(jù),主服務(wù)器就會(huì)一只將發(fā)生在自己的數(shù)據(jù)更新同步給從服務(wù)器雳窟,從而一只保證主從服務(wù)器的數(shù)據(jù)相同。
特點(diǎn):master/slave 角色;master/slave 數(shù)據(jù)相同封救;降低master讀壓力拇涤,轉(zhuǎn)交到從庫
缺點(diǎn):1、有單點(diǎn)問題誉结,無法保證高可用鹅士;2、沒有解決master的寫能力惩坑;
哨兵:
redis sentinel是一個(gè)分布式系統(tǒng)中監(jiān)控 redis 主從服務(wù)器掉盅,并在主服務(wù)器下線時(shí)自動(dòng)進(jìn)行故障轉(zhuǎn)移。有3個(gè)特性:
監(jiān)控(Monitoring):sentinel會(huì)不斷的檢查你的主服務(wù)器和從服務(wù)器是否運(yùn)行正常以舒。
提醒(Notification):當(dāng)被監(jiān)控的某個(gè)redis服務(wù)器出現(xiàn)問題時(shí)趾痘,Sentinel可以通過API向管理員或者其他應(yīng)用程序發(fā)送通知。
自動(dòng)故障遷移(Automatic failover):當(dāng)一個(gè)主服務(wù)器不能正常工作時(shí)蔓钟,Sentinel會(huì)開始一次自動(dòng)故障遷移操作永票。
特點(diǎn):1、保證高可用滥沫;2侣集、監(jiān)控各個(gè)節(jié)點(diǎn);3兰绣、自動(dòng)故障遷移
缺點(diǎn):主從模式世分,切換需要時(shí)間丟數(shù)據(jù);沒有解決master寫的壓力
集群:代理模式
twemproxy是一個(gè)Twitter開源的一個(gè)redis和memcache快速/輕量級(jí) 代理服務(wù)器缀辩;Twemproxy是一個(gè)快速的單線程代理程序罚攀,支持Memcached ASCII 協(xié)議和redis協(xié)議
特點(diǎn):1、多種hash算法:MD5雌澄、CRC16斋泄、CRC32、CRC32a镐牺、hsieh等炫掐;2、支持失敗節(jié)點(diǎn)自動(dòng)刪除睬涧;3募胃、后端sharding分片邏輯對(duì)業(yè)務(wù)透明,業(yè)務(wù)方的讀寫方式和操作單個(gè)redis一致
缺點(diǎn):1畦浓、增加了新的proxy痹束,需要維護(hù)其高可用;2讶请、failover邏輯需要自己實(shí)現(xiàn)祷嘶,其本身不能支持故障的自動(dòng)轉(zhuǎn)移,可擴(kuò)展性差,進(jìn)行擴(kuò)展都需要手動(dòng)干預(yù)论巍;
集群:直連型
從redis 3.0之后版本支持redis-cluster 集群烛谊,redis-cluster 采用無中心結(jié)構(gòu),每個(gè)節(jié)點(diǎn)保存數(shù)據(jù)和整個(gè)集群狀態(tài)嘉汰,每個(gè)節(jié)點(diǎn)都和其他所有節(jié)點(diǎn)連接丹禀。
特點(diǎn):
1、無中心架構(gòu)(不存在哪個(gè)節(jié)點(diǎn)影響性能瓶頸)鞋怀,少了proxy層双泪。
2、數(shù)據(jù)按照slot存儲(chǔ)分布在多個(gè)節(jié)點(diǎn)密似,節(jié)點(diǎn)間數(shù)據(jù)共享焙矛,可動(dòng)態(tài)調(diào)整數(shù)據(jù)分布。
3辛友、可擴(kuò)展性薄扁,可線性擴(kuò)展到1000個(gè)節(jié)點(diǎn),節(jié)點(diǎn)可動(dòng)態(tài)添加或刪除废累。
4邓梅、高可用,部分節(jié)點(diǎn)不可用時(shí)邑滨,集群仍可用日缨。通過增加slave 做備份數(shù)據(jù)副本。
5掖看、實(shí)現(xiàn)故障自動(dòng)failover匣距,節(jié)點(diǎn)之間通過gossip協(xié)議交換狀態(tài)信息,用投票機(jī)制完成slave到master的角色提升哎壳。
缺點(diǎn):
1毅待、資源隔離性較差,容易出現(xiàn)相互影響的情況归榕。
2尸红、數(shù)據(jù)通過異步復(fù)制,不保證數(shù)據(jù)的強(qiáng)一致性刹泄。