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