您好,登錄后才能下訂單哦!
近 期參加了江老師關(guān)于Redis的培訓(xùn),加深了對(duì)Redis數(shù)據(jù)庫(kù)的理解。
●目錄●
一 redis適用場(chǎng)景
二 redis優(yōu)勢(shì)
三 Redis數(shù)據(jù)類型
四 redis持久化
五 redis架構(gòu)
●內(nèi)容●
一 redis適用場(chǎng)景
Redis最適合所有數(shù)據(jù)in-momory的場(chǎng)景,雖然Redis也提供持久化功能,但實(shí)際更多的是一個(gè)disk-backed的功能,跟傳統(tǒng)意義上的持久化有比較大的差別,似乎Redis更像一個(gè)加強(qiáng)版的Memcached。
1 會(huì)話緩存(Session Cache)
最常用的一種使用Redis的情景是會(huì)話緩存(session cache)。用Redis緩存會(huì)話比其他存儲(chǔ)(如Memcached) 的優(yōu)勢(shì)在于:Redis提供持久化。當(dāng)維護(hù)一個(gè)不是嚴(yán)格要求一致性的緩存時(shí),如果用戶的購(gòu)物車信息全部丟失,大部分人都會(huì)不高興的。
2 隊(duì)列
Reids在內(nèi)存存儲(chǔ)引擎領(lǐng)域的一大優(yōu)點(diǎn)是提供 list 和 set 操作,這使得Redis能作為一個(gè)很好的消息隊(duì)列平臺(tái)來(lái)使用。Redis作為隊(duì)列使用的操作,就類似于本地程序語(yǔ)言(如Python)對(duì) list 的 push/pop 操作。
3 全頁(yè)緩存
大型互聯(lián)網(wǎng)公司都會(huì)使用Redis作為緩存存儲(chǔ)數(shù)據(jù),提升頁(yè)面相應(yīng)速度。即使重啟了Redis實(shí)例,因?yàn)橛写疟P的持久化,用戶也不會(huì)看到頁(yè)面加載速度的下降。
4 排行榜/計(jì)數(shù)器
Redis在內(nèi)存中對(duì)數(shù)字進(jìn)行遞增或遞減的操作實(shí)現(xiàn)的非常好。集合(Set)和有序集合(Sorted Set)也使得我們?cè)趫?zhí)行這些操作的時(shí)候變的非常簡(jiǎn)單。
二 Redis優(yōu)勢(shì)
1 性能極高
Redis能讀的速度是110000次/s,寫(xiě)的速度是81000次/s 。
2 豐富的數(shù)據(jù)類型
Redis支持二進(jìn)制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數(shù)據(jù)類型操作。
3 原子
Redis的所有操作都是原子性的,意思就是要么成功執(zhí)行要么失敗完全不執(zhí)行。單個(gè)操作是原子性的。多個(gè)操作也支持事務(wù),即原子性,通過(guò)MULTI和EXEC指令包起來(lái)。
4 豐富的特性
Redis還支持 publish/subscribe, 通知, key 過(guò)期等等特性
MySQL+Memcached 演變 MySQL+Redis
MySQL適合進(jìn)行海量數(shù)據(jù)存儲(chǔ)的,通過(guò)Memcached將熱點(diǎn)數(shù)據(jù)加載到cache,加速訪問(wèn),很多公司都曾經(jīng)使用過(guò)這樣的架構(gòu),但隨著業(yè)務(wù)數(shù)據(jù)量的不斷增加,和訪問(wèn)量的持續(xù)增長(zhǎng),遇到了很多問(wèn)題:
? MySQL需要不斷進(jìn)行拆庫(kù)拆表,Memcached也需不斷跟著擴(kuò)容,擴(kuò)容和維護(hù)工作占據(jù)大量開(kāi)發(fā)時(shí)間。
? Memcached與MySQL數(shù)據(jù)庫(kù)數(shù)據(jù)一致性問(wèn)題。
? Memcached數(shù)據(jù)命中率低或down機(jī),大量訪問(wèn)直接穿透到DB,MySQL無(wú)法支撐。
? 跨機(jī)房cache同步問(wèn)題
如果簡(jiǎn)單地比較Redis與Memcached的區(qū)別,大多數(shù)都會(huì)得到以下觀點(diǎn):
? Redis不僅僅支持簡(jiǎn)單的k/v類型的數(shù)據(jù),同時(shí)還提供list,set,zset,hash等數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)。
? Redis支持?jǐn)?shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份。
? Redis支持?jǐn)?shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保持在磁盤中,重啟的時(shí)候可以再次加載進(jìn)行使用
三 Redis數(shù)據(jù)類型
Redis支持五種數(shù)據(jù)類型:
1 string(字符串)
2 hash(哈希)
3 list(列表)
4 set(集合)
5 zset(sorted set:有序集合)
3.1 string
string 是 redis 最基本的類型,可以理解成與 Memcached 一模一樣的類型,一個(gè) key 對(duì)應(yīng)一個(gè)value。
? string 類型是二進(jìn)制安全的。redis 的 string 可以包含任何數(shù)據(jù)。比如jpg圖片或者序列化的對(duì)象。
? string 類型是 Redis 最基本的數(shù)據(jù)類型,string 類型的值最大能存儲(chǔ) 512MB
? redis 127.0.0.1:6379> SET name ”keyman"
? redis 127.0.0.1:6379> GET name
應(yīng)用場(chǎng)景
? String是最常用的一種數(shù)據(jù)類型,普通的key/value 存儲(chǔ)都可以歸為此類.即可以完全實(shí)現(xiàn)目前 Memcached 的功能,并且效率更高。還可以享受Redis的定時(shí)持久化,操作日志及 Replication等功能。除了提供與 Memcached 一樣的get、set、incr、decr 等操作外
? Redis還提供了下面一些操作:
? 獲取字符串長(zhǎng)度
? 往字符串a(chǎn)ppend內(nèi)容
? 設(shè)置和獲取字符串的某一段內(nèi)容
? 設(shè)置及獲取字符串的某一位(bit)
? 批量設(shè)置一系列字符串的內(nèi)容
? 實(shí)現(xiàn)方式:String在redis內(nèi)部存儲(chǔ)默認(rèn)就是一個(gè)字符串,被redisObject所引用,當(dāng)遇到incr,decr等操作時(shí)會(huì)轉(zhuǎn)成數(shù)值型進(jìn)行計(jì)算,此時(shí)redisObject的encoding字段為int
3.2 hash
常用命令
? hget,hset,hgetall 等
應(yīng)用場(chǎng)景
? 在Memcached中,經(jīng)常將一些結(jié)構(gòu)化的信息打包成HashMap,在客戶端序列化后存儲(chǔ)為一個(gè)字符串的值,用戶的昵稱、年齡、性別、積分等,這時(shí)候在需要修改其中某一項(xiàng)時(shí),通常需要將所有值取出反序列化后,修改某一項(xiàng)的值,再序列化存儲(chǔ)回去。這樣不僅增大了開(kāi)銷,也不適用于一些可能并發(fā)操作的場(chǎng)合(比如兩個(gè)并發(fā)的操作都需要修改積分)。而Redis的Hash結(jié)構(gòu)可以使你像在數(shù)據(jù)庫(kù)中Update一個(gè)屬性一樣只修改某一項(xiàng)屬性值。
3.3 list
常用命令
? lpush、rpush、lpop、rpop、lrange
應(yīng)用場(chǎng)景
? Redis list的應(yīng)用場(chǎng)景非常多,也是Redis最重要的數(shù)據(jù)結(jié)構(gòu)之一,比如twitter的關(guān)注列表,粉絲列表等都可以用Redis的list結(jié)構(gòu)來(lái)實(shí)現(xiàn)。
? Lists 就是鏈表,相信略有數(shù)據(jù)結(jié)構(gòu)知識(shí)的人都應(yīng)該能理解其結(jié)構(gòu)。使用Lists結(jié)構(gòu),可以輕松地實(shí)現(xiàn)最新消息排行等功能。Lists的另一個(gè)應(yīng)用就是消息隊(duì)列,
? 可以利用Lists的PUSH操作,將任務(wù)存在Lists中,然后工作線程再用POP操作將任務(wù)取出進(jìn)行執(zhí)行。
Redis還提供了操作Lists中某一段的api,可以直接查詢,刪除Lists中某一段的元素
3.4 set
常用命令
? sadd、spop、smembers、sunion 等
應(yīng)用場(chǎng)景:
? Redis set對(duì)外提供的功能與list類似是一個(gè)列表的功能,特殊之處在于set是可以自動(dòng)排重的,當(dāng)你需要存儲(chǔ)一個(gè)列表數(shù)據(jù),又不希望出現(xiàn)重復(fù)數(shù)據(jù)時(shí),set 是一個(gè)很好的選擇,并且set提供了判斷某個(gè)成員是否在一個(gè)set集合內(nèi)的重要接口,這個(gè)也是list所不能提供的。
? Sets 集合的概念就是一堆不重復(fù)值的組合。利用Redis提供的Sets數(shù)據(jù)結(jié)構(gòu),可以存儲(chǔ)一些集合性的數(shù)據(jù),比如在微博應(yīng)用中,可以將一個(gè)用戶所有的關(guān)注人存在一個(gè)集合中,將其所有粉絲存在一個(gè)集合。Redis還為集合提供了求交集、并集、差集等操作,可以非常方便的實(shí)現(xiàn)如共同關(guān)注、共同喜好、二度好友等功能,對(duì)上面的所有集合操作,你還可以使用不同的命令選擇將結(jié)果返回給客戶端還是存集到一個(gè)新的集合中
3.5 sort set
常用命令:
? zadd,zrange,zrem,zcard等
使用場(chǎng)景
? Redis sorted set的使用場(chǎng)景與set類似,區(qū)別是set不是自動(dòng)有序的,而sorted set可以通過(guò)用戶額外提供一個(gè)優(yōu)先級(jí)(score)的參數(shù)來(lái)為成員排序,并且是插入有序的,即自動(dòng)排序。當(dāng)你需要一個(gè)有序的并且不重復(fù)的集合列表,那么可以選擇sorted set數(shù)據(jù)結(jié)構(gòu),比如twitter 的public timeline可以以發(fā)表時(shí)間作為score來(lái)存儲(chǔ),這樣獲取時(shí)就是自動(dòng)按時(shí)間排好序的。
? 另外還可以用Sorted Sets來(lái)做帶權(quán)重的隊(duì)列,比如普通消息的score為1,重要消息的score為2,然后工作線程可以選擇按score的倒序來(lái)獲取工作任務(wù)。讓重要的任務(wù)優(yōu)先執(zhí)行
四 redis持久化
Redis 是內(nèi)存型數(shù)據(jù)庫(kù),為了保證數(shù)據(jù)在斷電后不會(huì)丟失,需要將內(nèi)存中的數(shù)據(jù)持久化到硬盤上。
Redis提供了兩種持久化的方式
? RDB(Redis DataBase)
? AOF(Append Only File)
4.1 RDB
在不同的時(shí)間點(diǎn),將redis存儲(chǔ)的數(shù)據(jù)生成快照并存儲(chǔ)到磁盤等介質(zhì)上,可以將快照復(fù)制到其他服務(wù)器從而創(chuàng)建具有相同數(shù)據(jù)的服務(wù)器副本。如果系統(tǒng)發(fā)生故障,將會(huì)丟失最后一次創(chuàng)建快照之后的數(shù)據(jù)。如果數(shù)據(jù)量大,保存快照的時(shí)間會(huì)很長(zhǎng)。
4.2 AOF
換了一個(gè)角度來(lái)實(shí)現(xiàn)持久化,那就是將redis執(zhí)行過(guò)的所有寫(xiě)指令記錄下來(lái),在下次redis重新啟動(dòng)時(shí),只要把這些寫(xiě)指令從前到后再重復(fù)執(zhí)行一遍,就可以實(shí)現(xiàn)數(shù)據(jù)恢復(fù)了。將寫(xiě)命令添加到 AOF 文件(append only file)末尾。
五 redis架構(gòu)
5.1 單機(jī)
5.2 主從
5.3 哨兵
5.4 集群
5.3 哨兵
哨兵的出現(xiàn)主要是解決了主從復(fù)制出現(xiàn)故障時(shí)需要人為干預(yù)的問(wèn)題。
哨兵主要功能
? 集群監(jiān)控:負(fù)責(zé)監(jiān)控Redis master和slave進(jìn)程是否正常工作
? 消息通知:如果某個(gè)Redis實(shí)例有故障,那么哨兵負(fù)責(zé)發(fā)送消息作為報(bào)警通知給管理員
? 故障轉(zhuǎn)移:如果master node掛掉了,會(huì)自動(dòng)轉(zhuǎn)移到slave node上
? 配置中心:如果故障轉(zhuǎn)移發(fā)生了,通知client客戶端新的master地址
5.4 集群
即使使用哨兵,redis每個(gè)實(shí)例也是全量存儲(chǔ),每個(gè)redis存儲(chǔ)的內(nèi)容都是完整的數(shù)據(jù),浪費(fèi)內(nèi)存且有木桶效應(yīng)。
為了最大化利用內(nèi)存,可以采用集群,就是分布式存儲(chǔ)。
即每臺(tái)redis存儲(chǔ)不同的內(nèi)容,共有16384個(gè)slot。
每個(gè)redis分得一些slot,hash_slot = crc16(key) mod 16384 找到對(duì)應(yīng)slot。
集群至少需要3主3從,且每個(gè)實(shí)例使用不同的配置文件,主從不用配置,集群會(huì)自己選。
? 高可用性:在主機(jī)掛掉后,自動(dòng)故障轉(zhuǎn)移,使前端服務(wù)對(duì)用戶無(wú)影響。
? 讀寫(xiě)分離:將主機(jī)讀壓力分流到從機(jī)上。
? 可在客戶端組件上實(shí)現(xiàn)負(fù)載均衡,根據(jù)不同服務(wù)器的運(yùn)行情況,分擔(dān)不同比例的讀請(qǐng)求壓力
歡迎關(guān)注我的微信公眾號(hào)"IT小Chen",共同學(xué)習(xí),共同成長(zhǎng)?。。?/strong>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。