Redis的五大物件

2021-10-05 07:04:19 字數 2633 閱讀 9839

redis是乙個高效能的分布式記憶體型資料庫,再國內外都有著廣泛使用,所以對redis的掌握也成為後端工程師必備的基礎技能。

redis提供了五種主要的物件(資料型別)供開發者使用,它提供了強大且實用的功能。然而實際開發中有大多數的開發者僅簡單會用redis string的get與set。

字串物件的內部編碼有3種 :int、raw和embstr。redis會根據當前值的型別和長度來決定使用哪種編碼來實現。

int:如果乙個字串物件儲存的是整數值,並且這個整數值可以用long型別來表示

raw:如果字串物件儲存的是乙個字串值,並且這個字串值的長度大於32位元組

embstr:如果字串物件儲存的是乙個字串值,並且這個字元申值的長度小於等於32位元組

reids字串的使用場景是最為廣泛的,甚至有些對redis其它幾種物件不太熟悉的人,基本所有場景都會使用字串(序列化一下直接扔進去),這讓本身很單純的字串承受了它這個年紀本不該承受的重量。其實redis的主要使用場景主要有以下幾種:

作為快取層,快取熱點資料

redis字串可以自增自減的特性可以用來做計數器、限速器、自增id生成等

分布式系統的session共享

二進位制資料的儲存

雜湊物件用來儲存一組資料對。每個資料對又包含鍵值兩部分。

希物件也有兩種實現方式。ziplist(壓縮列表),hashtable(雜湊表)

同樣,只有當儲存的資料量比較小的情況下,redis 才使用壓縮列表來實現雜湊物件。具體需要滿足兩個條件:

字典中儲存的鍵和值的大小都要小於 64 位元組;

字典中鍵值對的個數要小於 512 個。

當不能同時滿足上面兩個條件的時候,redis 就使用雜湊表來實現雜湊物件。

當儲存的內容是物件的時候,redis 字串物件的很多功能使用redis 雜湊物件也可以實現。如快取使用者資訊的時候,使用redis雜湊物件儲存,簡單直觀,如果使用合理可以減少記憶體空間的使用。但也有其缺點,就是要要控制雜湊在ziplist和hashtable兩種內部編碼的轉換,hashtable會消耗更多記憶體。

此外,redis 雜湊物件還可以實現購物車、計數器等功能。

三、列表(棧和佇列我都行)#

列表這種物件支援儲存一組有序的、不重複的資料。因為其有序性,它可以獲取指定範圍的元素列表、可以在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)

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

集合物件 (set) 是乙個無序並唯一的鍵值集合。它的儲存順序不會按照插入的先後順序進行儲存。與列表所不同的是它儲存的資料是無序且不重複的。

集合物件的內部編碼也有兩種:intset(整數集合)與hashtable(雜湊表)。當滿足下面兩個條件的時候集合物件使用intset來實現。

集合中的元素都是整數

集合中的元素個數小於set-maxintset-entries配置(預設512個)

不滿足上面兩個條件時集合物件使用hashtable來實現。

集合物件的主要幾個特性就是,無序、不可重複、支援並交差,因此可以用來做標籤系統。

而集合的 spop(隨機移除並返回集合中乙個或多個元素) 和 srandmember(隨機返回集合中乙個或多個元素) 命令可以幫助我們實現乙個**系統。

有關redis集合物件的更詳細的介紹,可以檢視我的這篇文章。

redis物件——集合(set)

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

有序集合型別 (sorted set或zset) 相比於集合型別多了乙個排序屬性 score(分值),對於有序集合 zset 來說,每個儲存元素相當於有兩個值組成的,乙個是有序結合的元素值,乙個是排序值。有序集合保留了集合不能有重複成員的特性(分值可以重複),但不同的是,有序集合中的元素可以排序。

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

當資料比較少時,有序集合使用的是 ziplist 儲存的,有序集合使用 ziplist 格式儲存必須滿足以下兩個條件:

有序集合儲存的元素個數要小於 128 個;

有序集合儲存的所有元素成員的長度都必須小於 64 位元組。

如果不能滿足以上兩個條件中的任意乙個,有序集合將會使用 skiplist 結構進行儲存。

出處:

物件導向的五大設計原則

單一職責原則 乙個類,最好只做一件事,只有乙個引起它的變化。單一職責原則可以看做是低耦合 高內聚在物件導向原則上的引申,將職責定義為引起變化的原因,以提高內聚性來減少引起變化的原因。職責過多,可能引起它變化的原因就越多,這將導致職責依賴,相互之間就產生影響,從而大大損傷其內聚性和耦合度,通常意義下的...

物件導向的五大設計原則

一 開 閉原則 ocp 含義 乙個軟體實體應當對擴充套件開放,對修改關閉。二 單一職責原則 srp 含義 就是對乙個類而言,應該僅有乙個引起變化的原因。所以在構造物件時,應該將物件的不同職責分離至多個類中,從而確保引起該類的變化的原因只有乙個,使用這個原則可以提高內聚,降低耦合度。三 黎克特制替換原...

Redis的五大常用資料型別

redis命令大全 redisdoc.com 鍵 鍵 keys 查詢當前資料庫的所有金鑰 exists key的名字 判斷某個key是否存在 move key的名字資料庫 移動當前的某個key到指定資料庫 ttl key的名字 檢視key還有多少時間過期,1表示永不過期,2表示已經過期 type k...