前言 Redis之所以被廣泛使用,不只是因為它快,還因為它除了支持最簡單的字元串(String)類型外,它還支持好幾種數據類型: 哈希(Hash) 列表(List) 集合(Set) 有序集合(Sorted Set) 點陣圖 ( Bitmap ) String String為最簡單的類型,一個key對應 ...
前言
Redis之所以被廣泛使用,不只是因為它快,還因為它除了支持最簡單的字元串(String)類型外,它還支持好幾種數據類型:
- 哈希(Hash)
- 列表(List)
- 集合(Set)
- 有序集合(Sorted Set)
- 點陣圖 ( Bitmap )
String
String為最簡單的類型,一個key對應一個value,它還可以存二進位的對象(Bitmap)。
127.0.0.1:6379> set mykey "aminglinux.com"
OK
127.0.0.1:6379> get mykey
"aminglinux.com"
127.0.0.1:6379> mset key1 1 key2 a key3 c
127.0.0.1:6379> mget key1 key2 key3
1) "1"
2) "a"
3) "c"
Hash
Hash是鍵值對的集合。在 Redis 中,Hash是字元串欄位和字元串值之間的映射。因此,它們適合表示對象。比如用戶的昵稱、年齡、性別、積分等。
示例:
127.0.0.1:6379> hset hash1 name aming
127.0.0.1:6379> hget hash1 name
"aming"
127.0.0.1:6379> hset hash1 age 30
127.0.0.1:6379> hget hash1 age
"30"
127.0.0.1:6379> hgetall hash1
1) "name"
2) "aming"
3) "age"
4) "30
List
List是一個鏈表結構,主要功能是push、pop獲取一個範圍的所有值等等。操作中key理解為鏈表的名字。
使用List 結構,我們可以輕鬆地實現最新消息排行等功能(比如新浪微博的 TimeLine )。List 的另一個應用就是消息隊列,可以利用List的push操作,將任務存在List 中,然後工作線程再用pop操作將任務取出進行執行。
示例:
127.0.0.1:6379> LPUSH list1 "aminglinux"
127.0.0.1:6379> LPUSH list1 "1 2 3"
127.0.0.1:6379> LPUSH list1 "aaa bbb"
127.0.0.1:6379> LRANGE list1 0 -1
1) "aaa bbb"
2) "1 2 3"
3) "aminglinux“
127.0.0.1:6379> LPOP list1
Set
Set是集合,和我們數學中的集合概念相似,對集合的操作有添加刪除元素,有對多個集合求交並差等操作。操作中key理解為集合的名字。比如在微博應用中,可以將一個用戶所有的關註人存在一個集合中,將其所有粉絲存在一個集合。因為Redis非常人性化的為集合提供了求交集、並集、差集等操作,那麼就可以非常方便的實現如共同關註、共同喜好、二度好友等功能,對上面的所有集合操作,你還可以使用不同的命令選擇將結果返回給客戶端還是存集到一個新的集合中。
示例
127.0.0.1:6379> SADD set1 a
127.0.0.1:6379> SADD set1 b
127.0.0.1:6379> SADD set1 c
127.0.0.1:6379> SADD set1 d
127.0.0.1:6379> SMEMBERS set1
1) "d"
2) "b"
3) "a"
4) "c"
127.0.0.1:6379> SREM set1 c//刪除元素
127.0.0.1:6379> SADD set2 a 2 b
127.0.0.1:6379> SINTER set1 set2 //交集
127.0.0.1:6379> SUNION set1 set2 //並集
127.0.0.1:6379> SDIFF set1 set2 //差集
Sorted set
Sorted Set是有序集合,它比set多了一個權重參數score,使得集合中的元素能夠按score進行有序排列,比如一個存儲全班同學成績的Sorted Set,其集合value 可以是同學的學號,而score就可以是其考試得分,這樣在數據插入集合的時候,就已經進行了天然的排序。
127.0.0.1:6379> ZADD set3 12 abc
127.0.0.1:6379> ZADD set3 2 "cde 123"
127.0.0.1:6379> ZADD set3 24 "123-aaa"
127.0.0.1:6379> ZADD set3 4 "a123a"
127.0.0.1:6379> ZRANGE set3 0 -1
1) "cde 123"
2) "a123a"
3) "abc"
4) "123-aaa"
倒序
127.0.0.1:6379> ZREVRANGE set3 0 -1
1) "123-aaa"
2) "abc"
3) "a123a"
4) "cde 123"
Bitmap
Bitmap,即點陣圖,它從嚴格意義上來說,並不是一種獨立的數據類型,而是一種特殊的String數據類型。它是一串連續的二進位數組(0和1),可以通過偏移量(offset)定位元素。
BitMap通過最小的單位bit來進行0|1的設置,表示某個元素的值或者狀態,時間複雜度為O(1)。
由於bit是電腦中最小的單位,使用它進行儲存將非常節省空間,特別適合一些數據量大且使用二值統計的場景。
示例
127.0.0.1:6379> setbit aaa:001 10001 1 # 返回操作之前的數值
(integer) 0
127.0.0.1:6379> setbit aaa:001 10002 2 # 如果值不是0或1就報錯
(error) ERR bit is not an integer or out of range
127.0.0.1:6379> setbit aaa:001 10002 0
(integer) 0
127.0.0.1:6379> setbit aaa:001 10003 1
(integer) 0
由於這種數據場景用的並不多,所以不多做解釋了。