1椒舵、Redis簡介
-
Redis是一個開源的使用ANSI C語言編寫、遵守BSD協(xié)議磨澡、支持網(wǎng)絡(luò)碗啄、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫稳摄,并提供多種語言的API稚字。
它通常被稱為數(shù)據(jù)結(jié)構(gòu)服務(wù)器,因?yàn)橹担╲alue)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等類型秩命。
Redis支持?jǐn)?shù)據(jù)的持久化尉共,可以將內(nèi)存中的數(shù)據(jù)保存在磁盤中褒傅,重啟的時(shí)候可以再次加載進(jìn)行使用弃锐。
Redis不僅僅支持簡單的key-value類型的數(shù)據(jù),同時(shí)還提供list殿托,set霹菊,zset,hash等數(shù)據(jù)結(jié)構(gòu)的存儲。
Redis支持?jǐn)?shù)據(jù)的備份旋廷,即master-slave模式的數(shù)據(jù)備份鸠按。
2、Redis常見的業(yè)務(wù)場景
- 定時(shí)器饶碘、計(jì)數(shù)器目尖。
- 發(fā)布、訂閱消息系統(tǒng)扎运。
- 模擬類似于HttpSession這種需要設(shè)定過期時(shí)間的功能瑟曲。
- 取最新N個數(shù)據(jù)的操作,如:可以將最新的10條評論的ID放在Redis的List集合里面豪治。
- 內(nèi)存存儲和持久化:redis支持異步將內(nèi)存中的數(shù)據(jù)寫到硬盤上洞拨,同時(shí)不影響繼續(xù)服務(wù)。
3负拟、Redis 優(yōu)勢
- 性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 烦衣。
- 豐富的數(shù)據(jù)類型 – Redis支持二進(jìn)制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數(shù)據(jù)類型操作。
- 原子 – Redis的所有操作都是原子性的掩浙,同時(shí)Redis還支持對幾個操作全并后的原子性執(zhí)行花吟。
- 豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性。
4厨姚、Redis與其他key-value存儲有什么不同示辈?
Redis有著更為復(fù)雜的數(shù)據(jù)結(jié)構(gòu)并且提供對他們的原子性操作,這是一個不同于其他數(shù)據(jù)庫的進(jìn)化路徑遣蚀。Redis的數(shù)據(jù)類型都是基于基本數(shù)據(jù)結(jié)構(gòu)的同時(shí)對程序員透明矾麻,無需進(jìn)行額外的抽象。
Redis運(yùn)行在內(nèi)存中但是可以持久化到磁盤芭梯,所以在對不同數(shù)據(jù)集進(jìn)行高速讀寫時(shí)需要權(quán)衡內(nèi)存险耀,因?yàn)閿?shù)據(jù)量不能大于硬件內(nèi)存。在內(nèi)存數(shù)據(jù)庫方面的另一個優(yōu)點(diǎn)是玖喘,相比在磁盤上相同的復(fù)雜的數(shù)據(jù)結(jié)構(gòu)甩牺,在內(nèi)存中操作起來非常簡單,這樣Redis可以做很多內(nèi)部復(fù)雜性很強(qiáng)的事情累奈。同時(shí)贬派,在磁盤格式方面他們是緊湊的以追加的方式產(chǎn)生的,因?yàn)樗麄儾⒉恍枰M(jìn)行隨機(jī)訪問澎媒。
下邊我們將重點(diǎn)介紹:
5搞乏、 RedisAPI的理解和使用。
-
字符串的存取
-
字典的存取
-
list的存取
-
-
set的存取
-
1.Sorted-Set和Set的區(qū)別
- sorted-set:每個成員都有一個分?jǐn)?shù)與之關(guān)聯(lián)戒努,成員唯一请敦,可以對應(yīng)多個分?jǐn)?shù)
- 2.Sorted-Set中的成員在集合中的位置是有序的。
-
存儲Sorted-Set常用命令:
- 1.添加元素:zadd
zadd sort 10 a 20 b 30 c #a的分?jǐn)?shù)是10、b的分?jǐn)?shù)是20侍筛、c的分?jǐn)?shù)是30 - 2.獲得元素:zscore獲得分?jǐn)?shù)萤皂、zcard獲得成員數(shù)量
zscore sort a #獲得a的分?jǐn)?shù) - 3.刪除元素:zrem、zremrangebyrank按照排名范圍刪除匣椰、zremrangebyscore按照分?jǐn)?shù)范圍刪除
zrem sort a b #刪除成員a裆熙、b
zremrangebyrank sort 0 4 #刪除排名0-4的成員
zremrangebyscore sort 10 30 #刪除分?jǐn)?shù)10-30的成員 - 4.范圍查詢:zrange
zrange sort 0 -1 #所有成員
zrange sort 0 -1 withscores #查詢成員及分?jǐn)?shù),從小到大
zrevrange sort 0 -1 withscores #從大到小 - 5.擴(kuò)展命令:
zrangebyscore sort 0 100 withscores #顯示0-100分?jǐn)?shù)的成員
zrangebyscore sort 0 100 withscores limit 0 2 #顯示0-100分?jǐn)?shù)的成員的前兩名
zincrby sort 10 c #給c加上10
zcount sort 80 100 # 顯示80-100分?jǐn)?shù)的成員個數(shù)
- 1.添加元素:zadd
-
Sorted-Set使用場景:
- 如大型在線游戲積分排行榜
- 構(gòu)建索引數(shù)據(jù)
-
6禽笑、Redis keys的通用操作
1:所有鍵列:keys *
2:指定開頭鍵列:keys [*]?
3:刪:del 鍵...
4:判斷存在:exists 鍵
5:重命名:rename 舊鍵名 新鍵名
6:設(shè)過期時(shí)間:expire 鍵 [seconds]
7:查過期時(shí)間:ttl 鍵
8:鍵的值類型:type 鍵
-
9:清空緩存:flushall
7弛车、Redis特性
多數(shù)據(jù)庫
Redis事務(wù)
-
Redis一個實(shí)例包含多個數(shù)據(jù)庫:默認(rèn)16個 。
客戶端默認(rèn)連接0號數(shù)據(jù)庫
select 1 #選擇1號數(shù)據(jù)庫
move name 1 #移動 name 到1號數(shù)據(jù)庫 -
事務(wù):
事務(wù)是用戶定義的一個數(shù)據(jù)庫操作序列蒲每,這些操作要么全做要么全不做,是一個不可分割的工作單位纷跛。
事務(wù)具有四個特性:原子性(Atomicity)、一致性(Consistency)邀杏、隔離性(Isolation)和持續(xù)性(Durability)贫奠。這個四個特性也簡稱為ACID特性。
原子性:事務(wù)是數(shù)據(jù)庫的邏輯工作單位望蜡,事務(wù)中包括的諸操作要么都做唤崭,要么都不做。
一致性:事務(wù)執(zhí)行的結(jié)果必須是使數(shù)據(jù)庫從一個一致性狀態(tài)變到另一個一致性狀態(tài)脖律。
隔離性:一個事務(wù)的執(zhí)行不能被其他事務(wù)干擾谢肾。即一個事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對其他并發(fā)事務(wù)是隔離的,并發(fā)執(zhí)行的各個事務(wù)之間不能互相干擾小泉。
提交芦疏,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就應(yīng)該是永久性的。接下來的其他操作或故障不應(yīng)該對其執(zhí)行結(jié)果有任何影響微姊。為什么事務(wù)非正常結(jié)束時(shí)會影響數(shù)據(jù)庫數(shù)據(jù)的正確性酸茴,請列舉一例說明之。
答:事務(wù)執(zhí)行的結(jié)果必須是使數(shù)據(jù)庫從一個一致性狀態(tài)變到另一個一致性狀態(tài)兢交。如果數(shù)據(jù)庫系統(tǒng)運(yùn)行中發(fā)生故障薪捍,有些事務(wù)尚未完成就被迫中斷,這些未完成事務(wù)對數(shù)據(jù)庫所做的修改有一部分已寫入物理數(shù)據(jù)庫配喳,這時(shí)數(shù)據(jù)庫就處于一種不正確的狀態(tài)酪穿,或者說是不一致的狀態(tài)。例如某工廠的庫存管理系統(tǒng)中晴裹,要把數(shù)量為Q的某種零件從倉庫1移到倉庫2存放被济。則可以定義一個事務(wù)T,T包括兩個操作息拜;Q1=Q1-Q溉潭,Q2=Q2+Q净响。如果T非正常終止時(shí)只做了第一個操作少欺,則數(shù)據(jù)庫就處于不一致性狀態(tài)喳瓣,庫存量無緣無故少了Q。
multi:開啟事務(wù)
exec:提交赞别,執(zhí)行的命令被原子化執(zhí)行
discard:回滾
8畏陕、 Redis的持久化
Redis的持久化實(shí)現(xiàn)方式主要有兩種:RDB和AOF
1.RDB和AOF兩種持久化機(jī)制的介紹
RDB持久化機(jī)制,對Redis中的數(shù)據(jù)執(zhí)行周期性的持久化仿滔。
AOF機(jī)制對每條寫入命令作為日志惠毁,以append-only的模式寫入一個日志文件中,在redis重啟的時(shí)候崎页,可以通過回放AOF日志中的寫入指令來重新構(gòu)建整個數(shù)據(jù)集鞠绰。
RDB和AOF的優(yōu)缺點(diǎn)
RDB持久化機(jī)制的優(yōu)點(diǎn)
1、RDB會生成多個數(shù)據(jù)文件飒焦,每個數(shù)據(jù)文件都代表了某一個時(shí)刻中redis的數(shù)據(jù)蜈膨,這種多個數(shù)據(jù)文件的方式,非常適合做冷備(就是停止數(shù)據(jù)庫服務(wù)來作數(shù)據(jù)備份)牺荠,可以將這種完整的數(shù)據(jù)文件發(fā)送到一些遠(yuǎn)程的安全存儲上去翁巍,比如說Amazon的S3云服務(wù)上去,在國內(nèi)可以是阿里云的ODPS分布式存儲上休雌,以預(yù)定好的備份策略來定期備份redis中的數(shù)據(jù)灶壶。
2、RDB也可以做冷備杈曲,生成多個文件驰凛,每個文件都代表了某一個時(shí)刻的完整的數(shù)據(jù)快照。AOF也可以做冷備担扑,只有一個文件洒嗤,但是你可以,每隔一定時(shí)間魁亦,去copy一份這個文件出來(實(shí)際上很少人會用AOF作冷備渔隶,因?yàn)檫€需要自己寫一些腳本去做這個事情,各種定時(shí)洁奈,很麻煩间唉。RDB做冷備,優(yōu)勢在哪兒呢利术?由redis去控制固定時(shí)長生成快照文件的事情呈野,RDB數(shù)據(jù)做冷備,在最壞的情況下印叁,提供數(shù)據(jù)恢復(fù)的時(shí)候被冒,速度比AOF快)军掂。
3、RDB對redis對外提供的讀寫服務(wù)昨悼,影響非常小蝗锥,可以讓redis保持高性能,因?yàn)閞edis主進(jìn)程只需要fork一個子進(jìn)程率触,讓子進(jìn)程執(zhí)行磁盤IO操作來進(jìn)行RDB持久化即可终议。
4、RDB葱蝗,每次寫穴张,都是直接寫redis內(nèi)存,只是在一定的時(shí)候两曼,才會將數(shù)據(jù)寫入磁盤中皂甘。AOF,每次都是要寫文件的悼凑,雖然可以快速寫入os cache中偿枕,但是還是有一定的時(shí)間開銷的,速度肯定比RDB略慢一些。
5佛析、相對于AOF持久化機(jī)制來說益老,直接基于RDB數(shù)據(jù)文件來重啟和恢復(fù)redis進(jìn)程,更加快速寸莫。
6捺萌、AOF,存放的指令日志膘茎,做數(shù)據(jù)恢復(fù)的時(shí)候桃纯,其實(shí)是要回放和執(zhí)行所有的指令日志,來恢復(fù)出來內(nèi)存中的所有數(shù)據(jù)披坏。
7态坦、RDB,就是一份數(shù)據(jù)文件(二進(jìn)制)棒拂,恢復(fù)的時(shí)候伞梯,直接加載到內(nèi)存中即可。
結(jié)合上述優(yōu)點(diǎn)帚屉,RDB特別適合做冷備份谜诫。
-
RDB持久化機(jī)制的缺點(diǎn)
1、如果想要在redis故障時(shí)攻旦,盡可能少的丟失數(shù)據(jù)喻旷,那么RDB沒有AOF好。一般來說牢屋,RDB數(shù)據(jù)快照文件且预,都是每隔5分鐘槽袄,或者更長時(shí)間生成一次,這個時(shí)候就得接受一旦redis進(jìn)程宕機(jī)锋谐,那么會丟失最近5分鐘的數(shù)據(jù)遍尺。
2、這個問題怀估,也是RDB最大的缺點(diǎn)狮鸭,就是不適合做第一優(yōu)先的恢復(fù)方案合搅,如果你依賴RDB做第一優(yōu)先恢復(fù)方案多搀,會導(dǎo)致數(shù)據(jù)丟失的比較多。
3灾部、RDB每次在fork子進(jìn)程來執(zhí)行RDB快照數(shù)據(jù)文件生成的時(shí)候康铭,如果數(shù)據(jù)文件特別大,可能會導(dǎo)致對客戶端提供的服務(wù)暫停數(shù)毫秒赌髓,或者甚至數(shù)秒从藤。
4、一般不要讓RDB的間隔太長锁蠕,否則每次生成的RDB文件太大了夷野,對redis本身的性能可能會有影響的。
-
AOF持久化機(jī)制的優(yōu)點(diǎn)
1荣倾、AOF可以更好的保護(hù)數(shù)據(jù)不丟失悯搔,一般AOF會每隔1秒,通過一個后臺線程執(zhí)行一次fsync操作舌仍,最多丟失1秒鐘的數(shù)據(jù)妒貌。
2、AOF日志文件以append-only模式寫入铸豁,所以沒有任何磁盤尋址的開銷灌曙,寫入性能非常高,而且文件不容易破損节芥,即使文件尾部破損在刺,也很容易修復(fù)
3、AOF日志文件即使過大的時(shí)候头镊,出現(xiàn)后臺重寫操作蚣驼,也不會影響客戶端的讀寫。因?yàn)樵趓ewrite log的時(shí)候拧晕,會對其中的指導(dǎo)進(jìn)行壓縮隙姿,創(chuàng)建出一份需要恢復(fù)數(shù)據(jù)的最小日志出來。再創(chuàng)建新日志文件的時(shí)候厂捞,老的日志文件還是照常寫入输玷。當(dāng)新的merge后的日志文件ready的時(shí)候队丝,再交換新老日志文件即可。
4欲鹏、AOF日志文件的命令通過非郴茫可讀的方式進(jìn)行記錄,這個特性非常適合做災(zāi)難性的誤刪除的緊急恢復(fù)赔嚎。比如某人不小心用flushall命令清空了所有數(shù)據(jù)膘盖,只要這個時(shí)候后臺rewrite還沒有發(fā)生,那么就可以立即拷貝AOF文件尤误,將最后一條flushall命令給刪了侠畔,然后再將該AOF文件放回去,就可以通過恢復(fù)機(jī)制损晤,自動恢復(fù)所有數(shù)據(jù)软棺。
-
AOF持久化機(jī)制的缺點(diǎn)
1、對于同一份數(shù)據(jù)來說尤勋,AOF日志文件通常比RDB數(shù)據(jù)快照文件更大喘落。
2、AOF開啟后最冰,支持的寫QPS會比RDB支持的寫QPS低瘦棋,因?yàn)锳OF一般會配置成每秒fsync一次日志文件,當(dāng)然暖哨,每秒一次fsync赌朋,性能也還是很高的(如果fsync的頻率過高,性能就會大幅度下降)鹿蜀。
3箕慧、比如,如果你要保證一條數(shù)據(jù)都不丟茴恰,也是可以的颠焦,AOF的fsync設(shè)置成沒寫入一條數(shù)據(jù),fsync一次往枣,那就完蛋了伐庭,redis的QPS大降。
4分冈、以前AOF發(fā)生過bug圾另,就是通過AOF記錄的日志,進(jìn)行數(shù)據(jù)恢復(fù)的時(shí)候雕沉,沒有恢復(fù)一模一樣的數(shù)據(jù)出來集乔。所以說,類似AOF這種較為復(fù)雜的基于命令日志/merge/回放的方式坡椒,比基于RDB每次持久化一份完整的數(shù)據(jù)快照文件的方式扰路,更加脆弱一些尤溜,容易有bug。不過AOF就是為了避免rewrite過程導(dǎo)致的bug汗唱,因此每次rewrite并不是基于舊的指令日志進(jìn)行merge的宫莱,而是基于當(dāng)時(shí)內(nèi)存中的數(shù)據(jù)進(jìn)行指令的重新構(gòu)建,這樣健壯性會好很多哩罪。
5授霸、唯一的比較大的缺點(diǎn),其實(shí)就是做數(shù)據(jù)恢復(fù)的時(shí)候际插,會比較慢碘耳,還有做冷備,定期的備份腹鹉,不太方便藏畅,可能要自己手寫復(fù)雜的腳本去做敷硅,做冷備不太合適功咒。
6、如果我們想要redis僅僅作為純內(nèi)存的緩存來用绞蹦,那么可以禁止RDB和AOF所有的持久化機(jī)制力奋。
7、通過RDB或AOF幽七,都可以將redis內(nèi)存中的數(shù)據(jù)給持久化到磁盤上面來景殷,然后可以將這些數(shù)據(jù)備份到別的地方去,比如說阿里云等一些云服務(wù)上澡屡。
8猿挚、如果redis掛了,服務(wù)器上的內(nèi)存和磁盤上的數(shù)據(jù)都丟了驶鹉,可以從云服務(wù)上拷貝回來之前的數(shù)據(jù)绩蜻,放到指定的目錄中,然后重新啟動redis室埋,redis就會自動根據(jù)持久化數(shù)據(jù)文件中的數(shù)據(jù)办绝,去恢復(fù)內(nèi)存中的數(shù)據(jù),繼續(xù)對外提供服務(wù)姚淆。
9孕蝉、如果同時(shí)使用RDB和AOF兩種持久化機(jī)制,那么在redis重啟的時(shí)候腌逢,會默認(rèn)使用AOF來重新構(gòu)建數(shù)據(jù)降淮,因?yàn)锳OF中的數(shù)據(jù)更加完整(因?yàn)锳OF默認(rèn)每隔一秒往AOF文件里面寫入一條寫操作,和RDB是每隔一段時(shí)間生成一個快照)搏讶。
打開Redis.conf文件
第一句的意思是 每隔15分鐘佳鳖,有一個發(fā)生變化纳本,保存一次。
redis數(shù)據(jù)保存在硬盤上的地址
微信掃碼關(guān)注java架構(gòu)腋颠,獲取Java面試題和架構(gòu)師相關(guān)題目和視頻繁成。