1. 程式人生 > 其它 >鎖屏面試題百日百刷-Redis篇(一)

鎖屏面試題百日百刷-Redis篇(一)

  鎖屏面試題百日百刷,每個工作日堅持更新面試題。鎖屏面試題app、小程式現已上線,官網地址:https://www.demosoftware.cc/#/introductionPage。已收錄了每日更新的面試題的所有內容,還包含特色的解鎖螢幕複習面試題、每日程式設計題目郵件推送等功能。讓你在面試中先人一步,吊打面試官!接下來的是今日的面試題:

====Redis 的特點?

Redis 是由義大利人 Salvatore Sanfilippo(網名:antirez)開發的一款記憶體快取記憶體資料庫。Redis 全稱為:Remote Dictionary Server(遠端資料服務),該軟體使用

C 語言編寫,典型的 NoSQL 資料庫伺服器,Redis 是一個 key-value 儲存系統,它支援豐富的資料型別,如:stringlistsetzset(sorted set)hash

Redis 本質上是一個 Key-Value 型別的記憶體資料庫,很像 memcached,整個 資料庫統統載入在記憶體當中進行操作,定期通過非同步操作把資料庫資料 flush 到硬碟 上進行儲存。因為是純記憶體操作,Redis 的效能非常出色,每秒可以處理超過 10 萬次讀寫操作,是已知效能最快的 Key-Value DB

Redis 的出色之處不僅僅是效能,Redis 最大的魅力是支援儲存多種資料結構,此外單 個

value 的最大限制是1GB,不像 memcached 只能儲存 1MB 的資料,另外 Redis 也可以對存入的 Key-Value 設定 expire 時間。

Redis 的主要缺點是資料庫容量受到實體記憶體的限制,不能用作海量資料的高效能讀寫,因此 Redis 適合的場景主要侷限在較小資料量的高效能操作和運算上。

====為什麼 redis 需要把所有資料放到記憶體中?

Redis 為了達到最快的讀寫速度將資料都讀到記憶體中,並通過非同步的方式將資料寫入磁碟。所以 redis 具有快速和資料持久化的特徵。如果不將資料放在記憶體中,磁碟 I/O 速度為嚴重影響 redis 的效能。在記憶體越來越便宜的今天,

redis 將會越來越受歡迎。如果設定了最大使用的記憶體,則資料已有記錄數達到記憶體限值後不能繼續插入新值。

====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 最好在同一個區域網內

====Redis 最適合的場景有哪些?

(1)、會話快取(Session Cache

(2)、全頁快取(FPC

(3)、佇列

(4)、排行榜/計數器

(5)、釋出/訂閱

====Memcache Redis 的區別都有哪些?

(1)、儲存方式不同,Memcache 是把資料全部存在記憶體中,資料不能超過記憶體的大小,斷電後資料庫會掛掉。Redis 有部分存在硬碟上,這樣能保證資料的永續性。

2)、資料支援的型別不同 memcahe 對資料型別支援相對簡單,redis 有複雜的資料型別。

3)、使用底層模型不同 它們之間底層實現方式 以及與客戶端之間通訊的應用協議不一樣。Redis 直接自己構建了 VM 機制 ,因為一般的系統呼叫系統函式的話,會浪費一定的時間去移動和請求。

4)、支援的 value 大小不一樣 redis 最大可以達到 1GB,而 memcache 只有 1MB

====Redis有哪幾種資料結構?以及如何使用?

Redis 的資料結構有五種,分別是:

String——字串

String 資料結構是簡單的 key-value 型別,value 不僅可以是 String,也可以是數字(當數字型別用 Long 可以表示的時候 encoding 就是整型,其他都儲存在 sdshdr 當做字串)。

使用:get set del incrdecr

127.0.0.1:6379> set hello world

OK

127.0.0.1:6379> get hello

"world"

127.0.0.1:6379> del hello

(integer) 1

127.0.0.1:6379> get hello

(nil)

127.0.0.1:6379> get counter

"2"

127.0.0.1:6379> incr counter

(integer) 3

127.0.0.1:6379> get counter

"3"

127.0.0.1:6379> incrby counter 100

(integer) 103

127.0.0.1:6379> get counter

"103"

127.0.0.1:6379> decr counter

(integer) 102

127.0.0.1:6379> get counter

"102"

Hash——字典

Memcached 中,我們經常將一些結構化的資訊打包成 hashmap,在客戶端序列化後儲存為一個字串的值(一般是 JSON 格式),比如使用者的暱稱、年齡、性別、積分等。

使用:所有hash的命令都是 h 開頭的 hget hset hdel

127.0.0.1:6379> hset user name1 hao

(integer) 1

127.0.0.1:6379> hset user email1 [email protected]

(integer) 1

127.0.0.1:6379> hgetall user

1) "name1"

2) "hao"

3) "email1"

4) "[email protected]"

127.0.0.1:6379> hget user user

(nil)

127.0.0.1:6379> hget user name1

"hao"

127.0.0.1:6379> hset user name2 xiaohao

(integer) 1

127.0.0.1:6379> hset user email2 [email protected]

(integer) 1

127.0.0.1:6379> hgetall user

1) "name1"

2) "hao"

3) "email1"

4) "[email protected]"

5) "name2"

6) "xiaohao"

7) "email2"

8) "[email protected]"

List——列表

List 說白了就是連結串列(redis 使用雙端連結串列實現的 List),相信學過資料結構知識的人都應該能理解其結構。

使用:

lpush+lpop=Stack()

lpush+rpop=Queue(佇列)

lpush+ltrim=Capped Collection(有限集合)

lpush+brpop=Message Queue(訊息佇列)

127.0.0.1:6379> lpush mylist 1 2 ll ls mem

(integer) 5

127.0.0.1:6379> lrange mylist 0 -1

1) "mem"

2) "ls"

3) "ll"

4) "2"

5) "1"

Set——集合

Set 就是一個集合,集合的概念就是一堆不重複值的組合。利用 Redis 提供的 Set 資料結構,可以儲存一些集合

使用:命令都是以s開頭的 saddsremscardsmemberssismember性的資料。

127.0.0.1:6379> sadd myset hao hao1 xiaohao hao

(integer) 3

127.0.0.1:6379> SMEMBERS myset

1) "xiaohao"

2) "hao1"

3) "hao"

127.0.0.1:6379> SISMEMBER myset hao

(integer) 1

ZSet——有序集合

Set 相比,Zset是將 Set 中的元素增加了一個權重引數 score,使得集合中的元素能夠按 score 進行有序排列,

使用: 有序集合的命令都是 z 開頭 zadd zrangezscore

127.0.0.1:6379> zadd myscoreset 100 hao 90 xiaohao

(integer) 2

127.0.0.1:6379> ZRANGE myscoreset 0 -1

1) "xiaohao"

2) "hao"

127.0.0.1:6379> ZSCORE myscoreset hao

"100"

更多面試題可關注"demo鎖屏面試題"公眾號通過小程式或App獲取面試題和學習資源