來(lái)源:北大青鳥(niǎo)總部 2023年03月10日 13:50
我們最常使用的應(yīng)用,如淘寶、京東、抖音、微信等,全都是使用數(shù)據(jù)庫(kù)來(lái)進(jìn)行數(shù)據(jù)的存儲(chǔ)。尤其是在接入互聯(lián)網(wǎng)網(wǎng)民越來(lái)越多的情況下,業(yè)務(wù)系統(tǒng)經(jīng)常會(huì)面臨大量的數(shù)據(jù)請(qǐng)求,在一些大促場(chǎng)景,更會(huì)面臨突然間的請(qǐng)求量劇增,需要系統(tǒng)在極短的時(shí)間內(nèi)完成上萬(wàn)次的讀/寫操作,單個(gè)數(shù)據(jù)庫(kù)、傳統(tǒng)數(shù)據(jù)庫(kù)也難以承受該數(shù)據(jù)量,因此需要多類型的數(shù)據(jù)庫(kù)一起使用,充分利用數(shù)據(jù)庫(kù)的優(yōu)點(diǎn)實(shí)現(xiàn)高并發(fā),保障用戶體驗(yàn)。
而眾多數(shù)據(jù)庫(kù)中,Redis便是程序員們最親睞、使用最多的數(shù)據(jù)庫(kù),在各大企業(yè)招聘中也要求受聘者掌握redis的使用,疫情逐漸穩(wěn)定,大量的招聘機(jī)會(huì)襲來(lái),趕快來(lái)查漏補(bǔ)缺Redis(定義、特征、原理、數(shù)據(jù)結(jié)構(gòu)、常用場(chǎng)景),看看還有哪塊兒不太熟悉,趕緊惡補(bǔ),拿下心儀的offer吧~
Redis是一種內(nèi)存數(shù)據(jù)庫(kù),Nosql非關(guān)系型數(shù)據(jù)。
按照數(shù)據(jù)存儲(chǔ)的位置在磁盤還是內(nèi)存,可以把數(shù)據(jù)庫(kù)分為磁盤數(shù)據(jù)庫(kù)(如Mysql、Oracle)、內(nèi)存數(shù)據(jù)庫(kù)(如Redis)。對(duì)于磁盤數(shù)據(jù)庫(kù)來(lái)說(shuō),數(shù)據(jù)庫(kù)的事務(wù)操作機(jī)制成熟可靠,但是因?yàn)閿?shù)據(jù)存儲(chǔ)在磁盤上,占用消耗的系統(tǒng)資源比較多、數(shù)據(jù)存取的速度比較慢、數(shù)據(jù)存取時(shí)間不一致且難以預(yù)測(cè),所以當(dāng)數(shù)據(jù)量比較大時(shí)就產(chǎn)生了新的解決方案,即把數(shù)據(jù)存儲(chǔ)在內(nèi)存上,內(nèi)存數(shù)據(jù)庫(kù)存取速度很快、數(shù)據(jù)一致、存取時(shí)間也易于預(yù)測(cè),缺點(diǎn)就是內(nèi)存比較貴,所以目前互聯(lián)網(wǎng)企業(yè)是內(nèi)存數(shù)據(jù)庫(kù)與磁盤數(shù)據(jù)庫(kù)搭配在用。
按照存儲(chǔ)的數(shù)據(jù)關(guān)系模型把數(shù)據(jù)庫(kù)又拆分為關(guān)系型數(shù)據(jù)庫(kù)(如Mysql、Oracle)、非關(guān)系型數(shù)據(jù)庫(kù)(Redis、MongoDB)、大數(shù)據(jù)(HIve、Hbase、Clickhouse)。早期的時(shí)候,應(yīng)用數(shù)據(jù)量不大,只使用數(shù)據(jù)庫(kù)就可以存儲(chǔ)所有數(shù)據(jù)并且保障良好的性能,但后來(lái)隨著業(yè)務(wù)的快速發(fā)展,應(yīng)用數(shù)據(jù)量蹭蹭蹭的劇增導(dǎo)致于一個(gè)數(shù)據(jù)庫(kù)也不夠用了,運(yùn)維們開(kāi)始把數(shù)據(jù)庫(kù)進(jìn)行主從復(fù)制,讀寫分離,分庫(kù)分表,并且在應(yīng)用訪問(wèn)和數(shù)據(jù)庫(kù)之間加了緩存層,把常調(diào)用的熱數(shù)據(jù)都放在緩存層,這緩存層就是Nosql非關(guān)系型數(shù)據(jù)庫(kù)。
Redis的典型特征便是單線程。在互聯(lián)網(wǎng)業(yè)務(wù)高并發(fā)的情況下,大部分應(yīng)用程序、算法都是采用多線程思想,提高執(zhí)行的并發(fā)度,然而redis卻是使用單線程模型進(jìn)行設(shè)計(jì),并且能承受住每秒幾百萬(wàn)的請(qǐng)求量,那么為什么redis采用單線程設(shè)計(jì)呢?
Redis采用單線程模型來(lái)設(shè)計(jì)的原因主要有三個(gè):
單線程模型維護(hù)性更好,便于開(kāi)發(fā)和調(diào)試;
單線程模型也能很好的處理用戶請(qǐng)求;
Redis運(yùn)行的操作性能瓶頸都不是CPU。
首先我們需要對(duì)齊一個(gè)概念,無(wú)論單線程還是多線程模型,設(shè)計(jì)的初衷都是保障系統(tǒng)的高性能。但是在采用了多線程模型后。就必須要同時(shí)引入并發(fā)控制來(lái)保證多個(gè)線程同時(shí)訪問(wèn)程序的正確性,需要程序員額外去維護(hù)并發(fā)控制的代碼,加鎖,處理死鎖問(wèn)題等,這樣提高了研發(fā)成本。
其次使用單線程模型也不等于系統(tǒng)不能并發(fā)的處理任務(wù)。在Redis中采用了I/O多路復(fù)用機(jī)制來(lái)并發(fā)處理客戶端的多個(gè)請(qǐng)求,并同時(shí)等待多個(gè)連接發(fā)送的請(qǐng)求。使用I/O多路復(fù)用技術(shù)可以減少系統(tǒng)的開(kāi)銷,并且不需要額外創(chuàng)建和維護(hù)線程監(jiān)聽(tīng)客戶端的大量連接,減少了服務(wù)器的開(kāi)發(fā)和維護(hù)成本。并且使用多線程也會(huì)帶來(lái)性能的下降,因?yàn)椴僮飨到y(tǒng)在執(zhí)行任務(wù)時(shí)需要去保存加載線程的上下文從而帶來(lái)額外的開(kāi)銷。
最后因?yàn)镽edis是內(nèi)存型數(shù)據(jù)庫(kù),所以它的瓶頸一般不在CPU上,而多線程模型主要是在于并發(fā)的使用CPU資源,所以并不需要多線程去充分利用CPU資源。只需要管控好網(wǎng)路I/O來(lái)處理網(wǎng)絡(luò)傳輸帶來(lái)的延遲和等待客戶端的數(shù)據(jù)傳輸即可。
Redis有五種基本的數(shù)據(jù)結(jié)構(gòu),分別是strings字符串,hashes散列,lists列表,sets集合,sortedsets有序集合。
strings字符串類型支持setkey vaule設(shè)置值、getkey獲取某個(gè)key的值、msetkey1 value1 key2 value2批量設(shè)置值、mgetkey1 key2批量獲取值、incrkey自增指定的值、decrkey自減指定的值。
Hash支持hsetkey field value設(shè)置字典中某個(gè)key的值、hmsetkey field1 value1 field2 value2批量設(shè)置值、hget.
Keyfield獲取字典中某個(gè)key的值、hgetallkey獲取全部值、hmsetkey field1 field2 批量獲取值。
List即列表,支持lpushkey item1 item2 item3 從左往右入棧、rpushkey item1 item2 item3從右入棧、lpopkey從左出棧、rpopkey從右出棧、linsert key before|after item newitem在指定元素的前面或后面添加元素、lremkey count value刪除指定個(gè)數(shù)值為value的元素。
Set類型里面的元素不能重復(fù),還可以對(duì)集合取交集和并集,通過(guò)Set可以實(shí)現(xiàn)取不同用戶之間的共同好友、溝通愛(ài)好等。saddkey value添加某個(gè)元素、sdelkey value刪除某個(gè)元素、sismemberkey value判斷是否是集合中的元素、srandmemberkey value隨機(jī)獲取指定個(gè)數(shù)的元素、stopkey count從集合中隨機(jī)彈出元素、scardkey獲取集合個(gè)數(shù)、sinterset1 set2獲取所有集合的交集、skiffset1 set2獲取所有集合的差集、sunionset1 set2獲取所有集合中的并集。
Zset是一個(gè)有序集合,通過(guò)它可以實(shí)現(xiàn)比如學(xué)生成績(jī)排行榜、視頻播放量排行榜等功能。
Redis基于內(nèi)存存儲(chǔ)數(shù)據(jù),并且底層由C語(yǔ)言開(kāi)發(fā),因此可以極大的提高查詢性能。Redis常用的場(chǎng)景包括緩存、時(shí)效性控制、計(jì)數(shù)器、社交列表、記錄用戶判定信息、熱門列表與排行榜、最新動(dòng)態(tài)、消息隊(duì)列等。
緩存-對(duì)于熱點(diǎn)數(shù)據(jù),用戶可能需要經(jīng)常訪問(wèn),把數(shù)據(jù)放在Redis后,用戶就可以快速獲取數(shù)據(jù)。
時(shí)效性控制-我們注冊(cè)某個(gè)app或網(wǎng)站時(shí),經(jīng)常都是需要驗(yàn)證碼,并且超過(guò)多少分鐘后就不能使用。
計(jì)數(shù)器-我們經(jīng)常看的點(diǎn)贊數(shù)、瀏覽數(shù)、收藏?cái)?shù)、分享數(shù),利用redis遞增便可實(shí)現(xiàn)。
社交列表-我們經(jīng)常看的用戶點(diǎn)贊列表、用戶分享列表、用戶收藏列表、用戶粉絲列表使用redis的hash類型數(shù)據(jù)結(jié)構(gòu)便可實(shí)現(xiàn)。
記錄用戶判定信息-我們有時(shí)候需要知道用戶是否點(diǎn)贊、是否收藏、是否分享等,使用redis便可實(shí)現(xiàn)。
排行榜-根據(jù)某個(gè)value進(jìn)行排序,可以獲取最新、最熱、點(diǎn)擊率最高的排名列表。
最新動(dòng)態(tài)-按照時(shí)間順序排列獲取最新動(dòng)態(tài)。
消息隊(duì)列-通過(guò)redis的list類型中的push、POP功能,可以實(shí)現(xiàn)消息中間件功能.
今天帶大家復(fù)(xue)習(xí)(xi)了redis,包含定義、典型特征及背后原因、常用的數(shù)據(jù)結(jié)構(gòu)、使用場(chǎng)景等。在找實(shí)習(xí)、找工作的過(guò)程中,如果再有面試官問(wèn)到你Redis,再也不用心慌慌啦!