說明:
- 對于Redis來說,它可以存儲五種基本資料類型,
- redis中所有資料結構都以唯一的key字元串作為名稱,然後通過這個唯一的key來擷取對應的value
- 不同的資料類型資料結構差異就在于value的結構不一樣
- 而現在的版本中的五種類型是:String(字元串)、Hash(字典)、List(清單)、Set(集合)、SortedSet(zSet:有序集合)
一、string(字元串)
-
1)value的資料結構(數組)
- 字元串是Redis中最常用的類型,是一個由位元組組成的序列,它在Redis中是二進制安全的,這便意味着該類型可以接受任何格式的資料,Value最多可以容納的資料長度為512MB。
- 字元串value資料結構類似于數組,采用與配置設定記憶體空間來減少記憶體頻繁配置設定
- 如果字元串長度操作1MB時,擴容時最多擴容1MB空間,字元串最大長度為 512MB
-
2)字元串的使用場景(緩存)
- 字元串一個常見的用途是緩存使用者資訊,我們将使用者資訊使用JSON序列化成字元串
- 取使用者資訊時會經過一次反序列化的過程
注意:redis中的Key和Value是區分大小寫的,指令是不區分大小寫的, redis是單線程 不适合存儲大容量的資料。自增的value是可以轉成數字的。
基本操作:
set key value
往key中存入一個值(value)
get key
擷取鍵為key的值
二、list(清單)
-
1)value的資料結構(雙向連結清單)
- Redis的清單允許使用者從序列的兩端推入或者彈出元素,清單由多個字元串值組成的有序可重複的序列,擷取越接近兩端的元素速度就越快。這意味着即使是一個有幾千萬個元素的清單,擷取頭部或尾部的10條記錄也是極快的。List中可以包含的最大元素數量是4294967295(接近43億)。
- 清單的資料結構是雙向連結清單,這意味着插入和删除的時間複雜度是0(1),索引的時間複雜度位0(n)
- 當清單彈出最後一個元素後,該資料結構會被自動删除,記憶體被回收
-
2)清單的使用場景(隊列、棧)
- 應用場景:1.最新消息排行榜。2.消息隊列,以完成多程式之間的消息交換。可以用push操作将任務存在list中(生産者),然後線程在用pop操作将任務取出進行執行(消費者)。
基本操作:
三、hash(字典)
-
1)value的資料結構(HashMap)
- redis中的字典也是HashMap(數組+清單)的二維結構
- 相當于是一個key中存在多個map。Redis中的散列可以看成具有String key和String value的map容器,可以将多個key-value存儲到一個key中。每一個Hash(字典)可以存儲4294967295(接近43億)個鍵值對。
- 不同的是redis的字典的值隻能是字元串
-
2)hash的使用場景(緩存)
- hash結構也可以用來緩存使用者資訊,與字元串一次性全部序列化整個對象不同,hash可以對每個字段進行單獨存儲
- 這樣可以部分擷取使用者資訊,節約網絡流量
- hash的缺點是:hash結構的存儲消耗要高于單個字元串(消耗記憶體)
基本操作:
四、set(集合)
-
1)value的資料結構(字典)
- Redis的集合是無序且不可重複的,此處的無序是資料不能重複。和清單一樣,在執行插入和删除以及判斷是否存在某元素時,效率是很高的。集合最大的優勢在于可以進行交集并集差集操作。Set可包含的最大元素數量是4294967295(接近43億)。
- redis中的集合相當于一個特殊的字典。
- 當集合中的最後一個元素被移除後,資料結構會被自動删除,記憶體被回收
-
2)set使用場景(有唯一性)
- set結構可以用來存儲某個活動中中獎的使用者ID,因為有去重功能,可以保證同一使用者不會中獎兩次
- 利用交集求共同好友。
- 利用唯一性,可以統計通路網站的所有獨立IP。
- 基本操作:
五、zset(有序集合)
有順序,不能重複!!此處的不能重複是索引為唯一的,資料卻可以重複。
-
1)value的資料結構(跳躍清單)
- 它可以給每一個value賦予一個score,代表這個value的唯一
- 和Set很像,都是字元串的集合,都不允許重複的成員出現在一個set中。他們之間差别在于有序集合中每一個成員都會有一個分數(score)與之關聯,Redis正是通過分數來為集合中的成員進行從小到大的排序。盡管有序集合中的成員必須是唯一的,但是分數(score)卻可以重複。
- zset内部實作用的是一種叫做“跳躍清單”的資料結構
- zset最後一個元素被移除後,資料結構就會被自動删除,記憶體也會被回收
-
2)zset應用場景
- 粉絲清單:value(粉絲ID),score(關注時間),這樣可以輕松按關注事件排序
- 學生成績:value(學生ID),score(考試成績),這樣可以輕松對成績排序
-
可以用于一個大型線上遊戲的積分排行榜,每當玩家的分數發生變化時,可以執行zadd更新玩家分數(score),此後在通過zrange擷取幾分top
ten的使用者資訊。
基本操作:
zadd zset1 9 a 8 c 10 d 1 e (添加元素 zadd key score member )
(ZRANGE key start stop [WITHSCORES])(檢視所有元素:zrange key 0 -1
withscores)
如果要檢視分數,加上withscores.
zrange zset1 0 -1 (從小到大)
zrevrange zset1 0 -1 (從大到小)
zincrby zset2 score member (對元素member 增加 score)
1 127.0.0.1:6379> zadd zset1 8 a 4 b 5 c 1 d
2 (integer) 4
3 127.0.0.1:6379> zrange zset1 0 -1
4 1) "d"
5 2) "b"
6 3) "c"
7 4) "a"
8 127.0.0.1:6379> zadd zset1 9 a
9 (integer) 0
10 127.0.0.1:6379> zrange zset1 0 -1
11 1) "d"
12 2) "b"
13 3) "c"
14 4) "a"
15 127.0.0.1:6379> zrange zset1 0 -1 withscores
16 1) "d"
17 2) "1"
18 3) "b"
19 4) "4"
20 5) "c"
21 6) "5"
22 7) "a"
23 8) "9"
24 127.0.0.1:6379> zrevrange zset1 0 -1
25 1) "a"
26 2) "c"
27 3) "b"
28 4) "d"
29 127.0.0.1:6379> zincrby zset1 1 a
30 "10"
31 127.0.0.1:6379> zrevrange zset1 0 -1 withscores
32 1) "a"
33 2) "10"
34 3) "c"
35 4) "5"
36 5) "b"
37 6) "4"
38 7) "d"
39 8) "1"
六、總結一下五種類型的作用
- 1. String(緩存)
- 2. List(消息隊列)
- 3. hash(緩存使用者資訊,可以對每個字段進行單獨存儲)
- 4. Set(set類似list,特殊之處是set可以自動排重:找兩個人微網誌的共同好友)
- 5. ZSet(sorted set可以通過使用者額外提供一個優先級(score)的參數來為成員排序,并且是插入有序的,即自動排序。)