一、Redis 五種類型
1、String(字符串類型)
2、Hash(哈希類型)
3、List(列表類型)
4、Set(集合類型)
5、Zset(有序集合類型)
二、操作
1、String類型是Redis中最簡單的數據結構。
它既可以存儲文字(例如"hello world"),又可以存儲數字(例如整數10086和浮點數3.14),還可以存儲二進制數據(例如10010100)。
- 設值:SET Key Value [EX seconds]
將Key鍵設置成指定的Value值。
如果Key鍵已經存在,並且保存舊值的話,舊的值會被覆蓋,不論舊的類型是否爲String都會被忽略掉。如果Key鍵不存在,那麼會在數據庫中添加一個Key鍵,保存的Value值就是剛剛設置的新值。
[EXseconds]選項表示Key鍵過期的時間,單位爲秒。如果不加設置,表示Key鍵永不過期。
- 批量設值:MSET Key Value[Key Value …]
一次性設置多個Key-Value(鍵-值對)。
相當於同時調用多次SET命令。操作是原子的。所有的Key鍵都一次性設置的。
同時運行兩個MSET來設置相同的Key鍵,那麼操作的結果也只會是兩次MSET中後一次的結果,而不會是混雜的結果。
- 批量添加:MSETNX Key Value [Key Value…]
一次性添加多個Key-Value(鍵-值對)。
如果任何一個Key鍵已經存在,那麼這個操作都不會執行。
使用MSETNX時,要麼全部Key鍵被添加,要麼全部不被添加。這個命令在MSET命令後面增加了一個後綴NX(if Not eXist),表示只有Key鍵不存在的時候,纔會設置Key鍵的Value值。
- 獲取:GET Key
使用GET命令,可以取得單個Key鍵所綁定的String值。
- 批量獲取:MGET Key[Key…]
前綴M,表示多個(Multi)。
使用MGET命令一次性獲取多個Value值,和GET命令取得單個比較優點主要在於減少網絡傳輸的次數,提升了性能。
- 獲取長度:STRLEN Key
Key鍵對應的String的長度,Key鍵對應的不是String,則報錯。
Key鍵不存在,則返回0。
-
爲Key鍵對應的整數Value值增加1:INCR Key
-
爲Key鍵對應的整數Value值減少1:DECR Key
-
爲Key鍵對應的整數Value值增加increment:INCRBY Keyincrement
-
爲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隊列的使用場景,是非常多的。
- 右推入(後推入):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列表的==頭部(左側)==推入的
- 左彈出:LPOP Key
a) PUSH操作是增加元素;而POP操作,則是獲取元素並刪除。
b) LPOP命令是從List隊列的左邊(前端),獲取並移除一個元素,複雜度O(1)。如果List列表爲空,則返回nil。
- 右彈出:RPOP key
從隊列的==右邊(後端)==獲取並移除一個元素
-
獲取列表的長度:LLEN Key
-
獲取列表指定位置上的元素: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鍵的規範要求)
- 設置字段-值:HSET Key Field Value
給Field字段設置Value值。如果Field字段之前沒有設置值,那麼命令返回1;如果Field字段已經有關聯值,那麼命令用新值覆蓋舊值,並返回0。
- 獲取字段-值:HGET Key Field
返回Key Field字段所關聯的Value值。如果Field字段沒有關聯Value值,那麼返回nil
- 檢查字段是否存在:HEXISTS Key Field
查看指定Field字段是否存在:存在則返回1,不存在則返回0。
- 刪除給指定的字段:HDEL Key Field [Field …]
刪除一個或多個指定Field字段,以及那些Field字段所關聯的值。不存在的Field字段將被忽略。命令返回被成功刪除的Field-Value對的數量。
-
查看指定的Field字段是否存在:HEXISTS Key Field
-
獲取所有的Field字段:HKEYS Key
-
獲取所有的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
- 哈希表優:方便管理、能夠避免鍵名衝突、並且還能夠節約內存
a) 將數據集中存放。通過Hash哈希表,可以將一些相關的信息存儲在同一個緩存Key鍵中,不僅方便了數據管理,還可以儘量避免誤操作的發生。
b) 避免鍵名衝突使用哈希鍵來存儲“鍵-值對”數據。
c) 減少Key鍵的內存佔用。保存相同數量的“鍵-值對”信息,使用哈希鍵比使用字符串鍵更節約內存。
d) 創建一個Key鍵都帶有很多的附加管理信息(例如這個Key鍵的類型、最後一次被訪問的時間等),緩存的Key鍵越多,耗費的內存就越多,花在管理數據庫Key鍵上的CPU也會越多。
4、 Set集合
a) 列表:特殊之處在於它是可以自動去掉重複元素的。
b) Set集合類型的使用場景是:當需要存儲一個列表,而又不希望有重複的元素(例如ID的集合)時,使用Set是一個很好的選擇。並且Set類型擁有一個命令,它可用於判斷某個元素是否存在,而List類型並沒有這種功能的命令。
c) 通過Set集合類型的命令可以快速地向集合添加元素,或者從集合裏面刪除元素,也可以對多個Set集合進行集合運算,例如並集、交集、差集。
- 添加元素:SADD Key member1 [member2 ……]
添加一個或多個成員
- 移除元素:SREM Key member1[member2……]
移除一個或多個成員
- 判斷某個元素:SISMEMBER Key member
判斷member元素是否爲Key集合的成員
> del root
> sadd root user1
> sadd root user2 user3 user4 user5
> srem root uer4
> sismember root user1
-
獲取集合的成員數:SCARD Key
-
獲取集合中的所有成員:SMEMBERS Key
> scard root
> smembers root
5、Zset有序集合
a) Zset和Set使用場景類似,區別是有序集合會根據提供的score參數來進行自動排序。當需要一個不重複的且有序的集合列表,那麼就可以選擇Zset有序集合類型,常用案例:排行榜。
b) Zset有序集合和Set集合不同的是,有序集合的每個元素,都關聯着一個分值(Score),這是一個浮點數格式的關聯值。Zset有序集合會按照分值(Score),按從小到大的順序來排列有序集合中的各個元素。
- 添加成員:ZADD Key Score1 member1 [ScoreNmemberN…]
添加一個或多個成員。如果memberN已經存在,則更新已存在成員的分數。
- 移除元素:ZREM Key member1[memberN……]
移除一個或多個成員
- 取得分數:ZSCORE Key member
取得member成員的分數值
- 取得成員排序:ZRANK Key member
取得member成員的分數值的排名
- 成員加分:ZINCRBY Key Score member
對指定成員的分數加上增量Score
- 區間獲取:ZRANGEBYSCORE Key min max[WITHSCORES] [LIMIT]
獲取指定分數區間範圍內的成員。
WITHSCORES表示帶上分數值返回;LIMIT選項,類似與mysql查詢的limit選項,有offset、count兩個參數值,表示返回的偏移量和成員數量。
在默認情況下,min和max表示的範圍,是閉區間範圍,而不是開區間範圍,即min ≤ score≤ max內的成員將被返回。
可以使用-inf和+inf分別表示有序集合中分數的最小值和最大值。
- 獲取成員數: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