Redis面試七連問,你能扛得住嗎?

1、使用redis有哪些好處?

  • 速度快:因為數據存在內存中,類似於HashMap,HashMap的優勢就是查找和操作的時間複雜度都是O(1)
  • 支持豐富數據類型:支持string,list,set,sorted set,hash
  • 支持事務:操作都是原子性,所謂的原子性就是對數據的更改要麼全部執行,要麼全部不執行
  • 豐富的特性:可用於緩存,消息,按key設置過期時間,過期後將會自動刪除

2、redis相比memcached有哪些優勢?

  • memcached所有的值均是簡單的字符串,redis作為其替代者,支持更為豐富的數據類型
  • redis的速度比memcached快很多
  • redis可以持久化其數據

3、redis常見性能問題和解決方案:

1).Master寫內存快照,save命令調度rdbSave函數,會阻塞主線程的工作,當快照比較大時對性能影響是非常大的,會間斷性暫停服務,所以Master最好不要寫內存快照。

2).Master AOF持久化,如果不重寫AOF文件,這個持久化方式對性能的影響是最小的,但是AOF文件會不斷增大,AOF文件過大會影響Master重啟的恢復速度。Master最好不要做任何持久化工作,包括內存快照和AOF日誌文件,特別是不要啟用內存快照做持久化,如果數據比較關鍵,某個Slave開啟AOF備份數據,策略為每秒同步一次。

3).Master調用BGREWRITEAOF重寫AOF文件,AOF在重寫的時候會佔大量的CPU和內存資源,導致服務load過高,出現短暫服務暫停現象。

4).Redis主從複製的性能問題,為了主從複製的速度和連接的穩定性,Slave和Master最好在同一個局域網內

4、mySQL裡有2000w數據,redis中只存20w的數據,如何保證redis中的數據都是熱點數據

相關知識:redis 內存數據集大小上升到一定大小的時候,就會施行數據淘汰策略(回收策略)。redis 提供 6種數據淘汰策略:

  • volatile-lru:從已設置過期時間的數據集(server.db[i].expires)中挑選最近最少使用的數據淘汰
  • volatile-ttl:從已設置過期時間的數據集(server.db[i].expires)中挑選將要過期的數據淘汰
  • volatile-random:從已設置過期時間的數據集(server.db[i].expires)中任意選擇數據淘汰
  • allkeys-lru:從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰
  • allkeys-random:從數據集(server.db[i].dict)中任意選擇數據淘汰
  • no-enviction(驅逐):禁止驅逐數據

5、請用Redis和任意語言實現一段惡意登錄保護的代碼,限制1小時內每用戶Id最多隻能登錄5次。

具體登錄函數或功能用空函數即可,不用詳細寫出。

用列表實現:列表中每個元素代表登陸時間,只要最後的第5次登陸時間和現在時間差不超過1小時就禁止登陸。用Python寫的代碼如下:

Redis面試七連問,你能扛得住嗎?

6、redis的併發競爭問題如何解決?

Redis為單進程單線程模式,採用隊列模式將併發訪問變為串行訪問。Redis本身沒有鎖的概念,Redis對於多個客戶端連接並不存在競爭,但是在Jedis客戶端對Redis進行併發訪問時會發生連接超時、數據轉換錯誤、阻塞、客戶端關閉連接等問題,這些問題均是

由於客戶端連接混亂造成。對此有2種解決方法:

  • 客戶端角度,為保證每個客戶端間正常有序與Redis進行通信,對連接進行池化,同時對客戶端讀寫Redis操作採用內部鎖synchronized。
  • 服務器角度,利用setnx實現鎖。

注:對於第一種,需要應用程序自己處理資源的同步,可以使用的方法比較通俗,可以使用synchronized也可以使用lock;第二種需要用到Redis的setnx命令,但是需要注意一些問題。

Redis面試七連問,你能扛得住嗎?

7.redis持久化的幾種方式

1、快照(snapshots)

缺省情況情況下,Redis把數據快照存放在磁盤上的二進制文件中,文件名為dump。rdb。你可以配置Redis的持久化策略,例如數據集中每N秒鐘有超過M次更新,就將數據寫入磁盤;或者你可以手工調用命令SAVE或BGSAVE。

工作原理

  • Redis forks。
  • 子進程開始將數據寫到臨時RDB文件中。
  • 當子進程完成寫RDB文件,用新文件替換老文件。
  • 這種方式可以使Redis使用copy-on-write技術。

2、AOF

快照模式並不十分健壯,當系統停止,或者無意中Redis被kill掉,最後寫入Redis的數據就會丟失。這對某些應用也許不是大問題,但對於要求高可靠性的應用來說,Redis就不是一個合適的選擇。

Append-only文件模式是另一種選擇。你可以在配置文件中打開AOF模式。

3、虛擬內存方式

當你的key很小而value很大時,使用VM的效果會比較好。因為這樣節約的內存比較大。當你的key不小時,可以考慮使用一些非常方法將很大的key變成很大的value,比如你可以考慮將key,value組合成一個新的value。
  
vm-max-threads這個參數,可以設置訪問swap文件的線程數,設置最好不要超過機器的核數,如果設置為0,那麼所有對swap文件的操作都是串行的。可能會造成比較長時間的延遲,但是對數據完整性有很好的保證。

自己測試的時候發現用虛擬內存性能也不錯。如果數據量很大,可以考慮分佈式或者其他數據庫


分享到:


相關文章: