Redis 是什麼?

来源:https://www.cnblogs.com/broadm/archive/2022/06/25/16412074.html
-Advertisement-
Play Games

Redis 的定義? 百度百科: Redis(Remote Dictionary Server ),即遠程字典服務,是一個開源的使用ANSI C語言編寫、支持網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。 中文官網: Redis是一個開源(BSD許可),記憶體存 ...


Redis 的定義?

  百度百科: Redis(Remote Dictionary Server ),即遠程字典服務,是一個開源的使用ANSI C語言編寫、支持網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。
  中文官網: Redis是一個開源(BSD許可),記憶體存儲的數據結構伺服器,可用作資料庫,高速緩存和消息隊列代理。它支持字元串、哈希表、列表、集合、有序集合,點陣圖,hyperloglogs等數據類型。內置複製、Lua腳本、LRU收回、事務以及不同級別磁碟持久化功能,同時通過Redis Sentinel提供高可用,通過Redis Cluster提供自動分區。

簡單來說: Redis 是一個高性能的 key-value 資料庫。

Redis 出現的背景

磁碟時代

很久之前,我們的數據存儲方式是磁碟存儲,每個磁碟都有一個磁軌。每個磁軌有很多扇區,一個扇區接近512Byte。

磁碟的定址速度是毫秒級的,帶寬是GB/MB的。記憶體是ns級的,帶寬也比磁碟大上好幾個數量級。總體來說,磁碟比記憶體在定址上慢了接近10W倍

在這段歷史中,我們的面臨的問題是,I/O問題。在讀寫文件時,我們常常面臨很大的I/O成本問題。但是最初有個最初的解決方案是加一個buffer。

資料庫的產生

資料庫技術就是為瞭解決磁碟的I/O瓶頸。為瞭解決這個問題,我們將磁碟扇區分為4K的一個個小的分區,構成索引。有了這些索引值,我們就能通過索引進行更便捷的查找。為了能否更快的查找,我們將索引使用B+樹進行存儲。

key-value 資料庫的產生

隨著互聯網的發展,我們面臨了一個新的問題。如何才能抵擋高併發,以及大數據導致的查找變慢呢?(註意,數據量變大,僅僅影響多數據查找,單數據查找並不會影響性能。我們的業務邏輯,通常是多條數據查找,所以才會有瓶頸)

高併發意味著每秒的查詢數量很大, 傳統的基於資料庫(磁碟)查找的問題就出來了,磁碟IO很明顯不能有效支撐高併發查詢.(比如,通常單機的MYSQL伺服器只能支撐幾千的併發請求,當然不同配置的機器肯定有所差異)

於是我們的基於記憶體存儲的 key-value 資料庫產生了

Redis 優勢

  • 性能極高: Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
  • 豐富的數據類型: Redis支持二進位案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操作。
  • 原子: Redis的所有操作都是原子性的,意思就是要麼成功執行要麼失敗完全不執行。單個操作是原子性的。多個操作也支持事務,即原子性,通過MULTI和EXEC指令包起來。
  • 豐富的特性: Redis還支持 publish/subscribe, 通知, key 過期等等特性。

Redis與其他key-value存儲有什麼不同?

Redis有著更為複雜的數據結構並且提供對他們的原子性操作,這是一個不同於其他資料庫的進化路徑。Redis的數據類型都是基於基本數據結構的同時對程式員透明,無需進行額外的抽象。
Redis運行在記憶體中但是可以持久化到磁碟,所以在對不同數據集進行高速讀寫時需要權衡記憶體,應為數據量不能大於硬體記憶體。在記憶體資料庫方面的另一個優點是, 相比在磁碟上相同的複雜的數據結構,在記憶體中操作起來非常簡單,這樣Redis可以做很多內部複雜性很強的事情。 同時,在磁碟格式方面他們是緊湊的以追加的方式產生的,因為他們並不需要進行隨機訪問。

Redis 可以做什麼?

  • 熱點數據緩存

    • 頭條新聞
    • 微博熱議
    • 最新評論等等
  • 分散式數據共用

    • Session數據
    • 共用配置
  • 分散式鎖

    • 搶票系統,剩餘票數
    • 秒殺活動,商品庫存
  • 全局ID

    • int類型,incrby,利用原子性 incrby userid 1000 分庫分表的場景,一次性拿一段
  • 計數器

    • int類型,incr方法例如:文章的閱讀量、微博點贊數、允許一定的延遲,先寫入Redis再定時同步到資料庫
  • 限流

    • 以訪問者的ip和其他信息作為key,訪問一次增加一次計數,超過次數則返回false
  • 消息隊列

    • List提供了兩個阻塞的彈出操作:blpop/brpop,可以設置超時時間
    • blpop:blpop key1 timeout 移除並獲取列表的第一個元素,如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。
    • brpop:brpop key1 timeout 移除並獲取列表的最後一個元素,如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。
    • 隊列:先進先除:rpush blpop,左頭右尾,右邊進入隊列,左邊出隊列
    • 棧:先進後出:rpush brpop
  • 抽獎

    • 自帶一個隨機獲得值spop myset

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

-Advertisement-
Play Games
更多相關文章
  • 多對一關係是什麼 Django使用django.db.models.ForeignKey定義多對一關係。 ForeignKey需要一個位置參數:與該模型關聯的類 class Info(models.Model): user = models.ForeignKey(other_model,on_del ...
  • 一、什麼是智能指針 一般來講C++中對於指針指向的對象需要使用new主動分配堆空間,在使用結束後還需要主動調用delete釋放這個堆空間。為了使得自動、異常安全的對象生存期管理可行,就出現了智能指針這個概念。簡單來看智能指針是 RAII(Resource Acquisition Is Initial ...
  • 我們在做採集數據的時候,過快或者訪問頻繁,或者一訪問就給彈出驗證碼,然後就蚌珠了~ 今天就給大家來一個簡單處理驗證碼的方法 環境模塊 本文使用的是 Python和pycharm 這裡需要用到一個 ddddocr 模塊 ,這是別人開源寫好的一個東西,簡單又好用,但是精確度差一點點,但是還是非常好用的。 ...
  • mysql服務端整體架構 主要分為兩部分,server層和存儲引擎 server層包括連接器、查詢緩存、分析器、優化器、執行器等,涵蓋mysql的大多數核心服務過功能,以及所有的內置函數,所有跨存儲引擎的功能都在這一層實現,比如存儲過程,觸發器,視圖等 存儲引擎層負責數據等存儲和讀取,其架構模式是插 ...
  • tunm二進位協議在python上的實現 tunm是一種對標JSON的二進位協議, 支持JSON的所有類型的動態組合 支持的數據類型 基本支持的類型 "u8", "i8", "u16", "i16", "u32", "i32", "u64", "i64", "varint", "float", "s ...
  • 迎面走來了你的面試官,身穿格子衫,挺著啤酒肚,髮際線嚴重後移的中年男子。 手拿泡著枸杞的保溫杯,胳膊夾著MacBook,MacBook上還貼著公司標語:“加班使我快樂”。 面試官: 看你簡歷上用過MySQL,問你幾個簡單的問題吧。什麼是聚簇索引和非聚簇索引? 這個問題難不住我啊。來之前我看一下一燈M ...
  • Python中的字典 Python中的字典是另一種可變容器模型,且可存儲任意類型對象。鍵值使用冒號分割,你可以看成是一串json。 常用方法 獲取字典中的值 dict[key] 如果key不存在會報錯,建議使用dict.get(key),不存在返回None 修改和新建字典值 dict[key]=va ...
  • 事情的起因是收到了一位網友的請求,他的java課設需要設計實現迷宮相關的程式——如標題概括。 我這邊不方便透露相關信息,就只把任務要求寫出來。 演示視頻指路👉: 基於JavaFX圖形界面的迷宮程式演示_嗶哩嗶哩_bilibili 完整代碼鏈接🔎: 網盤:https://pan.baidu.com ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...