【redis】相關面試問題

請你回答一下mongodb和redis的區別

內存管理機制上:Redis 數據全部存在內存,定期寫入磁盤,當內存不夠時,可以選擇指定的 LRU 算法刪除數據。MongoDB 數據存在內存,由 linux系統 mmap 實現,當內存不夠時,只將熱點數據放入內存,其他數據存在磁盤。

支持的數據結構上:Redis 支持的數據結構豐富,包括hash、set、list等。

MongoDB 數據結構比較單一,但是支持豐富的數據表達,索引,最類似關係型數據庫,支持的查詢語言非常豐富

請你來說一下Redis和memcached的區別

1)數據類型 :redis數據類型豐富,支持set liset等類型;memcache支持簡單數據類型,需要客戶端自己處理複雜對象

2)持久性:redis支持數據落地持久化存儲;memcache不支持數據持久存儲。)

3)分佈式存儲:redis支持master-slave複製模式;memcache可以使用一致性hash做分佈式。

4)value大小不同:memcache是一個內存緩存,key的長度小於250字符,單個item存儲要小於1M,不適合虛擬機使用

5)數據一致性不同:redis使用的是單線程模型,保證了數據按順序提交;memcache需要使用cas保證數據一致性。CAS(Check and Set)是一個確保併發一致性的機制,屬於“樂觀鎖”範疇;原理很簡單:拿版本號,操作,對比版本號,如果一致就操作,不一致就放棄任何操作

6)cpu利用:redis單線程模型只能使用一個cpu,可以開啓多個redis進程

請你來說一說Redis的定時機制怎麼實現的

Redis服務器是一個事件驅動程序,服務器需要處理以下兩類事件:文件事件(服務器對套接字操作的抽象)和時間事件(服務器對定時操作的抽象)。Redis的定時機制就是藉助時間事件實現的。

一個時間事件主要由以下三個屬性組成:id:時間事件標識號;when:記錄時間事件的到達時間;timeProc:時間事件處理器,當時間事件到達時,服務器就會調用相應的處理器來處理時間。一個時間事件根據時間事件處理器的返回值來判斷是定時事件還是週期性事件

 

一個時間事件主要由以下三個屬性組成:id:時間事件標識號;when:記錄時間事件的到達時間;timeProc:時間事件處理器,當時間事件到達時,服務器就會調用相應的處理器來處理時間。一個時間事件根據時間事件處理器的返回值來判斷是定時事件還是週期性事件。

請你來說一說Redis是單線程的,但是爲什麼這麼高效呢?

雖然Redis文件事件處理器以單線程方式運行,但是通過使用I/O多路複用程序來監聽多個套接字,文件事件處理器既實現了高性能的網絡通信模型,又可以很好地與Redis服務器中其他同樣以單線程運行的模塊進行對接,這保持了Redis內部單線程設計的簡單性。

請問Redis的數據類型有哪些,底層怎麼實現?

1)字符串:整數值、embstr編碼的簡單動態字符串、簡單動態字符串(SDS)

2)列表:壓縮列表、雙端鏈表

3)哈希:壓縮列表、字典

4)集合:整數集合、字典

5)有序集合:壓縮列表、跳躍表和字典

請問Redis的rehash怎麼做的,爲什麼要漸進rehash,漸進rehash又是怎麼實現的?

因爲redis是單線程,當K很多時,如果一次性將鍵值對全部rehash,龐大的計算量會影響服務器性能,甚至可能會導致服務器在一段時間內停止服務。不可能一步完成整個rehash操作,所以redis是分多次、漸進式的rehash。漸進性哈希分爲兩種:

1)操作redis時,額外做一步rehash

對redis做讀取、插入、刪除等操作時,會把位於table[dict->rehashidx]位置的鏈表移動到新的dictht中,然後把rehashidx做加一操作,移動到後面一個槽位。

2)後臺定時任務調用rehash

後臺定時任務rehash調用鏈,同時可以通過server.hz控制rehash調用頻率

請問Redis怎麼實現的定期刪除功能

請你說一說Redis對應的命令和數據類型..

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章