Redis知識點大全及面試寶典

1.Redis 持久化機制

介紹

Redis是一個支持持久化的內存數據庫,通過持久化機制把內存中的數據同步到硬盤文件來保證數據持久化。當Redis重啓後通過把硬盤文件重新加載到內存,就能達到恢復數據的目的。

RDB

RDB是Redis默認的持久化方式。按照一定的時間週期策略把內存的數據以快照的形式保存到硬盤的二進制文件。即Snapshot快照存儲,對應產生的數據文件爲dump.rdb,通過配置文件中的save參數來定義快照的週期。( 快照可以是其所表示的數據的一個副本,也可以是數據的一個複製品。)

AOF

Redis會將每一個收到的寫命令都通過Write函數追加到文件最後,類似於MySQL的binlog。當Redis重啓是會通過重新執行文件中保存的寫命令來在內存中重建整個數據庫的內容。
當兩種方式同時開啓時,數據恢復Redis會優先選擇AOF恢復

可參考詳細教程

2. Memcache與Redis的區別都有哪些?

1)、存儲方式 Memecache把數據全部存在內存之中,斷電後會掛掉,數據不能超過內存大小。 Redis有部份存在硬盤上,redis可以持久化其數據
2)、數據支持類型 memcached所有的值均是簡單的字符串,redis作爲其替代者,支持更爲豐富的數據類型 ,提供list,set,zset,hash等數據結構的存儲
3)、使用底層模型不同 它們之間底層實現方式 以及與客戶端之間通信的應用協議不一樣。 Redis直接自己構建了VM 機制 ,因爲一般的系統調用系統函數的話,會浪費一定的時間去移動和請求。
4). value 值大小不同:Redis 最大可以達到 512M;memcache 只有 1mb。
5)redis的速度比memcached快很多
6)Redis支持數據的備份,即master-slave模式的數據備份。

3.單線程的redis爲什麼這麼快

(一)純內存操作
(二)單線程操作,避免了頻繁的上下文切換
(三)採用了非阻塞I/O多路複用機制

4.redis的數據類型,以及每種數據類型的使用場景

String

最常規的set/get操作,value可以是String也可以是數字。一般做一些複雜的計數功能的緩存。

hash

這裏value存放的是結構化的對象,比較方便的就是操作其中的某個字段。單點登錄就是用這種數據結構存儲用戶信息,以cookieId作爲key,設置30分鐘爲緩存過期時間,能很好的模擬出類似session的效果。

list

使用List的數據結構,可以做簡單的消息隊列的功能。另外還有一個就是,可以利用lrange命令,做基於redis的分頁功能,性能極佳,用戶體驗好。栗子:就也是個生產者和消費者的場景。LIST可以很好的完成排隊,先進先出的原則。

set

因爲set堆放的是一堆不重複值的集合。所以可以做全局去重的功能。爲什麼不用JVM自帶的Set進行去重?因爲我們的系統一般都是集羣部署,使用JVM自帶的Set,比較麻煩,難道爲了一個做一個全局去重,再起一個公共服務,太麻煩了。
另外,就是利用交集、並集、差集等操作,可以計算共同喜好,全部的喜好,自己獨有的喜好等功能。

sorted set

sorted set多了一個權重參數score,集合中的元素能夠按score進行排列。可以做排行榜應用,取TOP N操作。

5.Redis 爲什麼是單線程的

因爲Redis是基於內存的操作,CPU不是Redis的瓶頸,Redis的瓶頸最有可能是機器內存的大小或者網絡帶寬。既然單線程容易實現,而且CPU不會成爲瓶頸,那就順理成章地採用單線程的方案了(畢竟採用多線程會有很多麻煩!)Redis利用隊列技術將併發訪問變爲串行訪問

1)絕大部分請求是純粹的內存操作(非常快速)

2)採用單線程,避免了不必要的上下文切換和競爭條件

3)非阻塞IO優點:

1.速度快

因爲數據存在內存中,類似於HashMap,HashMap的優勢就是查找和操作的時間複雜度都是O(1)

2. 支持豐富數據類型

支持string,list,set,sorted set,hash

3.支持事務

操作都是原子性,所謂的原子性就是對數據的更改要麼全部執行,要麼全部不執行

4. 豐富的特性

可用於緩存,消息,按key設置過期時間,過期後將會自動刪除如何解決redis的併發競爭key問題

5. 可用於緩存,消息

按key設置過期時間,過期後將會自動刪除如何解決redis的併發競爭key問題

6.有沒有嘗試進行多機redis 的部署?如何保證數據一致的?

主從複製,讀寫分離
一類是主數據庫(master)一類是從數據庫(slave),主數據庫可以進行讀寫操作,當發生寫操作的時候自動將數據同步到從數據庫,而從數據庫一般是隻讀的,並接收主數據庫同步過來的數據,一個主數據庫可以有多個從數據庫,而一個從數據庫只能有一個主數據庫。

7.對於大量的請求怎麼樣處理

redis是一個單線程程序,也就說同一時刻它只能處理一個客戶端請求;
redis是通過IO多路複用(select,epoll, kqueue,依據不同的平臺,採取不同的實現)來處理多個客戶端請求的

8.爲什麼Redis的操作是原子性的,怎麼保證原子性的?

於Redis而言,命令的原子性指的是:一個操作的不可以再分,操作要麼執行,要麼不執行。
Redis的操作之所以是原子性的,是因爲Redis是單線程的。
Redis本身提供的所有API都是原子操作,Redis中的事務其實是要保證批量操作的原子性。
多個命令在併發中也是原子性的嗎?
不一定, 將get和set改成單命令操作,incr 。使用Redis的事務,或者使用Redis+Lua==的方式實現.

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