關於Redis的常見面試題解析

来源:https://www.cnblogs.com/shsxt/archive/2019/04/24/10763608.html
-Advertisement-
Play Games

1. 使用redis有哪些好處? (1) 速度快,因為數據存在記憶體中,類似於HashMap,HashMap的優勢就是查找和操作的時間複雜度都是O(1) (2) 支持豐富數據類型,支持string,list,set,sorted set,hash (3) 支持事務,操作都是原子性,所謂的原子性就是對數 ...


1. 使用redis有哪些好處?

(1) 速度快,因為數據存在記憶體中,類似於HashMapHashMap的優勢就是查找和操作的時間複雜度都是O(1)

(2) 支持豐富數據類型,支持stringlistsetsorted sethash

(3) 支持事務,操作都是原子性,所謂的原子性就是對數據的更改要麼全部執行,要麼全部不執行

(4) 豐富的特性:可用於緩存,消息,按key設置過期時間,過期後將會自動刪除

 

2、Redis支持的數據類型

 

String字元串:

格式: set key value

string類型是二進位安全的。意思是redisstring可以包含任何數據。比如jpg圖片或者序列化的對象 。

string類型是Redis最基本的數據類型,一個鍵最大能存儲512MB

 

Hash(哈希)

格式: hmset name  key1 value1 key2 value2

Redis hash 是一個鍵值(key=>value)對集合。

Redis hash是一個string類型的fieldvalue的映射表,hash特別適合用於存儲對象。

 

List(列表)

Redis 列表是簡單的字元串列表,按照插入順序排序。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)

格式: lpush  name  value

key 對應 list 的頭部添加字元串元素

格式: rpush  name  value

key 對應 list 的尾部添加字元串元素

格式: lrem name  index

key 對應 list 中刪除 count 個和 value 相同的元素

格式: llen name  

返回 key 對應 list 的長度

 

Set(集合)

格式: sadd  name  value

RedisSetstring類型的無序集合。

集合是通過哈希表實現的,所以添加,刪除,查找的複雜度都是O(1)

 

zset(sorted set:有序集合)

格式: zadd  name score value

Redis zset set 一樣也是string類型元素的集合,且不允許重覆的成員。

不同的是每個元素都會關聯一個double類型的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。

zset的成員是唯一的,但分數(score)卻可以重覆。

 

3、什麼是Redis持久化?Redis有哪幾種持久化方式?優缺點是什麼?

持久化就是把記憶體的數據寫到磁碟中去,防止服務宕機了記憶體數據丟失。

Redis 提供了兩種持久化方式:RDB(預設) AOF 

 

RDB

rdbRedis DataBase縮寫

功能核心函數rdbSave(生成RDB文件)rdbLoad(從文件載入記憶體)兩個函數

 

 

AOF:

AofAppend-only file縮寫,

每當執行伺服器(定時)任務或者函數時flushAppendOnlyFile 函數都會被調用, 這個函數執行以下兩個工作

aof寫入保存:

WRITE:根據條件,將 aof_buf 中的緩存寫入到 AOF 文件

SAVE:根據條件,調用 fsync  fdatasync 函數,將 AOF 文件保存到磁碟中。

 

存儲結構:

  內容是redis通訊協議(RESP )格式的命令文本存儲。

(RESP redis客戶端和服務端之前使用的一種通訊協議;

RESP 的特點:實現簡單、快速解析、可讀性好

 

 

 

比較

1aof文件比rdb更新頻率高,優先使用aof還原數據。

2aofrdb更安全也更大

3rdb性能比aof

4、如果兩個都配了優先載入AOF

 

 

4、Redis 有哪些架構模式?講講各自的特點

 

 

 

Redis sentinel 是一個分散式系統中監控 redis 主從伺服器,併在主伺服器下線時自動進行故障轉移。其中三個特性:

監控(Monitoring):    Sentinel  會不斷地檢查你的主伺服器和從伺服器是否運作正常。

提醒(Notification): 當被監控的某個 Redis 伺服器出現問題時, Sentinel 可以通過 API 向管理員或者其他應用程式發送通知。

自動故障遷移(Automatic failover): 當一個主伺服器不能正常工作時, Sentinel 會開始一次自動故障遷移操作。

特點:

1、保證高可用

2、監控各個節點

3、自動故障遷移

缺點:主從模式,切換需要時間丟數據

沒有解決 master 寫的壓力

 

 

集群(proxy 型):

 

 

 

Twemproxy 是一個 Twitter 開源的一個 redis memcache 快速/輕量級代理伺服器; Twemproxy 是一個快速的單線程代理程式,支持 Memcached ASCII 協議和 redis 協議。

特點:1、多種 hash 演算法:MD5CRC16CRC32CRC32ahsiehmurmurJenkins 

2、支持失敗節點自動刪除

3、後端 Sharding 分片邏輯對業務透明,業務方的讀寫方式和操作單個 Redis 一致

缺點:增加了新的 proxy,需要維護其高可用。

 

failover 邏輯需要自己實現,其本身不能支持故障的自動轉移可擴展性差,進行擴縮容都需要手動干預

 

 

集群(直連型):

 

 

 

redis 3.0之後版本支持redis-cluster集群,Redis-Cluster採用無中心結構,每個節點保存數據和整個集群狀態,每個節點都和其他所有節點連接。

特點:

1、無中心架構(不存在哪個節點影響性能瓶頸),少了 proxy 層。

2、數據按照 slot 存儲分佈在多個節點,節點間數據共用,可動態調整數據分佈。

3、可擴展性,可線性擴展到 1000 個節點,節點可動態添加或刪除。

4、高可用性,部分節點不可用時,集群仍可用。通過增加 Slave 做備份數據副本

5、實現故障自動 failover,節點之間通過 gossip 協議交換狀態信息,用投票機制完成 SlaveMaster 的角色提升。

缺點:

1、資源隔離性較差,容易出現相互影響的情況。

2、數據通過非同步複製,不保證數據的強一致性

 

 

5、Redis常用命令?

Keys pattern

*表示區配所有

bit開頭的

查看Exists  key是否存在

 

Set

設置 key 對應的值為 string 類型的 value

 

setnx

設置 key 對應的值為 string 類型的 value。如果 key 已經存在,返回 0nx not exist 的意思。

 

刪除某個key

第一次返回1 刪除了 第二次返回0

 

Expire 設置過期時間(單位秒)

TTL查看剩下多少時間

返回負數則key失效,key不存在了

 

Setex

設置 key 對應的值為 string 類型的 value,並指定此鍵值對應的有效期。

 

Mset

一次設置多個 key 的值,成功返回 ok 表示所有的值都設置了,失敗返回 0 表示沒有任何值被設置。

 

Getset

設置 key 的值,並返回 key 的舊值。

 

Mget

一次獲取多個 key 的值,如果對應 key 不存在,則對應返回 nil

 

Incr

key 的值做加加操作,並返回新的值。註意 incr 一個不是 int value 會返回錯誤,incr 一個不存在的 key,則設置 key 1

 

incrby

incr 類似,加指定值 ,key 不存在時候會設置 key,並認為原來的 value 0

 

Decr

key 的值做的是減減操作,decr 一個不存在 key,則設置 key -1

 

Decrby

decr,減指定值。

 

Append

給指定 key 的字元串值追加 value,返回新字元串值的長度。

 

Strlen

取指定 key value 值的長度。

persist xxx(取消過期時間)

選擇資料庫(0-15庫)

Select 0 //選擇資料庫

move age 1//age 移動到1

Randomkey隨機返回一個key

Rename重命名

Type 返回數據類型

 

 

6、使用過Redis分散式鎖麽,它是怎麼實現的?

先拿setnx來爭搶鎖,搶到之後,再用expire給鎖加一個過期時間防止鎖忘記了釋放。

如果在setnx之後執行expire之前進程意外crash或者要重啟維護了,那會怎麼樣?

set指令有非常複雜的參數,這個應該是可以同時把setnxexpire合成一條指令來用的!

 

 

7、使用過Redis做非同步隊列麽,你是怎麼用的?有什麼缺點?

一般使用list結構作為隊列,rpush生產消息,lpop消費消息。當lpop沒有消息的時候,要適當sleep一會再重試。

缺點:

在消費者下線的情況下,生產的消息會丟失,得使用專業的消息隊列如rabbitmq等。

 

 8、什麼是緩存穿透?如何避免?什麼是緩存雪崩?何如避免?

緩存穿透

一般的緩存系統,都是按照key去緩存查詢,如果不存在對應的value,就應該去後端系統查找(比如DB)。一些惡意的請求會故意查詢不存在的key,請求量很大,就會對後端系統造成很大的壓力。這就叫做緩存穿透。

如何避免?

1:對查詢結果為空的情況也進行緩存,緩存時間設置短一點,或者該key對應的數據insert了之後清理緩存。

2:對一定不存在的key進行過濾。可以把所有的可能存在的key放到一個大的Bitmap中,查詢時通過該bitmap過濾。

緩存雪崩

當緩存伺服器重啟或者大量緩存集中在某一個時間段失效,這樣在失效的時候,會給後端系統帶來很大壓力。導致系統崩潰。

如何避免?

1:在緩存失效後,通過加鎖或者隊列來控制讀資料庫寫緩存的線程數量。比如對某個key只允許一個線程查詢數據和寫緩存,其他線程等待。

2:做二級緩存,A1為原始緩存,A2為拷貝緩存,A1失效時,可以訪問A2A1緩存失效時間設置為短期,A2設置為長期

3:不同的key,設置不同的過期時間,讓緩存失效的時間點儘量均勻。

 

上海尚學堂Java大數據培訓課程免費試學開啟,redis學習資料視頻免費領取哦~~~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 概述 .netcore發佈這麼久,到現在才在項目中實際運用,之前算是瞭解一點,一般找工作都會問是否運用過.netcore,軟體研發來說,如果這個技術沒用過,覺得挺難,其它不難。.netcore主要是跨平臺,可以部署在不同的操作系統上。 本文通過一些實例,將.netcore Api項目部署在linux ...
  • 將需要開機自啟動的腳本命令寫在文件/etc/rc.d/rc.local中即可。 比如需要開機自啟動MySql和Apache,則在/etc/rc.d/rc.local文件尾部加入兩行命令: systemctl start mysqldsystemctl start httpd ...
  • 學習鏈接:博客園、廖雪峰 一 前言 本次安裝不涉及許可權管理,因為只是自己測試,還未用於生產環境 二 準備環境 本次測試使用兩台虛擬機,一臺Ubuntu系統作為Git伺服器(以下稱為伺服器),一臺CentOS系統作為客戶端(以下稱為客戶端) 三 配置伺服器 第一步:檢查伺服器是否安裝了ssh服務,這個 ...
  • 首先確保網路,硬體連接都正確。保證py程式可以正確運行。 然後遠程登錄樹莓派 打開這個文件來修改自啟動,網上有很多方法都是新建一個腳本來完成的。由於我們是自啟動python文件,所以命令會有不同。 如果你要執行的程式路徑為 /home/pi/run.py。在rc.local文件里Exit 0 前加入 ...
  • 前言 對於一名專業的程式員來說,Linux相關知識是必須要掌握的,其中對於文本的處理更是我們常見的操作,比如格式化輸出我們需要的數據,這些數據可能會來源於文本文件或管道符,或者統計文本裡面我們需要的數據出現的頻次以及總數等等。那麼這時候awk就很值得我們去學習了。 正文 在Linux中,awk、se ...
  • Linux啟動時我們會看到許多啟動信息 Linux系統的啟動過程並不是大家想象中的那麼複雜,其過程可以分為5個階段: 內核的引導 運行init 系統初始化 建立終端 用戶登錄系統 1、內核引導 當電腦打開電源後,首先是BIOS開機自檢,按照BIOS中設置的啟動設備(通常是硬碟)來啟動 操作系統接管 ...
  • GRD (global resource directory)保存著所有實例中資源的分佈情況 GCS (global cache service)具體執行cache fusion 工作的服務,對應進程LMSn GES (global enqueues service)協調實例之間的GCS完成數據傳遞 ...
  • MySQL版本 select version(); + + | version() | + + | 5.7.21-log | + + 1 row in set (0.00 sec) 非空約束為null 併在自增列屬性前 即使自增列的非空約束定義可以為 null,但實際自增列為not null cre ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...