干貨 | 關于Redis 的面試題(Java面試)



       1.Redis是什么?
      Redis本質上是一個Key-Value類型的內存數據庫,很像memcached,整個數據庫統統加載在內存當中進行操作,定期通過異步操作把數據庫數據flush到硬盤上進行保存。

      因為是純內存操作,Redis 的性能非常出色,每秒可以處理超過10萬次讀寫操作,是已知性能最快的Key-Value DB。

      Redis的出色之處不僅僅是性能,Redis 最大的魅力是支持保存多種數據結構,此外單個value的最大限制是1GB,不像memcached只能保存1MB的數據,因此Redis可以用來實現很多有用的功能。

      比方說用他的List來做FIFO雙向鏈表,實現一個輕量級的高性能消息隊列服務,用他的Set可以做高性能的tag系統等等。

      2.Redis相比memcached有哪些優勢?
      ① memcached所有的值均是簡單的字符串,redis作為 其替代者,支持更為豐富的數據類型
      ②redis的速度比memcached快很多
      ③ redis可以持久化其數據

      3.Redis有哪幾種數據淘汰策略?
      Redis有哪幾種數據淘汰策略?有noeviction、allkeys-lru、allkeys-random、volatile-random、volatile-ttl五種淘汰策略,下面我們分別介紹。

      noeviction:返回錯誤當內存限制達到并且客戶端嘗試執行會讓更多內存被使用的命令(部分的寫入指令,但DEL和幾個例外)

      allkeys-lru:嘗試回收最少使用的鍵(LRU),使得新添加的數據有空間存放。

      volatile-lru:嘗試回收最少使用的鍵(LRU),但僅限于在過期集合的鍵,使得新添加的數據有空間存放。

      allkeys-random:回收隨機的鍵使得新添加的數據有空間存放。

      volatile-random:回收隨機的鍵使得新添加的數據有空間存放,但僅限于在過期集合的鍵。

      volatile-ttl:回收在過期集合的鍵,并且優先回收存活時間(TTL)較短的鍵,使得新添加的數據有空間存放

      4.Redis所有數據放到內存中的原因是什么?
      Redis為了達到最快的讀寫速度將數據都讀到內存中,并通過異步的方式將數據寫入磁盤。

      所以redis具有快速和數據持久化的特征。如果不將數據放在內存中,磁盤I/O速度為嚴重影響redis的性能。在內存越來越便宜的今天,redis將會越來越受歡迎。如果設置了最大使用的內存,則數據已有記錄數達到內存限值后不能繼續插入新值。

      5.Redis適合在哪些場景使用?
      ①會話緩存(Session Cache)
      最常用的一種使用Redis的情景是會話緩存(session cache)。用Redis緩存會話比其他存儲(如Mem cached)的優勢在于:Redis提供持久化。當維護一個不是嚴格要求一致性的緩存時,如果用戶的購物車信息全部丟失,大部分人都會不高興的,現在,他們還會這樣嗎?

      幸運的是,隨著Redis這些年的改進,很容易找到怎么恰當的使用Redis來緩存會話的文檔。甚至廣為人知的商業平臺Magento也提供Redis的插件。

      ②全頁緩存(FPC)
      除基本的會話token之外,Redis 還提供很簡便的FPC平臺。回到一致性問題,即使重啟了Redis實例,因為有磁盤的持久化,用戶也不會看到頁面加載速度的下降,這是一個極大改進,類似PHP本地FPC。

      再次以Magento為例,Magento 提供一個插件來使用Redis 作為全頁緩存后端。

      此外,對WordPress的用戶來說,Pantheon 有一個非常好的插件wp redis,這個插件能幫助你以最快速度加載你曾瀏覽過的頁面。

      ③隊列
      Reids在內存存儲引擎領域的一-大優點是提供list和set操作,這使得Redis能作為一個很好的消息隊列平臺來使用。Redis作為隊列使用的操作,就類似于本地程序語言(如Python)對list 的push/pop操作。

      如果你快速的在Google中搜索“Redis queues",你馬上就能找到大量的開源項目,這些項目的目的就是利用Redis創建非常好的后端工具,以滿足各種隊列需求。例如,Celery 有一個后臺就是使用Redis作為broker,你可以從這里去查看。

      ④排行榜/計數器
      Redis在內存中對數字進行遞增或遞減的操作實現的非常好。集合(Set)和有序集合(Sorted Set)也使得我們在執行這些操作的時候變的非常簡單,Redis 只是正好提供了這

      兩種數據結構。所以,我們要從排序集合中獲取到排名最靠前的10個用戶-我們稱之為“user_scores", 我們只需要像下面一樣執行即可:

      當然,這是假定你是根據你用戶的分數做遞增的排序。如果你想返回用戶及用戶的分數,你需要這樣執行:
      ZRANGE user scores 0 10 WITHSCORES

      Agora Games就是一個很好的例子,用Ruby實現的,它的排行榜就是使用Redis來存儲數據的,你可以在這里看到。

      ⑤發布/訂閱
      最后(但肯定不是最不重要的)是Redis的發布/訂閱功能。發布/訂閱的使用場景確實非常多。我已看見人們在社交網絡連接中使用,還可作為基于發布/訂閱的腳本觸發器,甚至用Redis的發布/訂閱功能來建立聊天系統!

      6.Redis集群方案哪些方案?
      ①codis
      目前用的最多的集群方案,基本和twemproxy-致的效果,但它支持在節點數量改變情況下,舊節點數據可恢復到新hash節點。

      ②redis
      cluster3.0自帶的集群,特點在于他的分布式算法不是一致性hash,而是hash槽的概念,以及自身支持節點設置從節點。具體看官方文檔介紹。

      ③在業務代碼層實現
      起幾個毫無關聯的redis實例,在代碼層,對key進行hash計算,然后去對應的redis實例操作數據。這種方式對hash層代碼要求比較高,考慮部分包括,節點失效后的替代算法方案,數據震蕩后的自動腳本恢復,實例的監控,等等。

      北大青鳥網上報名
      北大青鳥招生簡章
      主站蜘蛛池模板: 亚洲午夜精品一区二区| 久久精品中文字幕一区| 日本一区二区三区在线网 | 午夜视频一区二区| 精品国产一区二区三区在线| 国产成人综合亚洲一区| 免费一区二区无码东京热| 日韩精品视频一区二区三区| 一本一道波多野结衣一区| 国产一区内射最近更新| 日韩精品成人一区二区三区| 亚洲综合一区二区三区四区五区| 国产激情一区二区三区在线观看 | 国产伦精品一区二区三区免.费 | 人妻无码一区二区三区AV| 影院成人区精品一区二区婷婷丽春院影视 | 国产精品区一区二区三在线播放| 欲色aV无码一区二区人妻| 国产成人无码精品一区在线观看| 精品黑人一区二区三区| 久久99久久无码毛片一区二区| 一区二区视频在线| 一区二区三区免费精品视频| 亚洲熟妇av一区二区三区下载| 全国精品一区二区在线观看| 精品无码人妻一区二区三区| 一区视频免费观看| 中文字幕人妻AV一区二区| 精品福利一区二区三区精品国产第一国产综合精品 | 亚洲视频一区在线| 一区二区三区在线视频播放| 亚洲熟妇AV一区二区三区浪潮| 日产一区日产2区| 在线精品自拍亚洲第一区| 亚洲AV无码一区二区三区在线| 麻豆视传媒一区二区三区| 一区二区亚洲精品精华液| 亚洲av一综合av一区| 蜜桃视频一区二区三区| 乱码人妻一区二区三区| 久久国产精品无码一区二区三区|