Redis作爲目前的主流NoSql數據庫,不會是不可能的,在面試中也是非常高頻的,一定不能在這個環節丟分,不管是學習,還是面試,以下知識點,都有必要掌握。博主會持續不斷地來更新,希望大家可以支持我。
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幾個比較主要的可執行文件?分別是?
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持久化如何觸發的?
自動觸發:滿足設置的策略和滿足重寫觸發。
策略:(在配置文件中配置)
手動觸發:(執行命令)
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.什麼是緩存雪崩?處理問題?
緩存雪崩:由於緩存層承載着大量請求,有效的保護了存儲層,但如果存儲層由於某些原因不能提供服務,存儲層調用暴增,造成存儲層宕機。
處理:
- 保證緩存層服務高可用性。
- 對緩存系統做實時監控,報警等。
- 依賴隔離組件爲後端限流並降級。
- 做好持久化,以便數據的快速恢復。
參考:
-
《Redis深度歷險:核心原理和應用實踐》
-
《Redis開發與運維》
-
《Redis設計與實現》
-
https://redis.io/
-
百度百科
新人博主求三連,同時關注我的公衆號【Java小咖秀】回覆面試即可白嫖一份《Java全級別工程獅面試題.pdf》 持續更新,堅持✊✊✊