Redis詳解


?

Redis 簡介

Redis(Remote Dictionary Server)是一個開源的高性能鍵值對存儲數據庫,最初由 Salvatore Sanfilippo 開發,它在內存中存儲數據,并提供了持久化功能,可以將數據保存到磁盤中,是一種NoSQL(not-only sql,非關系型數據庫)的數據庫。

它的數據結構十分豐富,基礎數據類型包括:string(字符串)、list(列表,雙向鏈表)、hash(散列,鍵值對集合)、set(集合,不重復)和 sorted set(有序集合),這使得它不僅僅是一個簡單的鍵值存儲,還可以用于存儲和處理復雜的數據。

數據類型和底層結構的對應關系

stringlisthashsetsorted set
簡單動態字符串雙向鏈表、壓縮鏈表壓縮鏈表、哈希表壓縮鏈表、整數數組壓縮鏈表、跳表

底層實現的時間復雜度

跳表雙向鏈表壓縮鏈表哈希表整數數組
O(logN)O(N)O(N)O(1)O(N)

可以看出除了 string 類型的底層實現只有一種數據結構,其他四種均有兩種底層實現,這四種類型為集合類型,其中一個鍵對應了一個集合的數據。

Redis 特點/優勢

Redis 具備許多特點和優勢,所以在大規模應用和高并發場景中得到廣泛應用。

  • 豐富的數據結構:Redis 支持多種數據結構,包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)等。每種數據結構都有豐富的操作命令,可以方便地對數據進行存儲和處理。

  • 持久化:Redis 提供了兩種持久化方式,RDB(Redis Database)和 AOF(Append Only File)。RDB 是將數據庫在指定時間點轉儲到磁盤的快照持久化方式,AOF 是將寫操作追加到文件末尾的日志持久化方式。這兩種方式可以根據需求進行選擇,保證數據在服務器重啟后不會丟失。

  • 高性能:Redis 是一種內存數據庫,數據存儲在內存中,因此讀寫速度非常快。它采用單線程模型,避免了多線程帶來的競爭問題,使得 Redis 能夠充分利用 CPU 和內存資源。

  • 支持事務:Redis 支持事務操作,可以將多個命令打包執行,保證這些命令要么全部執行成功,要么全部失敗,保持數據的一致性。雖然 Redis 在單個命令的執行上是原子性的,但是多個命令的組合并不是原子性的,通過事務可以實現一組命令的原子性執行。

  • 高可用與分布式:Redis 支持主從復制、哨兵和集群等功能,可以構建高可用和分布式的 Redis 架構。主從復制可以實現數據的熱備份和讀寫分離,哨兵可以監控 Redis 的健康狀態并進行自動故障轉移,集群可以將數據分布在多個節點上,提高性能和擴展性。

  • 發布訂閱:Redis 支持發布訂閱模式,可以實現消息的發布和訂閱。發布者將消息發布到指定的頻道,訂閱者可以訂閱感興趣的頻道并接收相應的消息,實現了解耦和實時通信。

Redis 為什么很快

  • 內存存儲:Redis將數據存儲在內存中,而不是像傳統的磁盤存儲數據庫那樣將數據寫入到硬盤上。由于內存的讀寫速度遠遠快于磁盤,因此Redis能夠實現極快的讀寫性能。

  • 單線程模型:Redis采用單線程模型,每個Redis實例都由單個主線程來處理所有的客戶端請求。雖然單線程看起來似乎會限制其性能,但這實際上是Redis的一大優勢。單線程模型消除了多線程之間的競爭和鎖等開銷,使得Redis能夠充分利用CPU資源,并且避免了多線程帶來的復雜性。此外,Redis在內部使用了I/O多路復用技術(例如epoll或kqueue)來處理并發請求,使得單線程能夠同時處理多個客戶端連接。

  • 非阻塞IO:Redis使用了非阻塞IO,也就是在讀寫操作時不會阻塞其他操作。在讀取數據時,如果內存中沒有所需的數據,Redis會立即返回一個空結果,而不會等待數據從磁盤加載進來。這樣即使在高并發情況下,Redis也能夠快速地響應請求。

  • 高效的數據結構:Redis支持多種高效的數據結構,比如字符串、哈希、列表、集合、有序集合等。這些數據結構的設計和實現都非常高效,能夠在常量時間內完成查找、插入、刪除等操作,保證了Redis的高速性能。

  • 異步操作:Redis支持異步操作,比如異步持久化和異步復制。異步操作能夠讓Redis在進行磁盤持久化和主從復制時不會阻塞其他操作,提高了整體的性能。

  • 優化的網絡協議:Redis使用RESP(Redis Serialization Protocol)作為網絡協議,RESP是一種簡單、高效的二進制協議。RESP協議的設計使得網絡傳輸的數據量盡可能地減少,減少了網絡傳輸的開銷,提高了性能。

  • 原子性操作:Redis支持很多原子性操作,比如INCR、DECR、SETNX等。原子性操作能夠在一條命令中完成多個操作,而且這些操作是不可中斷的,保證了數據的一致性。

應用場景

由于 Redis 具備高性能、豐富的數據結構和多種特性,它的主要應用場景如下:

  • 緩存:作為緩存數據庫,Redis 可以將經常訪問的數據存儲在內存中,避免頻繁讀寫數據庫,提高應用的響應速度。緩存可以存儲熱點數據,減輕后端數據庫的壓力,提高系統的吞吐量。

  • 計數器:利用 Redis 的原子性操作,可以實現高效的計數器功能,比如網站的點贊、瀏覽次數等統計功能。由于 Redis 原子性操作的特性,計數器的更新可以并發執行而不會出現競爭問題。

  • 消息隊列:Redis 的發布訂閱功能和列表數據結構可以實現簡單的消息隊列,用于解耦系統的各個模塊。生產者將消息發布到指定頻道,消費者訂閱感興趣的頻道并處理消息,實現異步消息傳遞。

  • 排行榜:使用有序集合數據結構,可以實現排行榜功能,比如游戲中的玩家排名。通過有序集合的分數屬性,可以對玩家的得分進行排序和排名,實時顯示排行榜。

  • 會話緩存:在 Web 應用中,可以使用 Redis 存儲用戶的會話數據,實現分布式會話管理。用戶登錄后,可以將會話數據存儲在 Redis 中,從而實現多臺服務器之間的會話共享。

如何安裝和使用

安裝 Redis 非常簡單,可以通過官方網站下載源代碼進行編譯安裝,也可以使用包管理工具安裝。對于 Ubuntu 系統,可以使用以下命令安裝 Redis:

bashCopy?codesudo?apt?update
sudo?apt?install?redis-server

安裝完成后,可以使用以下命令啟動 Redis 服務:

bashCopy?code
sudo?systemctl?start?redis-server

連接 Redis 服務器可以使用?redis-cli?命令行工具:

bashCopy?code
redis-cli

5. 常用命令

  • 設置鍵值對

bashCopy?code
SET?key?value
  • 獲取鍵值對

bashCopy?code
GET?key
  • 設置過期時間

bashCopy?code
SETEX?key?seconds?value
  • 刪除鍵

bashCopy?code
DEL?key
  • 使用列表

bashCopy?codeLPUSH?list_key?value1?value2?value3???#?從左側插入元素
RPUSH?list_key?value4?value5??????????#?從右側插入元素
LRANGE?list_key?0?-1??????????????????#?獲取所有元素

總結

Redis 是一款功能強大且廣泛應用于各種場景的內存數據庫。它的快速讀寫性能、豐富的數據結構和多種特性使得它成為處理高速數據和構建高可用、分布式系統的理想選擇。無論是作為緩存、計數器、消息隊列還是會話緩存,Redis 都能發揮出色的性能。

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

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

相關文章

? vue中$forceUpdate()

? vue中$forceUpdate() 1、認識 強制該組件重新渲染 鑒于 Vue 的全自動響應性系統,這個功能應該很少會被用到 $forceUpdate()迫使vue實例重新(rander)渲染虛擬DOM,注意并不是重新加載組件。 結合vue的生命周期,調用…

【論文閱讀】DEPCOMM:用于攻擊調查的系統審核日志的圖摘要(SP-2022)

Xu Z, Fang P, Liu C, et al. Depcomm: Graph summarization on system audit logs for attack investigation[C]//2022 IEEE Symposium on Security and Privacy (SP). IEEE, 2022: 540-557. 1 摘要 ? 提出了 DEPCOMM,這是一種圖摘要方法,通過將大圖劃…

簡單易懂的python生成器

目錄 定義使用 for 循環來迭代生成器對象斐波那契 定義 在 Python 中,使用了 yield 的函數被稱為生成器(generator)。Python 中的生成器(Generator)是一種特殊的迭代器,可以通過函數來創建。與常規函數不同…

Feign忽略Https的SSL最佳方案(且保證負載均衡將失效)

同時解決Https的SSL證書驗證問題和feign不支持Patch請求方法的問題 代碼 1. 工具類 OkHttpUtils.java import javax.net.ssl.*; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import j…

從0開始搭建ns3環境以及NetAnim簡單使用

一、環境準備 ns3是基于GNU/Linux平臺使用C開發的工具軟件,在windows系統中安裝使用ns3環境,可以使用虛擬機VMware并安裝ubuntu系統來實現,現將本教程所用到的虛擬機和系統鏡像放到網盤提供下載 名稱鏈接提取碼VMware Workstation 17 Proht…

簡約時尚的健康手表,智能守護每一刻,dido Y60上手

智能手表是現在很流行的一種智能設備,很多品牌都推出了各種各樣的產品,但是大部分都更側重功能和運動的方面,健康監測往往只是配角,而隨著人們對自己的健康越來越重視,有些朋友只是單純的需要一塊專業的健康監測手表。…

選擇任務管理軟件:哪個更適合你的需求?

隨著互聯網的發展,知識管理是可以成為企業獲得更大發展前景的神兵利器,任務協同,是服務于中小型團隊,或者大型機構的終端組織。來看看這款國外流行的任務管理軟件Zoho Projects。 任務管理是企業協同的重要組成部分。 任務管理是企…

Bitcoin 加速交易操作示例

這里以 Bitcoin Ordinals NFT 為例, 進行加速交易演示 第1步:新建子賬戶 溫馨提示:如果有多條魚未確認,也只需1個賬戶即可,不必搞多個子賬戶 第2步:切換回到老地址(Account 1) 第3步…

【Kubernetes】Kubernetes的PV和PVC的用法

PV、PVC 前言一、 存儲卷1. emptyDir 存儲卷1.1 概念1.2 實例 2. hostPath 存儲卷2.1 概念2.2 實例 3. nfs共享存儲卷 二、PV 和 PVC1. 概念1.1 PV1.2 PVC1.3 PVC 的使用邏輯1.4 創建機制1.5 PV 和 PVC 的生命力周期1.6 創建及銷毀 PV 的流程 2. PV 和 PVC 的創建2.1 查看定義2…

高并發內存池項目(C++實戰項目)

項目介紹 項目來源 本項目實現了一個高并發內存池,參考了Google的開源項目tcmalloc實現的簡易版;其功能就是實現高效的多線程內存管理。由功能可知,高并發指的是高效的多線程,而內存池則是實現內存管理的。 tcmalloc源碼 項目…

論智能與反智能的對立統一

智能和反智能可以被視為一個相對的概念,彼此存在一定的關聯和互補。在發展智能和反智能技術的過程中,我們必須始終牢記倫理和法律的原則,在合法和道德的框架內進行研究和應用,遵守相關的規定和限制。只有在這樣的前提下&#xff0…

linux的shell中 if 的運算符的使用

一、文件比較運算符 e filename 如果 filename存在,則為真 如: [ -e /var/log/syslog ]-d filename 如果 filename為目錄,則為真 如: [ -d /tmp/mydir ]-f filename 如果 filename為常規文件,則為真 如: […

基于vue開發的影視站模板(模仿西瓜視頻)

基于vue3開發的影視站模板, 對接蘋果cms10數據庫表, 采用pythondjangovue開發 效果預覽 http://101.43.124.118:8002 源碼地址 https://github.com/geeeeeeeek/appvideo 運行步驟 1.安裝依賴 npm install 2.運行 npm run dev 代碼說明 入口文件為main.js 接口請求的bas…

【計算機網絡】概述及數據鏈路層

每一層只依賴于下一層所提供的服務,使得各層之間相互獨立、靈活性好,已于實現和維護,并能促進標準化工作。 應用層:通過應用進程間的交互完成特定的網絡應用,HTTP、FTP、DNS,應用層交互的數據單元被稱為報…

MySQL 中常見的幾種高可用架構部署方案

MySQL 中的集群部署方案 前言 這里來聊聊,MySQL 中常用的部署方案。 MySQL Replication MySQL Replication 是官方提供的主從同步方案,用于將一個 MySQL 的實例同步到另一個實例中。Replication 為保證數據安全做了重要的保證,是目前運用…

數據結構初階--二叉樹的鏈式結構

目錄 一.二叉樹鏈式結構的概念 二.二叉樹鏈式結構的功能實現 2.1.鏈式二叉樹的定義 2.2.鏈式二叉樹的構建 2.3.鏈式二叉樹的遍歷 2.3.1.先序遍歷 2.3.2.中序遍歷 2.3.3.后序遍歷 2.3.4.層序遍歷 2.4.鏈式二叉樹的求二叉樹的結點數量 法一:計數法 法二&a…

Linux知識點 -- 進程概念(補充)

Linux知識點 – 進程概念(補充) 文章目錄 Linux知識點 -- 進程概念(補充)一、進程地址空間的堆區二、虛擬地址到物理地址之間的轉化三、虛擬地址到物理地址之間的映射 一、進程地址空間的堆區 在用戶每次使用malloc等函數在進程的…

OBD接口引腳定義

汽車的OBD接口引腳定義分配如下圖所示,OBD接口共有16個引腳(可參考 ISO 15031-3)。 1、引腳1,3,8,9,11,12,13 引腳1,3,8,9,11,12,13由主機廠進行分配。 2、引腳2 如果車輛中使用SAE J1850 10,4 VPW(可變脈沖)來提供…

【React】精選10題

1.React Hooks帶來了什么便利? React Hooks是React16.8版本中引入的新特性,它帶來了許多便利。 更簡單的狀態管理 使用useState Hook可以在函數組件中方便地管理狀態,避免了使用類組件時需要繼承React.Component的繁瑣操作。 避免使用類組件…

小紅書運營 變現方法總結(精)

大家好,我是網媒智星,今天跟大家分享一下小紅書運營方面的知識,怎樣利用小紅書變現?全篇傾情干貨輸出,認真學習,保證您收獲多多。 首先,讓我們來分析一下小紅書平臺的優勢。關于賣東西&#xff…