天天看點

Redis之基礎入門(一)

Redis基礎入門

請你簡單介紹一下Redis是什麼。

答:
Redis本質上是一個Key-Value類型的記憶體資料庫,
是已知性能最快的Key-Value DB,可達每秒十萬次操作。
是非關系型的資料庫(NoSql),差別與Mysql關系型資料庫。
适合的場景主要局限在較小資料量的高性能操作和運算上。
           

請你對Redis和Mysql做一下對比。

答:
前者是非關系型資料庫,後者是關系型資料庫。
前者是鍵值對,後者是二維表結構。
前者基于記憶體作了優化,後者基于硬碟作了優化。
前者儲存資料容量受記憶體空間限制,後者容量受硬碟空間限制。
前者IO速度非常快,主要應對讀取操作,
後者IO速度慢,遇到高并發時往往需要搭配Redis緩存使用。
           

談談Redis和memcached的差別。

答:
Redis對Memcached隻有功能更新沒有降級。
Redis支援AOF和RDB持久化,Memcached不支援持久化。
Redis是單線程,Memcached是多線程。
Redis支援的格式比Memcached多。
Redis的小檔案速度比Memcached快。
Redis3.X原生支援叢集模式,Memcached要靠用戶端分片寫入。
           

Redis為什麼單線程卻可以高性能?

答:
資料全都在記憶體裡,單線程去操作效率最高。
多線程的本質是CPU通過輪換時間片執行不同的線程,
記憶體io操作百ns内完成,Cpu上下文切換需要千ns。
單線程避免了線程切換和競态産生的消耗。
利用隊列技術将并發通路變為串行通路。
           

Redis的缺點有那些?

答:
單線程非阻塞的IO多路複用這決定了任務必須短而小。
它具有很大的持久性開銷。
緩存雪崩問題
緩存擊穿問題
緩存的并發競争問題
           

解釋一下,緩存穿透、緩存擊穿、緩存雪崩、緩存與資料庫雙寫一緻性的問題。

答:
緩存穿透是指多次故意構造出鍵不存在的記錄,實作繞過redis查資料庫。
解決辦法是,即使查詢結果是空也緩存這個值,并設定過期時間。


緩存擊穿是指大并發量通路某些剛好到期的key,實作繞過redis查資料庫。
解決方法是,設定熱點key的過期日期自動加大 或者 加互斥鎖下下策。


緩存雪崩是指大規模的鍵發生緩存到期,更新這些鍵對資料庫壓力很大。
解決辦法,設定過期時間時加一個随機數。
           

緩存和資料庫雙寫一緻性問題

答:
可以先删除緩存再更新,更新期間若有讀請求過來,
讀請求會進行更新緩存,更新緩存操作放隊列裡積壓着。
簡單地說得根據業務來改具體操作,強一緻性就需要悲觀鎖。
           

Redis怎麼利用多CPU/核?

答:
用多個執行個體利用上多個核心,設為不同的伺服器而不是Slave。
Redis的瓶頸在記憶體上,單執行個體可以做到5-6W的QPS。
通常生産中執行個體數量在32-64個,這時Redis受限于記憶體或網絡。
           

Redis記憶體不足時會發生什麼,如何避免記憶體不足?

答:
被系統核心殺掉,或抛出錯誤崩潰,swap交換變得卡頓。
簡單的通過配置maxmemory,設定最大占用記憶體。
或者使用Info指令監控記憶體總量,及時驅逐不必要的鍵。
           

介紹Redis的常用資料類型有那些經典應用場景。

答:
1.最常用的是String,這和Memcached一模一樣,最簡單的k-v存儲。
可以是一張圖檔驗證碼可二進制表示,短信驗證碼等,要設定過期時間。
2.hash類型,value為field和value,适合ID-Detail這樣的場景,
比如商品id,商品詳情。
3.list類型,支援首位或者末尾插入資料。
比如時間排序,最新的股票咨詢。
4.set類型,是hash類型的更新版,支援交集、并集、差集操作。
比如查找兩個人共同的好友。
5.sorted set類型,是set的有序版本,可以進行排序。
比如給某個主播沖錢的排行榜,總排行榜。
           

有一個需求,用Redis做一個秒殺搶購的電商應用,

簡要介紹下從展示,下單到訂單完成,Redis要如何使用。

答:
兩個思路:
資料盡量緩存,使用者不能等待資料庫的IO操作。
通過鎖來控制避免超賣現象。
具體地有:
商品宣傳時,要把商品的資料放進Redis中用Hash類型中儲存,設定過期時間。
需要秒殺的商品放在Redis List中。
商品庫存資料用sorted Set儲存。
訂單扣除庫存時用分布式鎖,庫存同步扣除。
發貨的資料資訊用List儲存,通過MQ處理。
秒殺結束後,把資料從記憶體中同步到資料庫中。
           

關于Redis的持久化,下列描述錯誤的是:(最後一項D)

A、RDB是以快照的形式,将記憶體中的資料整體拷貝到硬碟上。
B、AOF操作的實時性好,但是産生的資料體積大,資料的恢複速度慢。
C、執行RDB存儲時會産生阻塞,是以RDB不适合實時備份,而适合定時備份。
(fork一個新線程,就不阻塞了,但确實不适合實時備份)

D、AOF是以日志形式,将記憶體中的資料整體拷貝到硬碟上。(說法錯誤,錯在整體兩字。)
(AOF以獨立日志方式記錄每次寫新增加指令。新的資料會追加到AOF檔案的末尾)
           

關于Redis的概念,下列描述正确的是(ABCDE)

A、Redis提供了對值進行運算的指令,如對集合求交集、并集、差集等。
B、Redis以鍵值對的形式,将資料存儲于記憶體中,其所有的key都是字元串類型。
C、Redis的值支援多種資料類型,包括字元串、哈希、清單、集合、有序集合等。
D、NoSQL是關系型資料庫之外的資料庫的統稱,Redis是一個NoSQL資料庫。
E、Redis key值可以是任何二進制序列,建議短些,越短理論上越快。
           

Redis分區實作方案有那些?

答:
Redis叢集就是分區的一種的實作,用的是官方叢集。
有三個方案:
1.用戶端分區,Memcached也支援,在用戶端決定要把資料存到哪個分片内。
2.代理分區,Memcached也支援,詢問代理,由代理來全權操作存到哪。
3.查詢路由,實作了一種混合形式的查詢路由。
   (用戶端随機地請求任意一個redis執行個體,然後由Redis将請求轉發給正确的Redis節點。)
           

實際生産中,即使業務資料量不大也用16-64個執行個體,為什麼?

答:
預防重新分區的情況發生,這将給以後擴容帶來友善,
最好的辦法就是一開始就啟動較多執行個體,讓Redis以分布式的方式運作,
使用分區,等業務量大了,僅僅将Redis執行個體從一台服務遷移到另外一台伺服器而已。
           

Redis的Cli常用指令有那些?

答:
info memory     檢視redis大的記憶體使用情況
redis client    檢視redis目前用戶端的連接配接情況 
redis-cli	    redis指令行工具
redis-server 	啟動redis
redis-benchmark	基準測試工具
redis-check-aof	 AOF持久化檔案檢測工具和修複工具
redis-check-dump   RDB持久化檔案檢測工具和修複工具
redis-sentinel	 啟動redis-sentinel
           

Redis的緩存淘汰政策有那些?

答:
使用LRU算法淘汰,淘汰設定過期時間的資料。
使用ttl算法淘汰,淘汰設定過期時間的資料。
使用ramdom方式淘汰。
禁止淘汰。
           

下面關于Redis描述正确的是(ABC)

A、Master最好不要做任何持久化工作,如RDB記憶體快照和AOF日志檔案(對,讓slave做)
B、如果資料比較重要,某個Slave開啟AOF備份資料,政策設定為每秒同步一次
C、為了主從複制的速度和連接配接的穩定性,Master和Slave最好在同一個區域網路内
D、主從複制不要用單向連結清單結構,用圖狀結構更為穩定(錯,用鍊狀穩定)
 (鍊狀利于解決單點故障,實作Slave對Master的替換。)
           

Redis叢集的主從複制模型是怎樣的?

答:
大部分節點無法通信的情況下叢集仍然可用,是以叢集使用了主從複制模型,
每個節點都會有N-1個複制品.

關于redis下面說法正确的是(ABC)
A、Redis主要消耗記憶體資源
B、Redis叢集之間是異步複制的
C、分區可以讓Redis管理更大的記憶體
D、Redis叢集使用一緻性hash(說法錯誤,使用資料分片引入哈希槽實作)
(hash slot分區使用hash函數将資料映射到一個固定範圍的整數集合中(0-16383))
           

Redis哈希槽的概念?

答:
Redis沒有使用一緻性hash,而是引入了哈希槽的概念,叢集預設16384個桶(哈希槽),
要存值時,根據 CRC16(key) mod 16384的值,決定将一個key放到哪個桶中。
           

為什麼避免在壓力很大的主庫上增加從庫?

答:
主從複制模型,每個節點都會有N-1個複制品,通過異步複制,同步過程消化M的資源。
Master會将資料同步到slave,而slave不會将資料同步到master。
可以利用master來插入資料,slave提供檢索服務。
這樣可以有效減少單個機器的并發通路數量。
           

談談你對主庫和從庫的了解

答:
一台主庫可有多個從庫,但是一個從庫隻屬于一個主庫。
主庫隻負責寫資料,資料更新同步到它所有的從庫,而從庫隻負責讀資料。
           

單台Redis的容量建議最大是多少,為什麼?

答:
建議不超過20G,
單個Redis伺服器壓力較大,若發生單點故障損失大;
提升穩定性可以在單機上用多幾個Redis執行個體,如Master DB做雙機熱備,一主二從。
這樣整個叢集的讀和寫的可用性都非常高,
           

Redis分區的優缺點有那些?

答:
優點,資料存儲更有規律
整合了多個伺服器的存儲空間、計算能力、網絡帶寬等。
進一步充分利用大記憶體,
分區是将資料分割到不同的Redis執行個體的過程,
缺點,分區使得資料處理更複雜,比如備份資料需要備份每個執行個體伺服器上的所有資料。