Redis五大基本數據類型及其使用場景

文章目錄

    • **一 什么是NoSQL?**
    • **二 redis是什么?**
    • **三 redis五大基本類型**
      • 1 String(字符串)
        • **應用場景**
      • 2 List(列表)
        • **應用場景**
      • 3 Set(集合)
      • 4 sorted set(有序集合)
        • **應用場景**
      • 5 hash(哈希)
        • **應用場景**



在這里插入圖片描述

一 什么是NoSQL?

Nosql = not only sql(不僅僅是SQL)

關系型數據庫:列+行,同一個表下數據的結構是一樣的。

非關系型數據庫:數據存儲沒有固定的格式,并且可以進行橫向擴展。

NoSQL泛指非關系型數據庫,隨著web2.0互聯網的誕生,傳統的關系型數據庫很難對付web2.0大數據時代!尤其是超大規模的高并發的社區,暴露出來很多難以克服的問題,NoSQL在當今大數據環境下發展的十分迅速,Redis是發展最快的。

傳統RDBMS和NoSQL

RDBMS

  • 組織化結構
  • 固定SQL
  • 數據和關系都存在單獨的表中(行列)
  • DML(數據操作語言)、DDL(數據定義語言)等
  • 嚴格的一致性(ACID): 原子性、一致性、隔離性、持久性
  • 基礎的事務

NoSQL

  • 不僅僅是數據
  • 沒有固定查詢語言
  • 鍵值對存儲(redis)、列存儲(HBase)、文檔存儲(MongoDB)、圖形數據庫(不是存圖形,放的是關系)(Neo4j)
  • 最終一致性(BASE):基本可用、軟狀態/柔性事務、最終一致性

二 redis是什么?

Redis = Remote Dictionary Server,即遠程字典服務。

是一個開源的使用ANSI C語言編寫、支持網絡、可基于內存亦可持久化的日志型、Key-Value數據庫,并提供多種語言的API。

與memcached一樣,為了保證效率,數據都是緩存在內存中。區別的是redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎上實現了master-slave(主從)同步。

三 redis五大基本類型

Redis是一個開源,內存存儲的數據結構服務器,可用作數據庫,高速緩存和消息隊列代理。它支持字符串、哈希表、列表、集合、有序集合,位圖,hyperloglogs等數據類型。內置復制、Lua腳本、LRU收回、事務以及不同級別磁盤持久化功能,同時通過Redis Sentinel提供高可用,通過Redis Cluster提供自動分區。

由于redis類型大家很熟悉,且網上命令使用介紹很多,下面重點介紹五大基本類型的底層數據結構與應用場景,以便當開發時,可以熟練使用redis。

1 String(字符串)

1.String類型是redis的最基礎的數據結構,也是最經常使用到的類型。 而且其他的四種類型多多少少都是在字符串類型的基礎上構建的,所以String類型是redis的基礎。
2.String 類型的值最大能存儲 512MB,這里的String類型可以是簡單字符串、 復雜的xml/json的字符串、二進制圖像或者音頻的字符串、以及可以是數字的字符串

應用場景

1、緩存功能:String字符串是最常用的數據類型,不僅僅是redis,各個語言都是最基本類型,因此,利用redis作為緩存,配合其它數據庫作為存儲層,利用redis支持高并發的特點,可以大大加快系統的讀寫速度、以及降低后端數據庫的壓力。

2、計數器:許多系統都會使用redis作為系統的實時計數器,可以快速實現計數和查詢的功能。而且最終的數據結果可以按照特定的時間落地到數據庫或者其它存儲介質當中進行永久保存。

3、統計多單位的數量:eg,uid:gongming count:0 根據不同的uid更新count數量。

4、共享用戶session:用戶重新刷新一次界面,可能需要訪問一下數據進行重新登錄,或者訪問頁面緩存cookie,這兩種方式做有一定弊端,1)每次都重新登錄效率低下 2)cookie保存在客戶端,有安全隱患。這時可以利用redis將用戶的session集中管理,在這種模式只需要保證redis的高可用,每次用戶session的更新和獲取都可以快速完成。大大提高效率。

2 List(列表)

1.list類型是用來存儲多個有序的字符串的,列表當中的每一個字符看做一個元素
2.一個列表當中可以存儲有一個或者多個元素,redis的list支持存儲2^32次方-1個元素。
3.redis可以從列表的兩端進行插入(pubsh)和彈出(pop)元素,支持讀取指定范圍的元素集, 或者讀取指定下標的元素等操作。redis列表是一種比較靈活的鏈表數據結構,它可以充當隊列或者棧的角色。
4.redis列表是鏈表型的數據結構,所以它的元素是有序的,而且列表內的元素是可以重復的。 意味著它可以根據鏈表的下標獲取指定的元素和某個范圍內的元素集。

應用場景

1、消息隊列:reids的鏈表結構,可以輕松實現阻塞隊列,可以使用左進右出的命令組成來完成隊列的設計。比如:數據的生產者可以通過Lpush命令從左邊插入數據,多個數據消費者,可以使用BRpop命令阻塞的“搶”列表尾部的數據。

2、文章列表或者數據分頁展示的應用。比如,我們常用的博客網站的文章列表,當用戶量越來越多時,而且每一個用戶都有自己的文章列表,而且當文章多時,都需要分頁展示,這時可以考慮使用redis的列表,列表不但有序同時還支持按照范圍內獲取元素,可以完美解決分頁查詢功能。大大提高查詢效率。

3 Set(集合)

1.redis集合(set)類型和list列表類型類似,都可以用來存儲多個字符串元素的集合。
2.但是和list不同的是set集合當中不允許重復的元素。而且set集合當中元素是沒有順序的,不存在元素下標。
3.redis的set類型是使用哈希表構造的,因此復雜度是O(1),它支持集合內的增刪改查, 并且支持多個集合間的交集、并集、差集操作。可以利用這些集合操作,解決程序開發過程當中很多數據集合間的問題。

應用場景

1、標簽:比如我們博客網站常常使用到的興趣標簽,把一個個有著相同愛好,關注類似內容的用戶利用一個標簽把他們進行歸并。

2、共同好友功能,共同喜好,或者可以引申到二度好友之類的擴展應用。

3、統計網站的獨立IP。利用set集合當中元素不唯一性,可以快速實時統計訪問網站的獨立IP。

數據結構

set的底層結構相對復雜寫,使用了intset和hashtable兩種數據結構存儲,intset可以理解為數組。

4 sorted set(有序集合)

redis有序集合也是集合類型的一部分,所以它保留了集合中元素不能重復的特性,但是不同的是,有序集合給每個元素多設置了一個分數。

redis有序集合也是集合類型的一部分,所以它保留了集合中元素不能重復的特性,但是不同的是,有序集合給每個元素多設置了一個分數,利用該分數作為排序的依據。

應用場景

1、 排行榜:有序集合經典使用場景。例如視頻網站需要對用戶上傳的視頻做排行榜,榜單維護可能是多方面:按照時間、按照播放量、按照獲得的贊數等。

2、用Sorted Sets來做帶權重的隊列,比如普通消息的score為1,重要消息的score為2,然后工作線程可以選擇按score的倒序來獲取工作任務。讓重要的任務優先執行。

5 hash(哈希)

Redis hash數據結構 是一個鍵值對(key-value)集合,它是一個 string 類型的 field 和 value 的映射表,redis本身就是一個key-value型數據庫,因此hash數據結構相當于在value中又套了一層key-value型數據。所以redis中hash數據結構特別適合存儲關系型對象

應用場景

1、由于hash數據類型的key-value的特性,用來存儲關系型數據庫中表記錄,是redis中哈希類型最常用的場景。一條記錄作為一個key-value,把每列屬性值對應成field-value存儲在哈希表當中,然后通過key值來區分表當中的主鍵。

2、經常被用來存儲用戶相關信息。優化用戶信息的獲取,不需要重復從數據庫當中讀取,提高系統性能。


在這里插入圖片描述

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

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

相關文章

高級藝術二維碼制作教程

最近不少關于二維碼制作的,而且都是付費。大概就是一個好看的二維碼,掃描后跳轉網址。本篇文章使用Python來實現,這么簡單花啥錢呢?學會,拿去賣便宜點吧。 文章目錄 高級二維碼制作環境安裝普通二維碼藝術二維碼動態 …

【LVS】2、部署LVS-DR群集

LVS-DR數據包的流向分析 1.客戶端發送請求到負載均衡器,請求的數據報文到達內核空間; 2.負載均衡服務器和正式服務器在同一個網絡中,數據通過二層數據鏈路層來傳輸; 3.內核空間判斷數據包的目標IP是本機VIP,此時IP虛…

批量將Excel中的第二列內容從拼音轉換為漢字

要批量將Excel中的第二列內容從拼音轉換為漢字,您可以使用Python的openpyxl庫來實現。下面是一個示例代碼,演示如何讀取Excel文件并將第二列內容進行拼音轉漢字: from openpyxl import load_workbook from xpinyin import Pinyin # 打開Exce…

Android kotlin系列講解(入門篇)使用Intent在Activity之間穿梭

<<返回總目錄 上一篇:Android kotlin系列講解(入門篇)Activity的理解與基本用法 文章目錄 1、使用顯式Intent2、使用隱式Intent3、更多隱式Intent的用法4、向下一個Activity傳遞數據5、返回數據給上一個Activity1、使用顯式Intent 你應該已經對創建Activity的流程比較…

SASS 學習筆記

SASS 學習筆記 總共會寫兩個練手項目&#xff0c;成品在 https://goldenaarcher.com/scss-study 可以看到&#xff0c;代碼在 https://github.com/GoldenaArcher/scss-study。 什么是 SASS SASS 是 CSS 預處理&#xff0c;它提供了變量&#xff08;雖然現在 CSS 也提供了&am…

C++ 面向對象三大特性——繼承

?<1>主頁&#xff1a;我的代碼愛吃辣 &#x1f4c3;<2>知識講解&#xff1a;C 繼承 ??<3>開發環境&#xff1a;Visual Studio 2022 &#x1f4ac;<4>前言&#xff1a;面向對象三大特性的&#xff0c;封裝&#xff0c;繼承&#xff0c;多態&#xff…

【數倉建設系列之一】什么是數據倉庫?

一、什么是數據倉庫&#xff1f; 數據倉庫(Data Warehouse&#xff0c;簡稱DW)簡單來講&#xff0c;它是一個存儲和管理大量結構化和非結構化數據的存儲集合&#xff0c;它以主題為向導&#xff0c;通過整合來自不同數據源下的數據(比如各業務數據&#xff0c;日志文件數據等)…

內網穿透和服務器+IP 實現公網訪問內網的區別

內網穿透和服務器IP 實現公網訪問內網的區別在于實現方式和使用場景。 內網穿透&#xff08;Port Forwarding&#xff09;&#xff1a;內網穿透是一種通過網絡技術將公網用戶的請求通過中轉服務器傳輸到內網設備的方法。通過在路由器或防火墻上進行配置&#xff0c;將公網請求…

MySQL- sql語句基礎

文章目錄 1.select后對表進行修改&#xff08;delete&#xff09;2.函數GROUP_CONCAT()3.使用正則表達式3.DATE_FORMAT()4.count() 加條件 1.select后對表進行修改&#xff08;delete&#xff09; 報錯&#xff1a;You can’t specify target table ‘Person’ for update in …

proteus結合keil-arm編譯器構建STM32單片機項目進行仿真

proteus是可以直接創建設計圖和源碼的&#xff0c;但是源碼編譯它需要借助keil-arm編譯器&#xff0c;也就是我們安裝keil-mdk之后自帶的編譯器。 下面給出一個完整的示例&#xff0c;主要是做一個LED燈閃爍的效果。 新建工程指定路徑&#xff0c;Schematic,PCB layout都選擇默…

【Docker】 使用Docker-Compose 搭建基于 WordPress 的博客網站

引 本文將使用流行的博客搭建工具 WordPress 搭建一個私人博客站點。部署過程中使用到了 Docker 、MySQL 。站點搭建完成后經行了發布文章的體驗。 WordPress WordPress 是一個廣泛使用的開源內容管理系統&#xff08;CMS&#xff09;&#xff0c;用于構建和管理網站、博客和…

單例設計模式精講(餓漢式和懶漢式實現的重要方法)

目錄 什么叫做單例模式&#xff1f; 餓漢式和懶漢式的區別&#xff1f; 餓漢式-方式1&#xff08;靜態變量方式&#xff09; 餓漢式-方式2&#xff08;靜態代碼塊方式&#xff09; 懶漢式-方式1&#xff08;線程不安全&#xff09; 懶漢式-方式2&#xff08;線程安全&…

FifthOne:用于矢量搜索的計算機視覺接口

一、說明 數據太多了。數據湖和數據倉庫;廣闊的像素牧場和充滿文字的海洋。找到正確的數據就像大海撈針一樣&#xff01;如果你喜歡開源機器學習庫 FiftyOne&#xff0c;矢量搜索引擎通過將復雜數據&#xff08;圖像的原始像素值、文本文檔中的字符&#xff09;轉換為稱為嵌入矢…

PHP報錯:未定義常量的解決方法!

PHP報錯&#xff1a;未定義常量的解決方法&#xff01; 在PHP編程中&#xff0c;我們經常會遇到常量未定義的錯誤。這種錯誤通常會在代碼中使用未定義的常量時發生。本文將介紹常量的概念以及如何解決未定義常量的問題。 首先&#xff0c;讓我們來了解什么是常量。在PHP中&am…

大數據平臺運維實訓室建設方案

一、概況 本實訓室的主要目的是培養大數據平臺運維項目的實踐能力,以數據計算、分析、挖掘和可視化的案例訓練為輔助。同時,實訓室也承擔相關考評員與講師培訓考試、學生認證培訓考試、社會人員認證培訓考試、大數據技能大賽訓練、大數據專業課程改革等多項任務。 實訓室旨在培…

無人機跟隨一維高度避障場景--邏輯分析

無人機跟隨一維高度避障場景--邏輯分析 1. 源由2. 視頻3. 問題3.1 思維發散3.2 問題收斂 4. 圖示4.1 水平模式4.2 下坡模式4.3 上坡模式4.4 碰撞分析 5. 總結5.1 一維高度避障場景5.2 業界跟隨產品5.3 APM集成跟隨示意圖一&#xff1a;示意圖二&#xff1a;示意圖三&#xff1a…

Java算法_ 驗證二叉搜索樹(LeetCode_Hot100)

題目描述&#xff1a; 給你一個二叉樹的根節點 &#xff0c;判斷其是否是一個有效的二叉搜索樹。root 有效 二叉搜索樹定義如下&#xff1a; 節點的左子樹只包含 小于 當前節點的數。 節點的右子樹只包含 大于 當前節點的數。 所有左子樹和右子樹自身必須也是二叉搜索樹。 獲得…

【TypeScript】tsc -v 報錯 —— 在此系統上禁止運行腳本

在 VS Code 終端中執行 tsc -v &#xff0c;報錯 —— 在此系統上禁止運行腳本 然后 windows x &#xff0c;打開終端管理員&#xff0c;出現同樣的問題 解決方法&#xff1a; 終端&#xff08;管理員&#xff09;執行以下命令&#xff1a; 出現 RemoteSigned 則代表更改成功…

11,模板泛化、模板特化、所占字節數、繼承實現模板展開、using循環命名展開可變參數

模板泛化、模板特化、所占字節數、繼承實現模板展開、using循環命名展開可變參數 模板泛化模板特化模板全特化通過模板偏特化獲取類型所占字節數通過模板偏特化和宏獲取類型所占字節數...ParamTypes和ParamTypes...的區別 通過繼承實現模板展開using 通過using循環命名的方式來…

開發一個文生圖的功能

文章目錄 效果開發環境原理核心代碼代碼倉庫問題效果 開發環境 Python 3.10PyCharm原理 借助開源項目stable-diffusion,通過該項目封裝python庫diffusers,可以輕易的實現文生圖的功能。 關于更多diffusers的功能請訪問:https://huggingface.co/docs/diffusers/index 核心代…