Redis五大基本數(shù)據(jù)類型及對應(yīng)使用場景總結(jié)
一 什么是NoSQL?
Nosql = not only sql(不僅僅是SQL)
關(guān)系型數(shù)據(jù)庫:列+行,同一個表下數(shù)據(jù)的結(jié)構(gòu)是一樣的。
非關(guān)系型數(shù)據(jù)庫:數(shù)據(jù)存儲沒有固定的格式,并且可以進行橫向擴展。
NoSQL泛指非關(guān)系型數(shù)據(jù)庫,隨著web2.0互聯(lián)網(wǎng)的誕生,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫很難對付web2.0大數(shù)據(jù)時代!尤其是超大規(guī)模的高并發(fā)的社區(qū),暴露出來很多難以克服的問題,NoSQL在當(dāng)今大數(shù)據(jù)環(huán)境下發(fā)展的十分迅速,Redis是發(fā)展最快的。
傳統(tǒng)RDBMS和NoSQL
RDBMS
- 組織化結(jié)構(gòu)
- 固定SQL
- 數(shù)據(jù)和關(guān)系都存在單獨的表中(行列)
- DML(數(shù)據(jù)操作語言)、DDL(數(shù)據(jù)定義語言)等
- 嚴格的一致性(ACID): 原子性、一致性、隔離性、持久性
- 基礎(chǔ)的事務(wù)
NoSQL
- 不僅僅是數(shù)據(jù)
- 沒有固定查詢語言
- 鍵值對存儲(redis)、列存儲(HBase)、文檔存儲(MongoDB)、圖形數(shù)據(jù)庫(不是存圖形,放的是關(guān)系)(Neo4j)
- 最終一致性(BASE):基本可用、軟狀態(tài)/柔性事務(wù)、最終一致性
二 redis是什么?
Redis = Remote Dictionary Server,即遠程字典服務(wù)。
是一個開源的使用ANSI C語言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API。
與memcached一樣,為了保證效率,數(shù)據(jù)都是緩存在內(nèi)存中。區(qū)別的是redis會周期性的把更新的數(shù)據(jù)寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎(chǔ)上實現(xiàn)了master-slave(主從)同步。
三 redis五大基本類型
Redis是一個開源,內(nèi)存存儲的數(shù)據(jù)結(jié)構(gòu)服務(wù)器,可用作數(shù)據(jù)庫,高速緩存和消息隊列代理。它支持字符串、哈希表、列表、集合、有序集合,位圖,hyperloglogs等數(shù)據(jù)類型。內(nèi)置復(fù)制、Lua腳本、LRU收回、事務(wù)以及不同級別磁盤持久化功能,同時通過Redis Sentinel提供高可用,通過Redis Cluster提供自動分區(qū)。
由于redis類型大家很熟悉,且網(wǎng)上命令使用介紹很多,下面重點介紹五大基本類型的底層數(shù)據(jù)結(jié)構(gòu)與應(yīng)用場景,以便當(dāng)開發(fā)時,可以熟練使用redis。
1 String(字符串)
1.String類型是redis的最基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu),也是最經(jīng)常使用到的類型。 而且其他的四種類型多多少少都是在字符串類型的基礎(chǔ)上構(gòu)建的,所以String類型是redis的基礎(chǔ)。
2.String 類型的值最大能存儲 512MB,這里的String類型可以是簡單字符串、 復(fù)雜的xml/json的字符串、二進制圖像或者音頻的字符串、以及可以是數(shù)字的字符串
應(yīng)用場景
1、緩存功能:String字符串是最常用的數(shù)據(jù)類型,不僅僅是redis,各個語言都是最基本類型,因此,利用redis作為緩存,配合其它數(shù)據(jù)庫作為存儲層,利用redis支持高并發(fā)的特點,可以大大加快系統(tǒng)的讀寫速度、以及降低后端數(shù)據(jù)庫的壓力。
2、計數(shù)器:許多系統(tǒng)都會使用redis作為系統(tǒng)的實時計數(shù)器,可以快速實現(xiàn)計數(shù)和查詢的功能。而且最終的數(shù)據(jù)結(jié)果可以按照特定的時間落地到數(shù)據(jù)庫或者其它存儲介質(zhì)當(dāng)中進行永久保存。
3、統(tǒng)計多單位的數(shù)量:eg,uid:gongming count:0 根據(jù)不同的uid更新count數(shù)量。
4、共享用戶session:用戶重新刷新一次界面,可能需要訪問一下數(shù)據(jù)進行重新登錄,或者訪問頁面緩存cookie,這兩種方式做有一定弊端,1)每次都重新登錄效率低下 2)cookie保存在客戶端,有安全隱患。這時可以利用redis將用戶的session集中管理,在這種模式只需要保證redis的高可用,每次用戶session的更新和獲取都可以快速完成。大大提高效率。
2 List(列表)
1.list類型是用來存儲多個有序的字符串的,列表當(dāng)中的每一個字符看做一個元素
2.一個列表當(dāng)中可以存儲有一個或者多個元素,redis的list支持存儲2^32次方-1個元素。
3.redis可以從列表的兩端進行插入(pubsh)和彈出(pop)元素,支持讀取指定范圍的元素集, 或者讀取指定下標的元素等操作。redis列表是一種比較靈活的鏈表數(shù)據(jù)結(jié)構(gòu),它可以充當(dāng)隊列或者棧的角色。
4.redis列表是鏈表型的數(shù)據(jù)結(jié)構(gòu),所以它的元素是有序的,而且列表內(nèi)的元素是可以重復(fù)的。 意味著它可以根據(jù)鏈表的下標獲取指定的元素和某個范圍內(nèi)的元素集。
應(yīng)用場景
1、消息隊列:reids的鏈表結(jié)構(gòu),可以輕松實現(xiàn)阻塞隊列,可以使用左進右出的命令組成來完成隊列的設(shè)計。比如:數(shù)據(jù)的生產(chǎn)者可以通過Lpush命令從左邊插入數(shù)據(jù),多個數(shù)據(jù)消費者,可以使用BRpop命令阻塞的“搶”列表尾部的數(shù)據(jù)。
2、文章列表或者數(shù)據(jù)分頁展示的應(yīng)用。比如,我們常用的博客網(wǎng)站的文章列表,當(dāng)用戶量越來越多時,而且每一個用戶都有自己的文章列表,而且當(dāng)文章多時,都需要分頁展示,這時可以考慮使用redis的列表,列表不但有序同時還支持按照范圍內(nèi)獲取元素,可以完美解決分頁查詢功能。大大提高查詢效率。
3 Set(集合)
1.redis集合(set)類型和list列表類型類似,都可以用來存儲多個字符串元素的集合。
2.但是和list不同的是set集合當(dāng)中不允許重復(fù)的元素。而且set集合當(dāng)中元素是沒有順序的,不存在元素下標。
3.redis的set類型是使用哈希表構(gòu)造的,因此復(fù)雜度是O(1),它支持集合內(nèi)的增刪改查, 并且支持多個集合間的交集、并集、差集操作??梢岳眠@些集合操作,解決程序開發(fā)過程當(dāng)中很多數(shù)據(jù)集合間的問題。
應(yīng)用場景
1、標簽:比如我們博客網(wǎng)站常常使用到的興趣標簽,把一個個有著相同愛好,關(guān)注類似內(nèi)容的用戶利用一個標簽把他們進行歸并。
2、共同好友功能,共同喜好,或者可以引申到二度好友之類的擴展應(yīng)用。
3、統(tǒng)計網(wǎng)站的獨立IP。利用set集合當(dāng)中元素不唯一性,可以快速實時統(tǒng)計訪問網(wǎng)站的獨立IP。
數(shù)據(jù)結(jié)構(gòu)
set的底層結(jié)構(gòu)相對復(fù)雜寫,使用了intset和hashtable兩種數(shù)據(jù)結(jié)構(gòu)存儲,intset可以理解為數(shù)組。
4 sorted set(有序集合)
redis有序集合也是集合類型的一部分,所以它保留了集合中元素不能重復(fù)的特性,但是不同的是,有序集合給每個元素多設(shè)置了一個分數(shù)。
redis有序集合也是集合類型的一部分,所以它保留了集合中元素不能重復(fù)的特性,但是不同的是,有序集合給每個元素多設(shè)置了一個分數(shù),利用該分數(shù)作為排序的依據(jù)。
應(yīng)用場景
1、 排行榜:有序集合經(jīng)典使用場景。例如視頻網(wǎng)站需要對用戶上傳的視頻做排行榜,榜單維護可能是多方面:按照時間、按照播放量、按照獲得的贊數(shù)等。
2、用Sorted Sets來做帶權(quán)重的隊列,比如普通消息的score為1,重要消息的score為2,然后工作線程可以選擇按score的倒序來獲取工作任務(wù)。讓重要的任務(wù)優(yōu)先執(zhí)行。
5 hash(哈希)
Redis hash數(shù)據(jù)結(jié)構(gòu) 是一個鍵值對(key-value)集合,它是一個 string 類型的 field 和 value 的映射表,redis本身就是一個key-value型數(shù)據(jù)庫,因此hash數(shù)據(jù)結(jié)構(gòu)相當(dāng)于在value中又套了一層key-value型數(shù)據(jù)。所以redis中hash數(shù)據(jù)結(jié)構(gòu)特別適合存儲關(guān)系型對象
應(yīng)用場景
1、由于hash數(shù)據(jù)類型的key-value的特性,用來存儲關(guān)系型數(shù)據(jù)庫中表記錄,是redis中哈希類型最常用的場景。一條記錄作為一個key-value,把每列屬性值對應(yīng)成field-value存儲在哈希表當(dāng)中,然后通過key值來區(qū)分表當(dāng)中的主鍵。
2、經(jīng)常被用來存儲用戶相關(guān)信息。優(yōu)化用戶信息的獲取,不需要重復(fù)從數(shù)據(jù)庫當(dāng)中讀取,提高系統(tǒng)性能。
以上就是Redis五大基本數(shù)據(jù)類型及對應(yīng)使用場景總結(jié)的詳細內(nèi)容,更多關(guān)于Redis五大基本數(shù)據(jù)類型的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
為何Redis使用跳表而非紅黑樹實現(xiàn)SortedSet
本篇文章主要介紹了為何Redis使用跳表而非紅黑樹實現(xiàn)SortedSet,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09Redis高效查詢大數(shù)據(jù)的實踐與優(yōu)化詳細指南
Redis 是一種高性能的鍵值存儲數(shù)據(jù)庫,廣泛應(yīng)用于緩存,排行榜,計數(shù)器等場景,本文將圍繞如何高效查詢Redis中滿足條件的數(shù)據(jù)展開討論,感興趣的小伙伴可以了解下2025-04-04