Redis學習筆記10 、Redis數據類型

一、Redis 五種類型

1、String(字符串類型)

2、Hash(哈希類型)

3、List(列表類型)

4、Set(集合類型)

5、Zset(有序集合類型)

二、操作

1、String類型是Redis中最簡單的數據結構。

它既可以存儲文字(例如"hello world"),又可以存儲數字(例如整數10086和浮點數3.14),還可以存儲二進制數據(例如10010100)。

  1. 設值:SET Key Value [EX seconds]

將Key鍵設置成指定的Value值。

如果Key鍵已經存在,並且保存舊值的話,舊的值會被覆蓋,不論舊的類型是否爲String都會被忽略掉。如果Key鍵不存在,那麼會在數據庫中添加一個Key鍵,保存的Value值就是剛剛設置的新值。

[EXseconds]選項表示Key鍵過期的時間,單位爲秒。如果不加設置,表示Key鍵永不過期。

  1. 批量設值:MSET Key Value[Key Value …]

一次性設置多個Key-Value(鍵-值對)。

相當於同時調用多次SET命令。操作是原子的。所有的Key鍵都一次性設置的。

同時運行兩個MSET來設置相同的Key鍵,那麼操作的結果也只會是兩次MSET中後一次的結果,而不會是混雜的結果。

  1. 批量添加:MSETNX Key Value [Key Value…]

一次性添加多個Key-Value(鍵-值對)。

如果任何一個Key鍵已經存在,那麼這個操作都不會執行。

使用MSETNX時,要麼全部Key鍵被添加,要麼全部不被添加。這個命令在MSET命令後面增加了一個後綴NX(if Not eXist),表示只有Key鍵不存在的時候,纔會設置Key鍵的Value值。

  1. 獲取:GET Key

使用GET命令,可以取得單個Key鍵所綁定的String值。

  1. 批量獲取:MGET Key[Key…]

前綴M,表示多個(Multi)。

使用MGET命令一次性獲取多個Value值,和GET命令取得單個比較優點主要在於減少網絡傳輸的次數,提升了性能。

  1. 獲取長度:STRLEN Key

Key鍵對應的String的長度,Key鍵對應的不是String,則報錯。

Key鍵不存在,則返回0。

  1. 爲Key鍵對應的整數Value值增加1:INCR Key

  2. 爲Key鍵對應的整數Value值減少1:DECR Key

  3. 爲Key鍵對應的整數Value值增加increment:INCRBY Keyincrement

  4. 爲Key鍵對應的浮點數Value值增加increment:INCRBYFLOAT Key increment

Redis並沒有爲浮點數Value值減少decrement的操作DECRBYFLOAT。

要爲浮點數Value值減少decrement,只需要把INCRBYFLOAT命令的increment設成負值即可。

設置爲1.0 + 10.01 - 5.0
> set root 1.0
> incrbyfloat root 10.01
> incrbyfloat root -5。0

2、List列表

a) 基於雙向鏈表實現的,可以支持正向、反向查找和遍歷。List列表是簡單的字符串列表,字符串按照添加的順序排序。

b) 可以添加一個元素到List列表的頭部(左邊)或者尾部(右邊)。一個List列表最多可以包含232-1個元素(最多可超過40億個元素)。

c) 典型應用場景:網絡社區中最新的發帖列表、簡單的消息隊列、最新新聞的分頁列表、博客的評論列表、排隊系統等等。

d) 例子:在“雙11”秒殺、搶購這樣的大型活動中,短時間內有大量的用戶請求發向服務器,而後臺的程序不可能立刻響應每一個用戶的請求,有什麼好的辦法來解決這個問題呢?我們需要一個排隊系統。根據用戶的請求時間,將用戶的請求放入List隊列中,後臺程序依次從隊列中獲取任務,處理並將結果返回到結果隊列。換句話說,通過List隊列,可以將並行的請求轉換成串行的任務隊列,之後依次處理。總體來說,List隊列的使用場景,是非常多的。

  1. 右推入(後推入):RPUSH Key Value [Value …]

a) 將一個或多個的Value值依次推入到列表的尾部(右端)。如果Key鍵不存在,那麼RPUSH之前會先自動創建一個空的List列表。如果Key鍵的Value值不是一個List類型,則會返回一個錯誤。

b) 如果同時RPUSH多個Value值,則多個Value值會依次從尾部進入List列表。RPUSH命令的返回值爲操作完成後List包含的元素量

c) RPUSH時間複雜度爲O(N),只推入一個值,那麼命令的複雜度爲O(1)。

2)左推入(前推入):LPUSH Key Value [Value …]

從List列表的==頭部(左側)==推入的

  1. 左彈出:LPOP Key

a) PUSH操作是增加元素;而POP操作,則是獲取元素並刪除。

b) LPOP命令是從List隊列的左邊(前端),獲取並移除一個元素,複雜度O(1)。如果List列表爲空,則返回nil。

  1. 右彈出:RPOP key

從隊列的==右邊(後端)==獲取並移除一個元素

  1. 獲取列表的長度:LLEN Key

  2. 獲取列表指定位置上的元素:LINDEX Key index

7)獲取指定索引範圍之內的所有元素:LRANGE Key startstop

8)設置指定索引上的元素:LSET Key index Value

> del root
> rpush root a b c d e f
> llen
> lrange root 0 4
> lindex root 3
> lindex root -1

List列表的下標是從0開始的,index爲負的時候是從後向前數。-1表示最後一個元素。當下標超出邊界時,會返回nil

3、Hash哈希表

a) 是一個String類型的Field字段和Value值之間的映射表,類似於Java中的HashMap。

b) 一個哈希表由多個字段-值對(Field-Value Pair)組成,Value值可以是文字、整數、浮點數或者二進制數據。

c) 在同一個Hash哈希表中,每個Field字段的名稱必須是唯一的(Java中HashMap的Key鍵的規範要求)

  1. 設置字段-值:HSET Key Field Value

給Field字段設置Value值。如果Field字段之前沒有設置值,那麼命令返回1;如果Field字段已經有關聯值,那麼命令用新值覆蓋舊值,並返回0。

  1. 獲取字段-值:HGET Key Field

返回Key Field字段所關聯的Value值。如果Field字段沒有關聯Value值,那麼返回nil

  1. 檢查字段是否存在:HEXISTS Key Field

查看指定Field字段是否存在:存在則返回1,不存在則返回0。

  1. 刪除給指定的字段:HDEL Key Field [Field …]

刪除一個或多個指定Field字段,以及那些Field字段所關聯的值。不存在的Field字段將被忽略。命令返回被成功刪除的Field-Value對的數量。

  1. 查看指定的Field字段是否存在:HEXISTS Key Field

  2. 獲取所有的Field字段:HKEYS Key

  3. 獲取所有的Value值:HVALS Key

> del root
> hset config ip 127.0.0.1
> hset config port 8080
> hset config maxalive 5080
> hkeys config
> hvals config
> hexists config timeout
  1. 哈希表優:方便管理、能夠避免鍵名衝突、並且還能夠節約內存

a) 將數據集中存放。通過Hash哈希表,可以將一些相關的信息存儲在同一個緩存Key鍵中,不僅方便了數據管理,還可以儘量避免誤操作的發生。

b) 避免鍵名衝突使用哈希鍵來存儲“鍵-值對”數據。

c) 減少Key鍵的內存佔用。保存相同數量的“鍵-值對”信息,使用哈希鍵比使用字符串鍵更節約內存。

d) 創建一個Key鍵都帶有很多的附加管理信息(例如這個Key鍵的類型、最後一次被訪問的時間等),緩存的Key鍵越多,耗費的內存就越多,花在管理數據庫Key鍵上的CPU也會越多。

4、 Set集合

a) 列表:特殊之處在於它是可以自動去掉重複元素的。

b) Set集合類型的使用場景是:當需要存儲一個列表,而又不希望有重複的元素(例如ID的集合)時,使用Set是一個很好的選擇。並且Set類型擁有一個命令,它可用於判斷某個元素是否存在,而List類型並沒有這種功能的命令。

c) 通過Set集合類型的命令可以快速地向集合添加元素,或者從集合裏面刪除元素,也可以對多個Set集合進行集合運算,例如並集、交集、差集。

  1. 添加元素:SADD Key member1 [member2 ……]

添加一個或多個成員

  1. 移除元素:SREM Key member1[member2……]

移除一個或多個成員

  1. 判斷某個元素:SISMEMBER Key member

判斷member元素是否爲Key集合的成員

> del root
> sadd root user1
> sadd root user2 user3 user4 user5
> srem root uer4
> sismember root user1
  1. 獲取集合的成員數:SCARD Key

  2. 獲取集合中的所有成員:SMEMBERS Key

> scard root
> smembers root

5、Zset有序集合

a) Zset和Set使用場景類似,區別是有序集合會根據提供的score參數來進行自動排序。當需要一個不重複的且有序的集合列表,那麼就可以選擇Zset有序集合類型,常用案例:排行榜。

b) Zset有序集合和Set集合不同的是,有序集合的每個元素,都關聯着一個分值(Score),這是一個浮點數格式的關聯值。Zset有序集合會按照分值(Score),按從小到大的順序來排列有序集合中的各個元素。

  1. 添加成員:ZADD Key Score1 member1 [ScoreNmemberN…]

添加一個或多個成員。如果memberN已經存在,則更新已存在成員的分數。

  1. 移除元素:ZREM Key member1[memberN……]

移除一個或多個成員

  1. 取得分數:ZSCORE Key member

取得member成員的分數值

  1. 取得成員排序:ZRANK Key member

取得member成員的分數值的排名

  1. 成員加分:ZINCRBY Key Score member

對指定成員的分數加上增量Score

  1. 區間獲取:ZRANGEBYSCORE Key min max[WITHSCORES] [LIMIT]

獲取指定分數區間範圍內的成員。

WITHSCORES表示帶上分數值返回;LIMIT選項,類似與mysql查詢的limit選項,有offset、count兩個參數值,表示返回的偏移量和成員數量。

在默認情況下,min和max表示的範圍,是閉區間範圍,而不是開區間範圍,即min ≤ score≤ max內的成員將被返回。

可以使用-inf和+inf分別表示有序集合中分數的最小值和最大值。

  1. 獲取成員數:ZCARD Key

8)區間計數:ZCOUNT Key min max

計算指定區間分數的成員數

> del root
> zadd salary 1000 user1
> zadd salary 2000 user2
> zadd salary 3000 user3
> zadd salary 4000 user4
> type salary
> zrank salary user4
> zrank salary user2
> zrangebyscore salary 3000 +inf
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章