一、前言
近乎所有與Java相關(guān)的面試都會(huì )問(wèn)到緩存的問(wèn)題,基礎一點(diǎn)的會(huì )問(wèn)到什么是“二八定律”、什么是“熱數據和冷數據”,復雜一點(diǎn)的會(huì )問(wèn)到緩存雪崩、緩存穿透、緩存預熱、緩存更新、緩存降級等問(wèn)題,這些看似不常見(jiàn)的概念,都與我們的緩存服務(wù)器相關(guān),一般常用的緩存服務(wù)器有Redis、Memcached等,而筆者目前最常用的也只有Redis這一種。
如果你在以前面試的時(shí)候還沒(méi)有遇到過(guò)面試官問(wèn)你《為什么說(shuō)Redis是單線(xiàn)程的以及Redis為什么這么快!》,那么你看到這篇文章的時(shí)候,你應該覺(jué)得是一件很幸運的事情!如果你剛好是一位高逼格的面試官,你也可以拿這道題去面試對面“望穿秋水”般的小伙伴,測試一下他的掌握程度。
好啦!步入正題!我們先探討一下Redis是什么,Redis為什么這么快、然后在探討一下為什么Redis是單線(xiàn)程的?
二、Redis簡(jiǎn)介
Redis是一個(gè)開(kāi)源的內存中的數據結構存儲系統,它可以用作:數據庫、緩存和消息中間件。
它支持多種類(lèi)型的數據結構,如字符串(String),散列(Hash),列表(List),集合(Set),有序集合(Sorted Set或者是ZSet)與范圍查詢(xún),Bitmaps,Hyperloglogs 和地理空間(Geospatial)索引半徑查詢(xún)。其中常見(jiàn)的數據結構類(lèi)型有:String、List、Set、Hash、ZSet這5種。
Redis 內置了復制(Replication),LUA腳本(Lua scripting), LRU驅動(dòng)事件(LRU eviction),事務(wù)(Transactions) 和不同級別的磁盤(pán)持久化(Persistence),并通過(guò) Redis哨兵(Sentinel www.xucaizxyl.com)和自動(dòng)分區(Cluster)提供高可用性(High Availability)。
Redis也提供了持久化的選項,這些選項可以讓用戶(hù)將自己的數據保存到磁盤(pán)上面進(jìn)行存儲。根據實(shí)際情況,可以每隔一定時(shí)間將數據集導出到磁盤(pán)(快照),或者追加到命令日志中(AOF只追加文件),他會(huì )在執行寫(xiě)命令時(shí),將被執行的寫(xiě)命令復制到硬盤(pán)里面。您也可以關(guān)閉持久化功能,將Redis作為一個(gè)高效的網(wǎng)絡(luò )的緩存數據功能使用。
Redis不使用表,他的數據庫不會(huì )預定義或者強制去要求用戶(hù)對Redis存儲的不同數據進(jìn)行關(guān)聯(lián)。
??????數據庫的工作模式按存儲方式可分為:硬盤(pán)數據庫和內存數據庫。Redis 將數據儲存在內存里面,讀寫(xiě)數據的時(shí)候都不會(huì )受到硬盤(pán) I/O 速度的限制,所以速度極快。
(1)硬盤(pán)數據庫的工作模式:
這里寫(xiě)圖片描述
(2)內存數據庫的工作模式:
這里寫(xiě)圖片描述
看完上述的描述,對于一些常見(jiàn)的Redis相關(guān)的面試題,是否有所認識了,例如:什么是Redis、Redis常見(jiàn)的數據結構類(lèi)型有哪些、Redis是如何進(jìn)行持久化的等。