秋招Day15 - Redis - 基礎

什么是Redis?

Redis是一種基于鍵值對NoSQL數據庫。

主要的特點是把數據放在內存中,讀寫速度相比于磁盤會快很多。

對于性能要求很高的場景,比如緩存熱點數據防止接口爆刷,都會用到Redis

Redis還支持持久化,將緩存中的數據異步落盤,以便服務器宕機時恢復數據。

Redis和MySQL的區別?

  • Redis是非關系型數據庫,MySQL是關系型數據庫
  • Redis的數據存儲在內存,MySQL的數據主要存儲在磁盤
  • Redis存儲的是鍵值對,MySQL數據以行和列的形式存儲。

實際開發中,Redis和MySQL都會使用到,查詢數據先用Redis,未命中再查MySQL并寫回Redis

項目里哪里用到了Redis?

用戶活躍榜使用了ZSet有序集合(score字段進行排序)作者白名單里用到了Set集合結構

用戶登錄后的Session,使用了字符串類型

通過Lua腳本封裝Redis的setnex命令來實現分布式鎖,保證在高并發場景下,熱點數據短時間內的高頻訪問不會擊穿MySQL,多個線程沒有從Redis中獲得數據時,只有一個線程成功獲取鎖并重建緩存。Lua腳本保證原子性,防止在設置過期時間前崩潰造成死鎖,要么都成功,要么都失敗,避免鎖永遠不被釋放。設置一個監聽線程,任務未完成時自動續期

部署過Redis嗎?

我有在生產環境中部署過單機版Redis,先在官網下載源碼包后執行make && make install編譯安裝。安裝后編輯redis.conf文件,配置遠程訪問、設置密碼、限制內存、設置內存過期淘汰策略、開啟AOF持久化等。

Redis的高可用方案有部署過嗎?

有部署過哨兵機制,一主兩從的Redis實例,再加上三個哨兵節點監控它們,哨兵節點主要設置了故障轉移的判定條件超時閾值。當主節點發生故障時,哨兵節點之間能夠自動協商并選出新的主節點,這個過程大概需要10-15秒。

另一個項目部署過集群方案,該項目數據量大并且增長快,需要水平擴展能力。我們部署了6個主節點,每個主節點配備一個從節點,形成了一個3主3從的初始集群。

使用集群節點的好處是能夠自動進行分片映射,可以簡單地增加節點來水平擴展集群容量。故障轉移也很快,通常在幾秒內完成。

Redis可以用來干什么?

主要用作緩存,把高頻訪問的數據放到Redis中,并通過設置過期時間來保證數據一致性,減輕數據庫訪問壓力。

秒殺接口可以通過Lua腳本實現令牌桶算法實現流量控制。(HMSET)

Redis中有哪些數據類型?

字符串、哈希、列表、集合、有序集合

詳細介紹下字符串?

最常見的數據類型,存儲文本、數字或二進制數據,最大容量是512MB

適合存儲單個對象,比如驗證碼、token、計數等。

詳細介紹下列表?

列表是一個有序的元素集合,支持從頭部/尾部插入/刪除元素,常見于消息隊列任務列表

LRANGE key start end范圍查詢

詳細介紹下哈希?

key value的集合,適合存儲對象,比如商品信息,用戶信息。value = {name : 'zhangsan', age = 18}l

詳細介紹下集合?

集合是無序不重復的,支持交集并集操作,查詢效率能達到?O(1)?級別,主要用于去重、標簽、共同好友等場景。

詳細介紹下有序集合?

按照score排序的有序集合,支持范圍查詢,適合排行榜優先級隊列

詳細介紹下BitMap??

BitMap可以把一組二進制位緊湊地放到一組連續的內存空間中,每一位代表一個對象的狀態,比如是否簽到,是否活躍等?

詳細介紹下HyperLogLog?

用于估算集合中的唯一元素數量(基數)的概率性數據結構,僅用12KB的內存實現,誤差范圍為0.81%。

底層把每個元素哈希為一個二進制串,然后取前14位進行分組,放到16384個桶中,計算每組最大的前導0數量,最大前導0數量越多代表這個桶內的元素大概率越多,最后用一個公式近似推算總體基數,觀察稀有事件的頻率來推測總數。

詳細介紹下GEO?

GEO存儲地理位置信息,可以用來計算兩點之間的距離,某位置為中心的半斤內查找其他元素等

應用場景包括:附近的人或商家、計算外賣員與商家的距離、判斷用戶是否進入某個區域等

底層基于ZSet有序不重復集合實現,通過特定算法把經緯度轉換為score

為什么使用Hash類型而不是字符串類型序列化存儲??

Hash可以只讀取或修改某一個字段,String必須全部取出來反序列化后讀取

Redis為什么快??

內存

因為讀寫數據都是在內存中,內存的讀寫速度本來就比磁盤快好幾個數量級

異步持久化

即使Redis的數據需要持久化(RDB或AOF),也是異步或后臺進行的,不會阻塞讀寫操作

I/O多路復用

Redis采用了I/O多路復用技術和事件驅動模型,一個線程就能監聽成千上萬個連接。I/O多路復用線程會持續監聽注冊的連接(文件描述符),當有請求的事件就緒后,會被放入一個事件列表。Redis主線程可以主動一次性獲取所有的就緒事件,這些事件被有序地分發給預設的事件處理器,來執行相應的accept、read、write操作。

Linux下獲取就緒事件一般用epoll_wait(),macos一般用kqueue等。

多線程

Redis6.0之前,連接建立,請求讀取、響應發送以及命令執行都是在主線程中進行的,這樣可以避免多線程情況下的鎖競爭和上下文切換。網絡IO和命令執行是串行的性能瓶頸主要來源于網絡IO的序列化

Redis6.0之后,為了解決網絡IO的性能瓶頸,Redis引入了多線程機制,把網絡IO和命令執行分開,網絡IO交給線程池處理,命令執行仍然在主線程中,網絡IO的線程主要是負責解析請求以及序列化發送,這樣可以充分利用多核CPU的性能。

底層數據結構優化

比如String的底層數據結構動態字符串支持動態擴容預分配冗余空間,能夠減少內存碎片和內存分配的開銷

能詳細說一下IO多路復用嗎?

IO 多路復用是一種允許單個進程同時監視多個文件描述符的技術,使得程序能夠高效處理多個并發連接而無需創建大量線程。

主要的實現機制包含select poll epoll kqueue IOCP等。

說說select、poll、epoll、kqueue和IOCP的區別?

select的缺點是單個進程能夠監控的文件描述符有限,只有1024個,并且每次調研都需要將文件描述符集合從用戶空間拷貝到內核空間,然后遍歷找出就緒的文件描述符后再拷貝回來,性能開銷大

poll的優點是沒有最大文件描述符數量的限制,不再用 BitsMap 來傳入 FD,取而代之的是動態數組 pollfd。但是每次調用仍然需要將文件描述符集合從用戶空間復制到內核空間,仍然需要遍歷,性能較差

epoll引入了事件驅動/內核態的回調機制,將文件描述符一次性注冊到內核的紅黑樹中,在內核中通過回調機制主動維護就緒事件列表,而不需要像之前一樣請求一次維護一次,更不需要全部拷貝,而是僅返回就緒的文件描述符列表,避免了遍歷和重復拷貝的開銷。

kqueue是BSD/macos下的IO多路復用機制,類似于epoll,支持大規模并發連接,使用事件驅動模型

IOCP是windows系統下的IO多路復用機制,關注的是IO操作是否已經完成而非事件就緒通知,完全的異步I/O

舉例說一下阻塞I/O和I/O多路復用的區別??

傳統的阻塞I/O是指線程/進程發起I/O請求后需阻塞等待內核準備就緒并且I/O操作完成后才能執行后續的代碼,一個線程/進程只能負責一個I/O連接,不具有并發能力

I/O多路復用是指一個線程通過文件描述符監聽多個socket連接,?通過一個系統調用就可以知曉所有就緒的事件,只要有一個事件就緒就可以開始執行,可以處理大量并發的I/O請求

Redis早期為什么要使用單線程?

  • 為了避免上下文頻繁切換和鎖競爭,避免并發控制的復雜性
  • Redis是I/O密集型而不是CPU密集型,主要受內存和網絡I/O的限制,而不是CPU的計算能力限制,多線程收益不明顯
  • 單線程可以保證命令執行的原子性,無需額外的同步機制

所以單線程 + I/O多路復用機制已經足夠了

Redis6.0為什么要引入多線程?

Redis 6.0引入的多線程并不是指數據操作的命令執行是多線程的,而是指網絡I/O操作是在一個線程池中并發執行的。這是因為,雖然IO多路復用機制可以監控成千上萬個就緒事件,但是epoll_wait()獲取就緒事件列表之后還需要執行實際的網絡I/O操作,實際的read()和write()系統調用是非常耗時的,所以Redis 6.0之后就將IO線程從主線程中剝離了出來,可以并發執行請求的解析和數據的響應,大大解決單線程下網絡I/O操作的瓶頸問題

說說Redis的常用命令

  • 操作字符串GET/SET/INCR
  • 操作哈希HGET/HSET/HGETALL
  • 操作列表LPUSH/LPOP/LRANGE
  • 操作集合SADD/SISMEMBER
  • 操作有序集合ZADD/ZRANGE/ZINCRBY

詳細說說set命令?

用于設置字符串的key,一般會覆蓋原的值,支持過期時間條件寫入,一般用來實現分布式鎖,存儲token延長Session時間

SETNX僅不存在的時候設置,SETXX僅存在的時候覆蓋

sadd命令的時間復雜度是多少?

一次性添加N個元素就是O(N),只添加一個元素就是O(1)

incr命令了解嗎?

用于將指定鍵的值加一,是一個原子的命令。如果key不存在,先將值設置為0再加1。常用于網站訪問量,文章點贊數等場景

單線程的Redis QPS能達到多少?

10w

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/86778.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/86778.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/86778.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

權限提升-工作流

一、Windows 權限提升 操作階段 對應工具 說明 系統補丁與漏洞查詢 systeminfo、WindowsVulnScan、wesng 提取 KB 補丁號,匹配 CVE 漏洞(如 CVE-2020-1054) 內核漏洞提權 MSF(local_exploit_suggester)、CVE 對…

c++手撕線程池

C手撕線程池 #include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <time.h>#define LL_ADD(item, list) do{ \item->prev NULL; \item->next list; \if…

cocos creator 3.8 - 精品源碼 - 六邊形消消樂(六邊形疊疊樂、六邊形堆疊戰士)

cocos creator 3.8 - 精品源碼 - 六邊形消消樂 游戲介紹功能介紹免費體驗下載開發環境游戲截圖免費體驗 游戲介紹 六邊形堆疊戰士(六邊形消消消)是一款脫胎于2048、1010&#xff0c;基于俄羅斯方塊的魔性方塊達人小游戲&#xff0c;可以多方向多造型消除哦&#xff01; 功能介…

3ds Max高效運行配置核心要素

要保障3ds Max流暢運行&#xff0c;需圍繞計算性能、圖形處理、數據吞吐三大維度構建硬件體系。不同工作環節對硬件需求存在顯著差異&#xff1a; 一、核心組件配置原則 CPU&#xff1a;線程與頻率雙優化 建模/視口操作&#xff1a;依賴高主頻&#xff08;建議≥4.0GHz&#…

實變與泛函題解-心得筆記【16】

文章目錄 集合參考文獻 集合 參考文獻 《實變函數論與泛函分析》

道路交通標志檢測數據集-智能地圖與導航 交通監控與執法 智慧城市交通管理-2,000 張圖像

道路交通標志檢測數據集 &#x1f4e6; 已發布目標檢測數據集合集&#xff08;持續更新&#xff09;&#x1f6a7; 道路交通標志檢測數據集介紹&#x1f4cc; 數據集概覽包含類別 &#x1f3af; 應用場景&#x1f5bc; 數據樣本展示 YOLOv8 訓練實戰&#x1f4e6; 1. 環境配置 …

一、jenkins介紹和gitlab部署

一、jenkins介紹 jenkins和持續集成的關系 Jenkins 是實現持續集成&#xff08;CI&#xff09;最流行的自動化工具&#xff0c;它負責自動構建、測試和部署代碼&#xff0c;確保團隊能頻繁且可靠地集成代碼變更。 持續集成和敏捷開發的關系 敏捷開發是一種"快速迭代、…

k3s or kubesphere helm安裝報錯dial tcp 127.0.0.1:8080: connect: connection refused

在安裝kubesphere時報錯 Error: Kubernetes cluster unreachable: Get "http://localhost:8080/version": dial tcp 127.0.0.1:8080: connect: connection refused helm.go:92: 2025-06-27 15:14:43.30908177 0000 UTC m0.033127135 [debug] Get "http://localh…

使用datafusion和tpchgen-rs進行完整的TPCH 22個查詢的基準測試

1.從源碼編譯bench二進制文件。 下載datafusion源碼, 解壓到目錄&#xff0c;比如/par/dafu&#xff0c; cd /par/dafu/benchmarks export CARGO_INCREMENTAL1 export PATH/par:/par/mold240/bin:$PATH因為mold默認使用并行編譯&#xff0c;而這些二進制文件很大&#xff0c;如…

【軟考高項論文】論信息系統項目的干系人管理

摘要 在信息系統項目管理里&#xff0c;干系人管理極為關鍵&#xff0c;它不僅決定項目成敗&#xff0c;還對項目進度、質量和成本有著直接影響。本文結合作者2024年6月參與管理的信息系統項目&#xff0c;詳細闡述了項目干系人管理的過程&#xff0c;分析了干系人管理與溝通管…

PB應用變為Rust語言方案

從PB(PowerBuilder)遷移到現代開發軟件 PowerBuilder(PB)作為早期的快速應用開發工具,曾廣泛應用于企業級數據庫應用開發。隨著技術發展,PB逐漸面臨以下挑戰,促使企業轉向現代開發工具: 技術陳舊與維護困難 PB的架構基于較老的客戶端-服務器模式,難以適應云原生、微…

【大模型】Query 改寫常見Prompt 模板

下面對常見的幾種“Query 改寫”Prompt 模板進行中英文對照&#xff0c;并在注釋中給出中文說明&#xff0c;幫助中國用戶快速理解與使用。 根據調研&#xff0c;企業級 Query 改寫模塊需要覆蓋多種常見場景&#xff0c;包括拼寫糾錯、中英混合、省略上下文、多義詞擴展、專業術…

西門子S7-200 SMART PLC:小型自動化領域的高效之選

在工業自動化領域&#xff0c;小型PLC作為設備控制的核心組件&#xff0c;其性能、靈活性和性價比始終是用戶關注的重點。西門子推出的S7-200 SMART可編程控制器&#xff0c;憑借對中國市場需求的精準把握&#xff0c;成為了小型自動化解決方案的標桿產品。本文將從產品亮點、技…

使用iperf3測試網絡的方法

深入掌握網絡性能測試&#xff1a;iperf3全指南 在網絡優化、故障排查和帶寬驗證中&#xff0c;iperf 是工程師必備的利器。這款開源工具通過模擬數據流&#xff0c;精準測量??帶寬、抖動、丟包率??等核心指標。本文將結合實戰經驗&#xff0c;詳解iperf的安裝、參數配置和…

Level2.11繼承

一、繼承 #動物# #老虎、獅子、大象 #動物有共性 ##定義一個動物&#xff1a;1.有4條腿&#xff1b;2.陸地上跑&#xff1b;3.需要進食&#xff08;屬性能力&#xff09; ##貓&#xff1a;同上&#xff08;繼承了動物的屬性和能力&#xff09; ##老鼠&#xff1a;同上#Python…

Class3Softmax回歸

Class3Softmax回歸 回歸VS分類 回歸是估計一個連續值 分類是預測一個離散類別 回歸分類單連續值輸出通常為多個輸出自然區間R輸出i是預測為第i類的置信度跟真實值的區別作為損失 生活中的分類問題 1.垃圾分類 類別&#xff1a; 可回收物 濕垃圾&#xff08;廚余垃圾&#xff0…

day042-負載均衡與web集群搭建

文章目錄 0. 老男孩思想-面試官問&#xff1a;你對加班的看法?1. 負載均衡2. 搭建負載均衡的WordPress集群2.1 負載均衡服務器2.2 配置web服務器2.3 測試 踩坑記錄1. /var/cache/nginx權限問題 0. 老男孩思想-面試官問&#xff1a;你對加班的看法? 互聯網公司沒有不加班的&a…

40歲技術人用AI尋找突破路線

年近40&#xff0c;坐標重慶&#xff0c;從事醫療器械行業多年&#xff0c;遇到發展瓶頸。剛好遇到AI技術浪潮。最近一年在不斷嘗試把AI應用于工作生活的方方面面。 總結一下我是如何利用AI來做職業規劃的&#xff1a; 整理好自己的簡歷&#xff0c;越詳細越好。這個可以利用…

kde截圖工具報錯

An error occurred while taking a screenshot. KWin screenshot request failed: The process is not authorized to take a screenshot Potentially relevant information: - Method: CaptureScreen - Method specific arguments: "eDP-2"好的&#xff0c;感謝您提…

有理函數積分——分式分解時設分解式的規則

目錄 一、設前處理 1. 假式化真式 2. 分母因式分解 3. 判斷可約不可約 二、一次分母 1. 多項一次分母? 2. 單項一次重復分母? 三、二次分母(當然是分母不可約的&#xff0c;如果可約就因式分解然后對應一次分母) 1. 多項二次分母? 2. 單項二次重復分母? 四、混…