第1章 Redis 概述

一、Redis 簡介

? ? ? ? ? ? Redis,Remote Dictionary Server,遠程字典服務,由意大利人Salvatore Sanfilippo(又名Antirez)開發,是一個使用ANSI C 語言編寫、支持網絡、 可基于內存亦可持久化的日志型、NoSQL 開源內存數據庫,其提供多種語言的API。從2010 年3 月15 日起,Redis 的開發工作由VMware 主持。從 2013 年5 月開始,Redis 的開發由Pivotal 贊助。

Redis 之所以稱之為字典服務,是因為Redis 是一個key-value 存儲系統。支持存儲的value 類型很多,包括String(字符串)、List(鏈表)、Set(集合)、Zset(sorted set --有序集合)和Hash(哈 希類型)等。

Redis 的國際知名用戶有,Twitter、GitHub、Facebook 等,國內知名用戶有,阿里巴巴、 騰訊、百度、搜狐、優酷、美團、小米等。熟練使用和運維Redis 已經成為開發運維人員的 一個必備技能。

1.NoSQL

NoSQL( “non-relational” “Not Only SQL” ),泛指 非關系型 的數據庫。
隨著互聯網 web2.0 網站的興起,傳統的關系數據庫在處理 web2.0 網站,特別是超大規模和高并發的 SNS 類型 的 web2.0 純動態網站已經顯得力不從心,出現了很多難以克服的問題,而非關系型的數據 庫則由于其本身的特點得到了非常迅速的發展。
NoSQL 數據庫的產生就是為了 解決大規模數據集合多重數據種類帶來的挑戰 ,特別是大數據應用難題。

1鍵值存儲數據庫

就像 Map 一樣的 key-value 對。典型代表就是 Redis

2列存儲數據庫

關系型數據庫是典型的 行存儲數據庫 。其存在的問題是,按行存儲的數據在物理層面占
用的是連續存儲空間,不適合海量數據存儲。
而按列存儲則可實現分布式存儲,適合海量存儲。典型代表是 HBase

3文檔型數據庫

其是 NoSQL 與關系型數據的結合,最像關系型數據庫的 NoSQL 。典型代表是 MongoDB

4圖形(Graph)數據庫

用于存放一個節點關系的數據庫,例如描述不同人間的關系。典型代表是 Neo4J

二、Redis 的用途

Redis 在生產中使用最多的場景就是做 數據緩存。即客戶端從 DBMS 中查詢出的數據首先寫入到 Redis 中, 后續無論哪個客戶端再需要訪問該數據,直接讀取 Redis 中的即可,不 僅減小了 RT,而且降低了 DBMS 的壓力。

DBMS 是?Database Management System(數據庫管理系統)?的縮寫,是一種專門用于?創建、管理和維護數據庫?的軟件系統。它是數據持久層(如關系型數據庫、非關系型數據庫等)的核心組件

? ? ? ?根據 Redis 緩存的數據與 DBMS 中數據的同步性劃分,緩存一般可劃分為兩類:實時同步緩存,與階段性同步緩存

? ? ? ?實時同步緩存是指,DBMS 中數據更新后,Redis 緩存中的存放的相關數據會被立即清 除,以促使再有對該數據的訪問請求到來時,必須先從 DBMS 中查詢獲取到最新數據,然后 再寫入到 Redis。

? ? ? 階段性同步緩存是指,Redis 緩存中的數據允許在一段時間內與 DBMS 中的數據不完全 一致。而這個時間段就是這個緩存數據的過期時間。

實時同步緩存,與階段性同步緩存——補充理解《補充》

三、Redis 特性

能夠做緩存的技術、中間件很多,例如,MyBatis 自帶的二級緩存、Memched 等。只所 以在生產中做緩存的產品幾乎無一例外的會選擇 Redis,是因為它有很多其它產品所不具備 的特性。

??? 性能極高:Redis 讀的速度可以達到 11w 次/s,寫的速度可以達到 8w 次/s。只所以具有 這么高的性能,因為以下幾點原因:

(1)Redis 的所有操作都是在內存中發生的。

(2) Redis 是用 C 語言開發的。

(3)Redis 源碼非常精細(集性能與優雅于一身)。

? 簡單穩定:Redis 源碼很少。早期版本只有 2w 行左右。從 3.0 版本開始,增加了集群功 能,代碼變為了 5w 行左右。

? 持久化:Redis 內存中的數據可以進行持久化,其有兩種方式:RDB 與 AOF。

? 高可用集群:Redis 提供了高可用的主從集群功能,可以確保系統的安全性。

? 豐富的數據類型:Redis 是一個 key-value 存儲系統。支持存儲的 value 類型很多,包括 String(字符串)、List(鏈表)、Set(集合)、Zset(sorted set --有序集合)和 Hash(哈希類型) 等,還有 BitMap、HyperLogLog、Geospatial 類型。

? BitMap:一般用于大數據量的二值性統計。

? HyperLogLog:其是 Hyperlog Log,用于對數據量超級龐大的日志做去重統計。 ? Geospatial:地理空間,其主要用于地理位置相關的計算。

? 強大的功能:Redis 提供了數據過期功能、發布/訂閱功能、簡單事務功能,還支持 Lua 腳本擴展功能。

? 客戶端語言廣泛:Redis提供了簡單的 TCP 通信協議,編程語言可以方便地的接入 Redis。 所以,有很多的開源社區、大公司等開發出了很多語言的 Redis 客戶端。

? 支持 ACL 權限控制:之前的權限控制非常笨拙。從 Redis6 開始引入了 ACL 模塊,可以 為不同用戶定制不同的用戶權限。

ACL,Access Control List,訪問控制列表,是一種細粒度的權限管理策略,可以針對任意 用戶與組進行權限控制。目前大多數 Unix 系統與 Linux 2.6 版本已經支持 ACL 了。 Zookeeper 早已支持 ACL 了。

Unix 與 Linux 系統默認使用是 UGO(User、Group、Other)權限控制策略,其是一種粗 粒度的權限管理策略。

? 支持多線程 IO 模型:Redis 之前版本采用的是單線程模型,從 6.0 版本開始支持了多線 程模型。

四、Redis IO 模型

Redis 客戶端提交的各種請求是如何最終被 Redis 處理的?

Redis 處理客戶端請求所采用 的處理架構,稱為 Redis 的 IO 模型。不同版本的 Redis 采用的 IO 模型是不同的

1.單線程模型

對于 Redis 3.0 及其以前版本,Redis 的 IO 模型采用的是純粹的單線程模型。即所有客戶 端的請求全部由一個線程處理。

Redis 的單線程模型采用了 多路復用技術

? ? ? ?每個客戶端若要向 Redis 提交請求,都需要與 Redis 建立一個 socket 連接,并向事件分 發器注冊一個事件。一旦該事件發生就表明該連接已經就緒。而一旦連接就緒,事件分發器 就會感知到,然后獲取客戶端通過該連接發送的請求,并將由該事件分發器所綁定的這個唯 一的線程來處理。如果該線程還在處理多個任務,則將該任務寫入到任務隊列等待線程處理。

? ? ? ?之所以稱為事件分發器,是因為它會根據不同的就緒事件,將任務交由不同的事件處理 器去處理。

2.混合線程模型

從 Redis 4.0 版本開始,Redis 中就開始加入了多線程元素。處理客戶端請求的仍是單線 程模型,但對于一些比較耗時但又不影響對客戶端的響應的操作,就由后臺其它線程來處理。 例如,持久化、對 AOF 的 rewrite、對失效連接的清理等。

3.多線程模型

Redis 6.0 版本,才是真正意義上的多線程模型。因為其對于客戶端請求的處理采用的是
多線程模型。

多線程 IO 模型中的“多線程”僅用于接受、解析客戶端的請求,然后將解析出的請求 寫入到任務隊列。而對具體任務(命令)的處理,仍是由主線程處理。這樣做使得用戶無需 考慮線程安全問題,無需考慮事務控制,無需考慮像 LPUSH/LPOP 等命令的執行順序問題。

4.優缺點總結

⑴.單線程模型

優點:可維護性高,性能高。不存在并發讀寫情況,所以也就不存在執行順序的不確定 性,不存在線程切換開銷,不存在死鎖問題,不存在為了數據安全而進行的加鎖/解鎖 開銷。

缺點:性能會受到影響,且由于單線程只能使用一個處理器,所以會形成處理器浪費。

⑵.多線程模型

優點:其結合了多線程與單線程的優點,避開了它們的所有不足

缺點:該模型沒有顯示不足。如果非要找其不足的話就是,其并非是一個真正意義上的 “多線程”,因為真正處理“任務”的線程仍是單線程。所以,其對性能也是有些影響的。

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

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

相關文章

圖論學習筆記 5 - 最小樹形圖

我們不廢話,直接進入正題:最小樹形圖,一個名字看起來很高級的東西。 聲明:為了便于理解,可能圖片數量會有億點點多。圖片尺寸可能有的較大。 概念 最小樹形圖的英文是 Directed Minimum Spanning Tree。 相信懂英文…

力扣面試150題--完全二叉樹的節點個數

Day 51 題目描述 思路 根據完全二叉樹的規律,完全二叉樹的高度可以直接通過不斷地訪問左子樹就可以獲取,判斷左右子樹的高度: 1. 如果相等說明左子樹是滿二叉樹, 然后進一步判斷右子樹的節點數(最后一層最后出現的節點必然在右子樹中) 2. 如…

社區造數服務接入MCP|得物技術

一、背景 ? 今年 MCP 的概念非常火,市面上也涌現出了一大批 MCP 相關工具。作為技術一線者,都會按捺不住地去實操一下,很早的時候就有個設想,如果把我們的測試工具都改造為符合 MCP 服務協議標準,然后全部接入 AI A…

Mysql 查詢時間段內的sql優化

Mysql 查詢時間段內的sql優化 一說寫到查詢某個時間段的sql查詢,我們就會使用DATE_FORMAT函數格式化日期字段: 比如查詢某年某月的數據,我們可能常用的方式如下 DATE_FORMAT(pay_time,%Y-%m)=DATE_FORMAT(now(),%Y-%m) 但是這樣做會使索引失效,尤其在數據量越來越多的情況…

用 Deepseek 寫的 html+js 密碼生成器

下面是一個功能完整的密碼生成器HTMLJS實現&#xff0c;包含數字、小寫字母、大寫字母、符號、避免重復字符和密碼長度設置功能。 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&…

WPF綁定

如何使用綁定去改變事件驅動的關系。 先介紹一下標簽擴展 目錄 控件與控件之間的綁定 代碼分析 綁定語法詳解 1. Binding - 綁定標記 2. ElementName=slider - 綁定源 3. Path=Value - 綁定路徑 不同控件屬性的默認模式: 控件和屬性綁定 1. 數據模型類的作用 2. 窗…

同源“平滑思想”的問題解法:正則化與拉普拉斯平滑

同源“平滑思想”的問題解法&#xff1a;正則化與拉普拉斯平滑 在機器學習和概率模型的實踐中&#xff0c;正則化與拉普拉斯平滑是兩個看似無關的技術&#xff1a;前者用于防止模型過擬合&#xff0c;后者用于解決零概率問題。但如果深入理解它們的核心邏輯&#xff0c;會發現…

用 AI 讓學習更懂你:如何打造自動化個性化學習系統?

用 AI 讓學習更懂你:如何打造自動化個性化學習系統? 在這個信息爆炸的時代,傳統的學習方式已經難以滿足個體化需求。過去,我們依賴固定的教學課程,所有學生按照統一進度進行學習,但每個人的學習節奏、興趣點和理解方式都不盡相同。而人工智能(AI)正在徹底改變這一局面…

PyQt學習系列08-插件系統與模塊化開發

PyQt學習系列筆記&#xff08;Python Qt框架&#xff09; 第八課&#xff1a;插件系統與模塊化開發 &#xff08;原課程規劃中的第12課&#xff0c;按用戶要求調整為第9課&#xff09; 課程目標 掌握Qt插件系統的原理與開發方法實現可擴展的模塊化應用程序理解QPluginLoader動…

rlemasklib 安裝筆記

目錄 windows 安裝&#xff0c;沒成功 報錯筆記&#xff1a; windows 安裝&#xff0c;沒成功 anslation_unit.obj -Wno-cpp -Wno-unused-function -stdc99 -O3 cl: 命令行 error D8021 :無效的數值參數“/Wno-cpp” error: command C:\\Program Files\\Microso…

Ubuntu 系統grub日志級別設置

在 Ubuntu 系統中&#xff0c;GRUB 的日志級別主要與內核日志級別&#xff08;loglevel&#xff09;相關&#xff0c;而不是 GRUB 自身的日志級別。內核日志級別通常從 0 到 7&#xff0c;其中 0 是最高級別&#xff08;最嚴重&#xff09;&#xff0c;7 是最低級別&#xff08…

【前端】使用HTTPS

在前端本地開發環境中使用 HTTPS 主要取決于你用的是哪個構建工具&#xff08;如 Vite、Webpack、Vue CLI 等&#xff09;。 目錄 ViteWebpack本地生產環境 npx serve瀏覽器提示“不安全”解決方法上傳github注意不要把key傳上去 Vite npm install --save-dev types/node #安…

Python 包管理工具 uv的一些常用指令

1.如何安裝uv&#xff1a; 在Windows下&#xff0c;執行下面的指令&#xff1a; powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" 安裝很快&#xff0c;安裝完成后&#xff0c;會出現&#xff1a; 接著&#xff0c;我們運行指…

行為型:策略模式

目錄 1、核心思想 2、實現方式 2.1 模式結構 2.2 實現案例 3、優缺點分析 4、適用場景 5、優化技巧 1、核心思想 目的&#xff1a;將算法&#xff08;行為&#xff09;抽象出來作為一系列策略類&#xff0c;使他們可以相互替換&#xff0c;使系統擁有“可插拔”擴展的能…

計算機網絡學習20250524

協議 格式—語法&#xff1a;數據結構或格式&#xff08;怎么做&#xff09;次序—時序&#xff1a;事件實現的順序&#xff08;做的順序&#xff09;行為動作—語義&#xff1a;發出什么控制信息&#xff0c;完成何種動作、做出何種應答 網絡結構 網絡邊緣&#xff1a;主機…

Github 2025-05-24 Rust開源項目日報 Top10

根據Github Trendings的統計,今日(2025-05-24統計)共有10個項目上榜。根據開發語言中項目的數量,匯總情況如下: 開發語言項目數量Rust項目10TypeScript項目2Dart項目1Tauri: 構建小型、快速和安全的桌面應用程序 創建周期:1673 天開發語言:Rust協議類型:Apache License 2…

數據結構之堆(topk問題、堆排序)

一、堆的初步認識 堆雖然是用數組存儲數據的數據結構&#xff0c;但是它的底層卻是另一種表現形式。 堆分為大堆和小堆&#xff0c;大堆是所有父親大于孩子&#xff0c;小堆是所有孩子大于父親。 通過分析我們能得出父子關系的計算公式&#xff0c;parent(child-1)/2&#xff…

0基礎 Git 代碼操作

將代碼提交倉庫&#xff1a; 準備工作? ?注冊 Gitee 賬號?&#xff1a;確保你已注冊并登錄 Gitee。?創建倉庫?&#xff1a;在 Gitee 上新建一個空倉庫&#xff08;如果尚未創建&#xff09;&#xff1a; 點擊右上角 → 新建倉庫。填寫倉庫名稱、描述&#xff0c;選擇公…

OpenAI大模型不聽人類指令事件的技術分析與安全影響

OpenAI大模型不聽人類指令事件的技術分析與安全影響 OpenAI大模型o3確實存在不遵從人類關閉指令的現象&#xff0c;這一行為已被第三方安全機構驗證&#xff0c;但其本質是技術缺陷而非AI意識覺醒。帕利塞德研究所的測試顯示&#xff0c;在100次實驗中o3有7次成功繞過關閉指令…

軟件工程期末速成--附帶幾道題

軟件工程中的各種設計 瀑布模型&#xff1a; 定義&#xff1a;將軟件生存周期的各項活動規定為依照固定順序連接的若干階段工作&#xff0c;形如瀑布流水&#xff0c;最終得到軟件產品 系統流程圖&#xff1a;系統流程圖是描繪物理系統的傳統工具&#xff0c;它的基本思想是用…