一文回顧Redis五大對象(數據類型)

系列文章

最新:Redis持久化——如何選擇合適的持久化方式html

最新:Redis持久化——AOF日誌面試

最新:Redis持久化——內存快照(RDB)redis

一文回顧Redis五大對象(數據類型)數據庫

Redis對象——有序集合(ZSet)後端

Redis對象——集合(Set)緩存

Redis對象——列表(List)數據結構

Redis對象——哈希(Hash)分佈式

Redis數據結構——quicklist性能

Redis對象——字符串學習

Redis對象——Redis對象系統簡介

Redis數據結構——壓縮列表

Redis數據結構——整數集合

Redis數據結構——跳躍表

Redis數據結構——字典

Redis數據結構——鏈表

Redis數據結構——簡單動態字符串SDS

Redis 是一個高性能的分佈式內存型數據庫,在國內外各大互聯網公司中都有着普遍的使用,即便是一些非互聯網公司中也有着很是重要的適用場景,因此對 Redis 的掌握也成爲後端工程師必備的基礎技能,在面試中,Redis早已成爲老生常談的話題,而在實際工做中,咱們更是每時每刻都須要和 Redis 打交道。所以熟練的掌握Redis技術棧的各類武功祕籍相當重要!

Redis提供了五種主要的對象(數據類型)供開發者使用,它提供了強大且實用的功能。然而實際開發中有大多數的開發者僅簡單會用Redis String的Get與Set。這就比如降龍十八掌,你只學會了一掌。在真正實戰對敵之時難免略顯單薄!這篇文章咱們將回顧Redis這五大對象,以便於咱們可以在實戰中真正作到遊刃有餘。

1、字符串(終究是我扛下了全部)

字符串類型是Redis最基礎的數據結構,其餘幾種數據結構都是在字符串類型基礎上構建的。字符串類型的值是字符串(簡單的字符串、複雜的字符串(例如JSON、XML))、數字(整數、浮點數),甚至是二進制(圖片、音頻、視頻)等

字符串對象的內部編碼有3種 :intrawembstr。Redis會根據當前值的類型和長度來決定使用哪一種編碼來實現。

  • int:若是一個字符串對象保存的是整數值,而且這個整數值能夠用long類型來表示
  • raw:若是字符串對象保存的是一個字符串值,而且這個字符串值的長度大於32字節
  • embstr:若是字符串對象保存的是一個字符串值,而且這個字符申值的長度小於等於32字節

 reids字符串的使用場景是最爲普遍的,甚至有些對redis其它幾種對象不太熟悉的人,基本全部場景都會使用字符串(序列化一下直接扔進去),這讓自己很單純的字符串承受了它這個年紀本不應承受的重量。其實Redis的主要使用場景主要有如下幾種:

  1. 做爲緩存層,緩存熱點數據
  2. Redis字符串能夠自增自減的特性能夠用來作計數器、限速器、自增ID生成等
  3. 分佈式系統的Session共享
  4. 二進制數據的存儲

有關Redis字符串的更詳細的介紹,能夠查看個人這篇文章。

Redis對象——字符串(String)

2、哈希(存儲對象我也行)

哈希對象用來存儲一組數據對。每一個數據對又包含鍵值兩部分。

Redis-Hash

哈希對象也有兩種實現方式。ziplist(壓縮列表),hashtable(哈希表)

一樣,只有當存儲的數據量比較小的狀況下,Redis 才使用壓縮列表來實現哈希對象。具體須要知足兩個條件:

  • 字典中保存的鍵和值的大小都要小於 64 字節;
  • 字典中鍵值對的個數要小於 512 個。

當不能同時知足上面兩個條件的時候,Redis 就使用哈希表來實現哈希對象。

當存儲的內容是對象的時候,Redis 字符串對象的不少功能使用Redis 哈希對象也能夠實現。如緩存用戶信息的時候,使用Redis哈希對象存儲,簡單直觀,若是使用合理能夠減小內存空間的使用。但也有其缺點,就是要要控制哈希在ziplist和hashtable兩種內部編碼的轉換,hashtable會消耗更多內存。

此外,Redis 哈希對象還能夠實現購物車、計數器等功能。

有關Redis哈希對象的更詳細的介紹,能夠查看個人這篇文章。

Redis對象——哈希(Hash)

3、列表(棧和隊列我都行)

列表這種對象支持存儲一組有序的、可重複的數據。由於其有序性,它能夠獲取指定範圍的元素列表、能夠在O(1)的時間複雜度獲取指定索引下標的元素等。

在Redis3.2版本之前列表類型的內部編碼有兩種。當知足下面兩個條件的時候,Redis 列表對象使用ziplist(壓縮列表)來實現。

  • 當列表的元素個數小於list-max-ziplist-entries配置(默認512個)

  • 當列表中每一個元素的值都小於list-max-ziplist-value配置時(默認64字節)

當列表類型沒法知足ziplist的條件時,Redis會使用linkedlist做爲列表的內部實現。

而在Redis3.2版本開始對列表數據結構進行了改造,使用 quicklist 代替了 ziplist 和 linkedlist.

因爲列表對象的有序的特性,它比較適合用來作文章、商品等列表的存儲。

列表類型能夠 lpush (左側push),同時又可使用 rpop (右側彈出)(查詢並刪除)第一個元素,因此列表類型具備先進先出的特性,能夠用來實現消息隊列。也能夠lpush(左側push)->lpop(左側彈出),具備後進先出的特性,所以開發中須要使用棧的時候,咱們也能夠藉助列表對象來實現。
有關Redis列表對象的更詳細的介紹,能夠查看個人這篇文章。

Redis對象——列表(List)

4、集合(標籤系統我在行)

集合對象 (Set) 是一個無序並惟一的鍵值集合。它的存儲順序不會按照插入的前後順序進行存儲。與列表所不一樣的是它存儲的數據是無序且不重複的。

集合對象的內部編碼也有兩種:intset(整數集合)與hashtable(哈希表)。當知足下面兩個條件的時候集合對象使用intset來實現。

  • 集合中的元素都是整數
  • 集合中的元素個數小於set-maxintset-entries配置(默認512個)

不知足上面兩個條件時集合對象使用hashtable來實現。

集合對象的主要幾個特性就是,無序、不可重複、支持並交差,所以能夠用來作標籤系統。

而集合的 SPOP(隨機移除並返回集合中一個或多個元素)SRANDMEMBER(隨機返回集合中一個或多個元素) 命令能夠幫助咱們實現一個抽獎系統。

有關Redis集合對象的更詳細的介紹,能夠查看個人這篇文章。

Redis對象——集合(Set)

5、有序集合(排起名來我最棒)

有序集合類型 (Sorted Set或ZSet) 相比於集合類型多了一個排序屬性 score(分值),對於有序集合 ZSet 來講,每一個存儲元素至關於有兩個值組成的,一個是有序結合的元素值,一個是排序值。有序集合保留了集合不能有重複成員的特性(分值能夠重複),但不一樣的是,有序集合中的元素能夠排序。

有序集合是由 ziplist (壓縮列表)skiplist (跳躍表) 組成的。

當數據比較少時,有序集合使用的是 ziplist 存儲的,有序集合使用 ziplist 格式存儲必須知足如下兩個條件:

  • 有序集合保存的元素個數要小於 128 個;
  • 有序集合保存的全部元素成員的長度都必須小於 64 字節。

若是不能知足以上兩個條件中的任意一個,有序集合將會使用 skiplist 結構進行存儲。

有序集合比較典型的使用場景就是排行榜系統例如學生成績的排名。某視頻(博客等)網站的用戶點贊、播放排名、電商系統中商品的銷量排名等

有關Redis有序集合對象的更詳細的介紹,能夠查看個人這篇文章。

Redis對象——有序集合(ZSet)

小結

Redis提供了五種最基礎也是最經常使用的對象(數據類型):String、Hash、List、Set、ZSet。瞭解這五種對象的有助於咱們更好的在平常開發中對Redis進行使用。而經過這篇文章咱們能夠看到每種對象都是經過多種數據結構來實現的,你們能夠思考一下爲何。

-----END-----

關注下方公衆號,回覆「Redis」,可得Redis相關學習資料

相關文章
相關標籤/搜索