好文收集之Redis : 面試題

面試 = 水平測試,並非面試官要爲難你,是要肯定你的水平react

  • 天下無難試之Redis面試刁難大全面試

    這幾個題,講的很全面,言簡意賅。而且對問題有深度。redis

    • Redis有哪些數據結構?
    • 使用過Redis分佈式鎖麼,它是什麼回事?
    • 假如Redis裏面有1億個key,其中有10w個key是以某個固定的已知的前綴開頭的,若是將它們所有找出來?
    • 使用過Redis作異步隊列麼,你是怎麼用的?
    • 若是有大量的key須要設置同一時間過時,通常須要注意什麼?
    • Redis如何作持久化的?
    • Pipeline有什麼好處,爲何要用pipeline?
    • Redis的同步機制瞭解麼?
    • 是否使用過Redis集羣,集羣的原理是什麼?有哪幾種集羣方式?各有什麼好壞?
    • Redis是單線程仍是多線程?
    • Redis 能夠處理的併發量?
    • Redis 爲何那麼快?
      • 純內存操做
      • I/O 多路複用
  • I/O多路複用技術(multiplexing)是什麼?服務器

    專門針對I/O多路複用技術作了瞭解,由於對Linux底層技術不瞭解,這裏有個例子,算是明白了I/O多路複用是幹嗎的了。數據結構

    =========多線程

    下面舉一個例子,模擬一個tcp服務器處理30個客戶socket。假設你是一個老師,讓30個學生解答一道題目,而後檢查學生作的是否正確,你有下面幾個選擇:併發

    1. 第一種選擇:按順序逐個檢查,先檢查A,而後是B,以後是C、D。。。這中間若是有一個學生卡主,全班都會被耽誤。這種模式就比如,你用循環挨個處理socket,根本不具備併發能力。
    2. 第二種選擇:你建立30個分身,每一個分身檢查一個學生的答案是否正確。 這種相似於爲每個用戶建立一個進程或者線程處理鏈接。
    3. 第三種選擇,你站在講臺上等,誰解答完誰舉手。這時C、D舉手,表示他們解答問題完畢,你下去依次檢查C、D的答案,而後繼續回到講臺上等。此時E、A又舉手,而後去處理E和A。。。

    這種就是IO複用模型,Linux下的select、poll和epoll就是幹這個的。將用戶socket對應的fd註冊進epoll,而後epoll幫你監聽哪些socket上有消息到達,這樣就避免了大量的無用操做。此時的socket應該採用非阻塞模式。異步

    這樣,整個過程只在調用select、poll、epoll這些調用的時候纔會阻塞,收發客戶消息是不會阻塞的,整個進程或者線程就被充分利用起來,這就是事件驅動,所謂的reactor模式。socket

    ================tcp

    本身的理解:

    Redis是採用TCP鏈接的,鏈接TCP的socket在全部數據準備好以前,socket不可用。請求是進來了,數據包還不完整,因此還不能處理這個請求。

    那麼對於已經準備數據包的socket,Redis線程能夠一次性這些請求都接收來,而後去內存處理。都處理完後,將結果再都帶回到socket。接下來再去處理準備好的socket。

    因此redis的多路複用,不是每個請求處理一次,而是一次處理多個請求。因此純內存操做的單線程,效率也很高。

相關文章
相關標籤/搜索