不得不會的50個Redis知識點,直接分享給你!

Redis做爲目前的主流NoSql數據庫,不會是不可能的,在面試中也是很是高頻的,必定不能在這個環節丟分,不論是學習,仍是面試,如下知識點,都有必要掌握。博主會持續不斷地來更新,但願你們能夠支持我。

1.Redis是什麼?

Redis是一個開放源代碼(BSD許可)的內存中數據結構存儲,可用做數據庫,緩存和消息代理,是一個基於鍵值對的NoSQl數據庫。面試

2.Redis特性?

  • 速度快
  • 基於鍵值對的數據結構服務器
  • 豐富的功能、豐富的數據結構
  • 簡單穩定
  • 客戶端語言多
  • 持久化
  • 主從複製
  • 高能夠 & 分佈式

3.Redis合適的應用場景?

  • 緩存
  • 排行榜
  • 計數器
  • 分佈式會話
  • 分佈式鎖
  • 社交網絡
  • 最新列表
  • 消息系統

4.除了Redis你還知道哪些NoSQL數據庫?

MongoDB、MemcacheDB、Cassandra、CouchDB、Hypertable、Leveldb。redis

5.Redis和Memcache區別?

支持的存儲類型不一樣,memcached只支持簡單的k/v結構。redis支持更多類型的存儲結構類型(詳見問題6)。算法

memcached數據不可恢復,redis則能夠把數據持久化到磁盤上。docker

新版本的redis直接本身構建了VM 機制 ,通常的系統調用系統函數的話,會浪費必定的時間去移動和請求。 shell

redis當物理內存用完時,能夠將好久沒用到的value交換到磁盤。數據庫

6.Redis的有幾種數據類型?

基礎:字符串(String)、哈希(hash)、列表(list)、集合(set)、有序集合(zset)。後端

還有HyperLogLog、流、地理座標等。緩存

7.Redis有哪些高級功能?

消息隊列、自動過時刪除、事務、數據持久化、分佈式鎖、附近的人、慢查詢分析、Sentinel 和集羣等多項功能。安全

8.安裝過Redis嗎,簡單說下步驟?

1.下載Redis指定版本源碼安裝包壓縮到當前目錄。服務器

  1. 解壓縮Redis源碼安裝包。
  2. 創建一個redis目錄軟連接,指向解壓包。
  3. 進入redis目錄
  4. 編譯
  5. 安裝

    對於使用docker的童靴來講就比較容易了。

    docker pull redis

9.redis幾個比較主要的可執行文件?分別是?

image-20200425221430652

10.啓動Redis的幾種方式?

1.默認配置 :

./redis-server

2.運行啓動: redis-server 加上要修改配置名和值(能夠是多對),沒有配置的將使用默認配置。

例如: redis-server ———port 7359

3.指定配置文件啓動:

./redis-server /opt/redis/redis.conf

11.Redis配置須要本身寫?如何配置?

redis目錄下有一個redis.conf的模板配置。因此只須要複製模板配置而後修改便可。

通常來講大部分生產環境都會用指定配置文件的方式啓動redis。

12.Redis客戶端命令執行的方式?

1.交互方式:

redis-cli -h 127.0.0.1 -p 6379

鏈接到redis後,後面執行的命令就能夠經過交互方式實現了。

2.命令行方式:

redis-cli -h 127.0.0.1 -p 6379 get value

13.如何中止redis服務?

Kill -9 pid (粗暴,請不要使用,數據不只不會持久化,還會形成緩存區等資源不能被優雅關閉)

能夠用redis 的shutdown 命令,能夠選擇是否在關閉前持久化數據。

redis-cli shutdown nosave|save

14.如何查看當前鍵是否存在?

exists key

15.如何刪除數據?

del key

16.redis爲何快?單線程?

  • redis使用了單線程架構和I/O多路複用模型模型。
  • 純內存訪問。
  • 因爲是單線程避免了線程上下文切換帶來的資源消耗。

17.字符串最大不能超過多少?

512MB

18.redis默認分多少個數據庫?

16

19.redis持久化的幾種方式?

RDB、AOF、混合持久化。

20.RDB持久化?

RDB(Redis DataBase)持久化是把當前進程數據生成快照保存到硬盤的過程。

Tips:是以二進制的方式寫入磁盤。

21.RDB的持久化是如何觸發的?

手動觸發:

save: 阻塞當前Redis服務器,直到RDB過程完成爲止,若是數據比較大的話,會形成長時間的阻塞,

線上不建議。

bgsave:redis進程執行 fork操做創做子進程,持久化由子進程負責,完成後自動結束,阻塞只發生在

fork階段,一半時間很短。

自動觸發:

save xsecends n:

表示在x秒內,至少有n個鍵發生變化,就會觸發RDB持久化。也就是說知足了條件就會觸發持久化。

flushall :

主從同步觸發

22.RDB的優勢?

  • rdb是一個緊湊的二進制文件,表明Redis在某個時間點上的數據快照。
  • 適合於備份,全量複製的場景,對於災難恢復很是有用。
  • Redis加載RDB恢復數據的速度遠快於AOF方式。

23.RDB的缺點?

  • RDB無法作到實時的持久化。中途意外終止,會丟失一段時間內的數據。
  • RDB須要fork()建立子進程,屬於重量級操做,可能致使Redis卡頓若干秒。

24.如何禁用持久化?

通常來講生成環境不會用到,瞭解一下也有好處的。

config set save ""

25.AOF持久化?

AOF(append only file)爲了解決rdb不能實時持久化的問題,aof來搞定。以獨立的日誌方式記錄把每次命令記錄到aof文件中。

26.如何查詢AOF是否開啓?

config get appendonly

27.如何開啓AOF?

命令行方式: 實時生效,但重啓後失效。

config set appendonly

配置文件:須要重啓生效,重啓後依然生效。

appendonly yes

28.AOF工做流程?

1.全部寫入命令追加到aof_buf緩衝區。

2.AOF緩衝區根據對應的策略向硬盤作同步操做。

3.隨着AOF文件愈來愈大,須要按期對AOF文件進行重寫,達到壓縮的目的。

4.當redis服務器重啓時,能夠加載AOF文件進行數據恢復。

29.爲何AOF要先把命令追加到緩存區(aof_buf)中?

Redis使用單線程響應命令,若是每次寫入文件命令都直接追加到硬盤,性能就會取決於硬盤的負載。若是使用緩衝區,redis提供多種緩衝區策略,在性能和安全性方面作出平衡。

30.AOF持久化如何觸發的?

自動觸發:知足設置的策略和知足重寫觸發。

策略:(在配置文件中配置)

image-20200427101221526

手動觸發:(執行命令)

bgrewriteaof

31.AOF優勢?

  • AOF提供了3種保存策略:每秒保存、跟系統策略、每次操做保存。實時性比較高,通常來講會選擇每秒保存,所以意外發生時頂多失去一秒的數據。
  • 文件追加寫形式,因此文件不多有損壞問題,如最後意外發生少寫數據,可經過redis-check-aof工具修復。
  • AOF因爲是文本形式,直接採用協議格式,避免二次處理開銷,另外對於修改也比較靈活。

32.AOF缺點?

  • AOF文件要比RDB文件大。
  • AOF冷備沒RDB迅速。
  • 因爲執行頻率比較高,因此負載高時,性能沒有RDB好。

33.混合持久化?優缺點?

通常來講咱們的線上都會採起混合持久化。redis4.0之後添加了新的混合持久化方式。

優勢:

  • 在快速加載的同時,避免了丟失過更多的數據。

缺點:

  • 因爲混合了兩種格式,因此可讀性差。
  • 兼容性,須要4.0之後才支持。

34.Redis的Java客戶端官方推薦?實際選擇?

官方推薦的有3種:Jedis、Redisson和lettuce。

通常來講用的比較多的有:Jedis|Redisson。

Jedis:更輕量、簡介、不支持讀寫分離須要咱們來實現,文檔比較少。API提供了比較全面的Redis命令的支持。

Redisson:基於Netty實現,性能高,支持異步請求。提供了不少分佈式相關操做服務。高級功能能比較多,文檔也比較豐富,但實用上覆雜度也相對高。和Jedis相比,功能較爲簡單,不支持字符串操做,不支持排序、事務、管道、分區等Redis特性。

35.Redis事務?

事務提供了一種將多個命令請求打包,一次性、按順序的執行多個命令的機制。而且在事務執行期間,服務器不會中斷事務而改去執行其餘客戶端命令請求,它會

36.Redis事務開始到結束的幾個階段?

  • 開啓事務
  • 命令入隊
  • 執行事務/放棄事務

37.Redis中key的過時操做?

​ 設置key的生存時間爲n秒

expire key nseconds

​ 設置key的生存時間爲nmilliseconds

pxpire key milliseconds

​ 設置過時時間爲timestamp所指定的秒數時間戳

expireat key timespamp

設置過時時間爲timestamp毫秒級時間戳

pexpireat key millisecondsTimestamp

38.Redis過時鍵刪除策略?

定時刪除:在設置的過時時間同時,建立一個定時器在鍵的過時時間來臨時,當即執行隊鍵的操做刪除。

惰性刪除:聽任過時鍵無論,但每次從鍵空間中獲取鍵時,都檢查取得的鍵是否過時,若是過時就刪除,若是沒有就返回該鍵。

按期刪除:每隔一段時間執行一次刪除過時鍵操做,並經過先吃刪除操做執行的時長和頻率來減小刪除操做對cpu時間的影響。

39.Pipeline是什麼?爲何要它?

命令批處理技術,對命令進行組裝,而後一次性執行多個命令。

能夠有效的節省RTT(Round Trip Time 往返時間)。

通過測試驗證:

  • pipeline執行速度通常比逐條執行快。
  • 客戶端和服務的網絡延越大,pipeline效果越明顯。

40.如何獲取當前最大內存?如何動態設置?

獲取最大內存:

config get maxmemory

設置最大內存:

命令設置:

config set maxmemory 1GB

41.Redis內存溢出控制?

當Redis所用內存達到maxmemory上限時,會出發相應的溢出策略。

42.Redis內存溢出策略?

1.noeviction(默認策略):拒絕全部寫入操做並返回客戶端錯誤信息(error) OOM command not allowed when used memory,只響應讀操做。

  1. volatile-lru:根據LRU算法刪除設置了超時屬性(expire)的鍵,直到騰出足夠空間爲止。若是沒有可刪除的鍵對象,回退到noeviction策略。
  2. allkeys-lru:根據LRU算法刪除鍵,無論數據有沒有設置超時屬性, 直到騰出足夠空間爲止。
  3. allkeys-random:隨機刪除全部鍵,直到騰出足夠空間爲止。
  4. volatile-random:隨機刪除過時鍵,直到騰出足夠空間爲止。
  5. volatile-tth根據鍵值對象的ttl屬性,刪除最近將要過時數據。若是沒有,回退到noeviction策略。

43.Redis高可用方案?

Redis Sentinel(哨兵)能自動完成故障發現和轉移。

44.Redis集羣方案?

Twemproxy、Redis Cluster、Codis。

45.Redis Cluster槽範圍?

0~16383

46.Redis鎖實現思路?

setnx (set if not exists),若是建立成功則表示獲取到鎖。

setnx lock true 建立鎖

del lock 釋放鎖

若是中途崩潰,沒法釋放鎖?

此時須要考慮到超時時間的問題。好比 :expire lock 300

因爲命令是非原子的,因此仍是會死鎖,如何解決?

Redis 支持 set 並設置超時時間的功能。

好比: set lock true ex 30 nx

47.什麼是布隆過濾器?

是1970年由布隆提出的。它其實是一個很長的二進制向量和一系列隨機映射函數。布隆過濾器能夠用於檢索一個元素是否在一個集合中。它的優勢是空間效率和查詢時間都比通常的算法要好的多,缺點是有必定的誤識別率和刪除困難。

Tips:當判斷必定存在時,可能會誤判,當判斷不存在時,就必定不存在。

48.什麼是緩存穿透?處理問題?

緩存穿透:緩存層不命中,存儲層不命中。

處理方式1:緩存空對象,不過此時會佔用更多內存空間,因此根據你們業務特性去設置超時時間來控制內存佔用的問題。

處理方式2:布隆過濾器。

49.什麼是緩存預熱?

就是系統上線後,提早將相關數據加載到緩存系統,避免用戶先查庫,而後在緩存。

50.什麼是緩存雪崩?處理問題?

緩存雪崩:因爲緩存層承載着大量請求,有效的保護了存儲層,但若是存儲層因爲某些緣由不能提供服務,存儲層調用暴增,形成存儲層宕機。

處理:

  • 保證緩存層服務高可用性。
  • 對緩存系統作實時監控,報警等。
  • 依賴隔離組件爲後端限流並降級。
  • 作好持久化,以便數據的快速恢復。

參考:

  • 《Redis深度歷險:核心原理和應用實踐》
  • 《Redis開發與運維》
  • 《Redis設計與實現》
  • https://redis.io/
  • 百度百科
新人博主求三連,同時關注個人公衆號【Java小咖秀】回覆面試便可白嫖一份《Java全級別工程獅面試題.pdf》 持續更新,堅持✊✊✊
相關文章
相關標籤/搜索