天天看點

剛去面試現場聊了一個多小時的Redis ,題直接拿來分享!

1.Redis是什麼?

Redis是一個開放源代碼(BSD許可)的記憶體中資料結構存儲,可用作資料庫,緩存和消息代理,是一個基于鍵值對的NoSQl資料庫。

2.Redis特性?

速度快

基于鍵值對的資料結構伺服器

豐富的功能、豐富的資料結構

簡單穩定

用戶端語言多

持久化

主從複制

高可以 & 分布式

3.Redis合适的應用場景?

緩存

排行榜

計數器

分布式會話

分布式鎖

社交網絡

最新清單

消息系統

4.除了Redis你還知道哪些NoSQL資料庫?

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

5.Redis和Memcache差別?

支援的存儲類型不同,memcached隻支援簡單的k/v結構。redis支援更多類型的存儲結構類型(詳見問題6)。

memcached資料不可恢複,redis則可以把資料持久化到磁盤上。

新版本的redis直接自己建構了VM 機制 ,一般的系統調用系統函數的話,會浪費一定的時間去移動和請求。

redis當實體記憶體用完時,可以将很久沒用到的value交換到磁盤。

6.Redis的有幾種資料類型?

基礎:字元串(String)、哈希(hash)、清單(list)、集合(set)、有序集合(zset)。

還有HyperLogLog、流、地理坐标等。

7.Redis有哪些進階功能?

消息隊列、自動過期删除、事務、資料持久化、分布式鎖、附近的人、慢查詢分析、Sentinel 和叢集等多項功能。

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

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

解壓縮Redis源碼安裝包。

建立一個redis目錄軟連結,指向解壓包。

進入redis目錄

編譯

安裝

對于使用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 getvalue複制代碼

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過程完成為止,如果

QQ靓号轉讓

資料比較大的話,會造成長時間的阻塞,

線上不建議。

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 setsave""複制代碼

25.AOF持久化?

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

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

config get appendonly

27.如何開啟AOF?

指令行方式: 實時生效,但重新開機後失效。

config set appendonly

配置檔案:需要重新開機生效,重新開機後依然生效。

appendonlyyes複制代碼

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,隻響應讀操作。

volatile-lru:根據LRU算法删除設定了逾時屬性(expire)的鍵,直到騰出足夠空間為止。如果沒有可删除的鍵對象,回退到noeviction政策。

allkeys-lru:根據LRU算法删除鍵,不管資料有沒有設定逾時屬性, 直到騰出足夠空間為止。

allkeys-random:随機删除所有鍵,直到騰出足夠空間為止。

volatile-random:随機删除過期鍵,直到騰出足夠空間為止。

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.什麼是緩存雪崩?處理問題?

緩存雪崩:由于緩存層承載着大量請求,有效的保護了存儲層,但如果存儲層由于某些原因不能提供服務,存儲層調用暴增,造成存儲層當機。

處理:

保證緩存層服務高可用性。

對緩存系統做實時監控,報警等。

依賴隔離元件為後端限流并降級。

做好持久化,以便資料的快速恢複。