天天看點

Redis的幾個資料類型,包含簡單指令舉列一、String 資料類型二、List 資料類型三、Hash 資料類型(散列類型)四、SET 資料類型(無序集合)五、Sorted Set 資料類型(zset、有序集合)

Redis資料類型

  • 一、String 資料類型
    • 1.1 概述
    • 1.2 APPEND / SET / GET / STRLEN
      • APPEND
      • SET / GET
      • STRLEN
    • 1.3 INCR / DECR / INCRBY / DECRBY
    • 1.4 GETSET
    • 1.5 SETEX
    • 1.6 SETNX
    • 1.7 MSET / MGET / MSETNX
  • 二、List 資料類型
    • 2.1 概述
    • 2.2 LPUSH / LPUSHX / LRANGE
    • 2.3 LPOP / LLEN
    • 2.4 LREM / LSET / LINDEX / LTRIM
    • 2.5 LINSERT
    • 2.6 RPUSH / RPUSHX / RPOP / RPOPLPUSH
  • 三、Hash 資料類型(散列類型)
    • 3.1 概述
    • 3.2 HSET / HGET / HDEL / HEXISTS / HLEN / HSETNX
    • 3.3 HINCRBY
    • 3.4 HGETALL / HKEYS / HVALS / HMGET / HMSET
  • 四、SET 資料類型(無序集合)
    • 4.1 概述
      • 應用範圍
    • 4.2 SADD / SMEMBERS / SCARD / SISMEMBER
    • 4.3 SPOP / SREM / SRANDMEMBER / SMOVE
  • 五、Sorted Set 資料類型(zset、有序集合)
    • 5.1 概述
      • 應用範圍
    • 5.2 ZADD / ZCARD / ZCOUNT / ZREM / ZINCRBY / ZSCORE / ZRANGE / ZRANK
    • 5.3 ZRANGEBYSCORE / ZREMRANGEBYRANK / ZREMRANGEBYSCORE
    • 5.4 ZREVRANGE / ZREVRANGEBYSCORE / ZREVRANK

一、String 資料類型

1.1 概述

String是redis最基本的類型,最大能存儲512MB的資料,String類型是二進制安全的,即可以存儲任何資料、比如數字、圖檔、序列化對象等

1.2 APPEND / SET / GET / STRLEN

APPEND

文法:APPEND key value追加鍵值,并傳回追加後的長度(若鍵不存在,則相當于建立)

127.0.0.1:6379> exists cc1				# 判斷cc1鍵有沒有,存在傳回1,不存在傳回0
(integer) 0
127.0.0.1:6379> append cc1 "666"		# append自動建立,傳回的是目前value的長度,也就是666的長度
(integer) 3
127.0.0.1:6379> keys *					# 檢視cc1已建立有
1) "cc1"
2) "key:__rand_int__"
3) "counter:__rand_int__"
4) "cc4"
5) "mylist"
6) "myset:__rand_int__"
7) "cc3"
8) "teacher"
127.0.0.1:6379> get cc1
"666"
127.0.0.1:6379> append cc1 "777"		# 追加建立777,不是覆寫,傳回的長度為追加後總長度
(integer) 6
127.0.0.1:6379> get cc1					# 檢視内容
"666777"
           

SET / GET

set:為鍵設定新值,會覆寫原有值

get:擷取該鍵内容

127.0.0.1:6379> set cc1 333
OK
127.0.0.1:6379> get cc1
"333"
127.0.0.1:6379> set cc1 222
OK
127.0.0.1:6379> get cc1
"222"
           

STRLEN

擷取指定key的字元長度

127.0.0.1:6379> get cc1
"222"
127.0.0.1:6379> strlen cc1
(integer) 3
           

1.3 INCR / DECR / INCRBY / DECRBY

**INCR key:key值遞增加1(key值必須是整數)

127.0.0.1:6379> set cc1 100
OK
127.0.0.1:6379> incr cc1			# 遞增加1
(integer) 101
127.0.0.1:6379> incr cc1
(integer) 102

127.0.0.1:6379> del cc1				# 删除鍵内容
(integer) 1	
127.0.0.1:6379> incr cc1			# 遞增加1,删除後的鍵預設為空值,設定為0
(integer) 1
127.0.0.1:6379> incr cc1
(integer) 2

127.0.0.1:6379> set cc1 aaa			# 設定為普通字元串
OK
127.0.0.1:6379> incr cc1			# 無法遞增
(error) ERR value is not an integer or out of range
           

DECR key:key值遞增減1(key值必須是整數)**

127.0.0.1:6379> decr cc1			# 遞增減1
(integer) 101
127.0.0.1:6379> decr cc1
(integer) 100

127.0.0.1:6379> decr cc1			# 删除鍵内容
(integer) -1
127.0.0.1:6379> decr cc1			# 遞增減1,删除後的鍵預設為空值,設定為0
(integer) -2

127.0.0.1:6379> set cc1 aaa			# 設定為普通字元串
OK
127.0.0.1:6379> decr cc1			# 無法遞增
(error) ERR value is not an integer or out of range
           

INCRBY key 增加指定的整數

127.0.0.1:6379> get cc1					# 設定值
"100"
127.0.0.1:6379> incrby cc1 5			# 增加5
(integer) 105
127.0.0.1:6379> incrby cc1 5
(integer) 110
           

DECRBY key 減少指定的整數

127.0.0.1:6379> get cc1					# 設定值
"100"
127.0.0.1:6379> decrby cc1 5			# 減少5
(integer) 95
127.0.0.1:6379> decrby cc1 5
(integer) 90
           

1.4 GETSET

GETSET key value :擷取key值并傳回,同時給key設定新值

127.0.0.1:6379> set cc1 100
OK
127.0.0.1:6379> get cc1
"100"
127.0.0.1:6379> getset cc1 0		# 在擷取原有值的同時,會設定新值,這兩個操作原子性同時完成
"100"
127.0.0.1:6379> get cc1				# 檢視結果
"0"
           

1.5 SETEX

setex key seconds value :設定指定key的過期時間為seconds

127.0.0.1:6379> setex cc1 10 nihao		# 設定過期時間為10秒
OK
127.0.0.1:6379> ttl cc1					# ttl指令檢視剩餘存活時間
(integer) 5
127.0.0.1:6379> get cc1					# 在存活時間内可以擷取到内容
"nihao"
127.0.0.1:6379> ttl cc1
(integer) 3
127.0.0.1:6379> ttl cc1					# -2表示失效過期
(integer) -2
127.0.0.1:6379> get cc1					# 無内容
(nil)
           
127.0.0.1:6379> set cc1 nihao			# 直接設定為永久設定
OK
127.0.0.1:6379> ttl cc1					# -1代表一個上限,所有的意思
(integer) -1
           

1.6 SETNX

SETNX key value :不存在鍵的話執行set操作,存在就不執行

127.0.0.1:6379> setnx cc1 100			# 不存在的鍵執行成功
(integer) 1
127.0.0.1:6379> setnx cc1 200			# 存在後沒有效果
(integer) 0
127.0.0.1:6379> get cc1					# 檢視内容為第一次設定的值
"100"
           

1.7 MSET / MGET / MSETNX

MSET key1 value key2 value … :批量設定鍵值

127.0.0.1:6379> mset cc5 555 cc6 666
OK
127.0.0.1:6379> get cc5
"555"
127.0.0.1:6379> get cc6
"666"
           

==MGET key1 key2 :批量擷取多個鍵值

127.0.0.1:6379> mget cc5 cc6
1) "555"
2) "666"
           

MSETNX key1 value key2 value :批量設定,不存在的執行成功,存在的執行失敗

127.0.0.1:6379> msetnx cc6 666 cc7 777			# 批量設定cc6 cc7
(integer) 0
127.0.0.1:6379> mget cc6 cc7					# cc6本身存在,導緻執行失敗,是以cc7沒有設定成功
1) "666"
2) (nil)

127.0.0.1:6379> msetnx cc8 888 cc7 777			# 都沒有存在的直接成功
(integer) 1
127.0.0.1:6379> mget cc8 cc7
1) "888"
2) "777"
           

二、List 資料類型

2.1 概述

清單的元素類型為string,按照插入順序排序,在清單的頭部或尾部添加元素

2.2 LPUSH / LPUSHX / LRANGE

LPUSH key value value… :在頭部左側依次插入清單元素

# cc1鍵不存在,指令會建立改建及與其關聯的List,之後再把參數從左到右依次插入
127.0.0.1:6379> lpush cc1 a b c d
(integer) 4
           

LPUSHX key value :鍵必須存在才能執行,在頭部插入元素值并傳回清單元素數量

127.0.0.1:6379> lpushx cc2 a b c d			# cc2不存在,是以不會進行操作,傳回值0
(integer) 0

127.0.0.1:6379> lpushx cc1 e				# cc1存在,插入成功,并且傳回目前元素的數量
(integer) 5
           

LRANGE key start stop :取從位置索引start到位置索引stop的所有元素(以0開始)

127.0.0.1:6379> lrange cc1 0 -1		# 取全部元素,0表示第一個,-1表示最後一個
1) "d"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379> lrange cc1 0 2		# 取從位置0開始到位置2結束的共3個元素
1) "d"
2) "c"
3) "b"
           

2.3 LPOP / LLEN

127.0.0.1:6379> lpush cc1 a b c d			# 建立
(integer) 4
127.0.0.1:6379> lpop cc1					# 移除并傳回鍵的第一個元素,從右往左第一個
"d"
127.0.0.1:6379> llen cc1					# 擷取剩餘元素數量,此時隻有三個
(integer) 3
           

2.4 LREM / LSET / LINDEX / LTRIM

LREM key count value :從頭部開始删除count個值為value的元素,并傳回實際删除數量

127.0.0.1:6379> lpush cc1 a b c d a b c d	# 建立參數
(integer) 8
127.0.0.1:6379> lrem cc1 2 a				# 删除兩個值為a的元素,傳回值是實際删除的數量
(integer) 2
127.0.0.1:6379> lrange cc1 0 -1				# 檢視
1) "d"
2) "c"
3) "b"
4) "d"
5) "c"
6) "b"
           

LSET key index value :将索引值為index的元素值設定為新值value

127.0.0.1:6379> lset cc1 0 dd				# 将頭部第1個元素設定為新值dd
OK
127.0.0.1:6379> lrange cc1 0 -1
1) "dd"
2) "c"
3) "b"
4) "d"
5) "c"
6) "b"
           

LINDEX key index :擷取索引值為index的元素值

127.0.0.1:6379> lrange cc1 0 -1
1) "dd"
2) "c"
3) "b"
4) "d"
5) "c"
6) "b"
127.0.0.1:6379> lindex cc1 3				# 檢視索引值為3的值,也就是第四個
"d"
           

LTRIM key start stop :僅保留索引值start到stop的元素

127.0.0.1:6379> lrange cc1 0 -1
1) "dd"
2) "c"
3) "b"
4) "d"
5) "c"
6) "b"
127.0.0.1:6379> ltrim cc1 1 3			# 隻保留索引值1到3的元素,包含1和3
OK
127.0.0.1:6379> lrange cc1 0 -1
1) "c"
2) "b"
3) "d"
           

2.5 LINSERT

LINSERT key BEFORE | AFTER pivot value :在元素pivot的前面(左)或者後面(右)插入新元素value

127.0.0.1:6379> lrange cc1 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379> linsert cc1 before a aa				# 在a的前面插入新元素aa
(integer) 5
127.0.0.1:6379> lrange cc1 0 -1
1) "d"
2) "c"
3) "b"
4) "aa"
5) "a"
127.0.0.1:6379> linsert cc1 after d dd				# 在d的後面插入新元素dd
(integer) 6
127.0.0.1:6379> lrange cc1 0 -1
1) "d"
2) "dd"
3) "c"
4) "b"
5) "aa"
6) "a"

127.0.0.1:6379> linsert cc2 after a aa				# 在不存在的key插入新元素,操作失敗,傳回0
(integer) 0
127.0.0.1:6379> linsert cc1 after f ff				# 在已存在的key内插入不存在的元素之前或之後,操作失敗,傳回-1
(integer) -1
           

2.6 RPUSH / RPUSHX / RPOP / RPOPLPUSH

RPUSH key value value… :在清單的尾部依次插入value

127.0.0.1:6379> rpush cc1 a b c d		# 插入順序是從右到左
(integer) 4
127.0.0.1:6379> lrange cc1 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
           

RPUSHX key value :必須存在key才能執行,從value尾部插入,并傳回元素數量

127.0.0.1:6379> rpushx cc2 a			# 不存在不執行,傳回0
(integer) 0
127.0.0.1:6379> rpushx cc1 e			# 存在的鍵,正常執行
(integer) 5
           

RPOP key :在尾部移除一個元素,并且傳回該元素

127.0.0.1:6379> rpop cc1				# 預設移除一個元素
"e"
127.0.0.1:6379> lrange cc1 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
           

RPOPLPUSH source destination :在key1的尾部彈出一個元素并傳回,将它插入到key2的頭部

127.0.0.1:6379> rpoplpush cc1 cc2			# 彈出cc1的尾部元素,插入到cc2的頭部
"d"
127.0.0.1:6379> lrange cc1 0 -1
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> lrange cc2 0 -1
1) "d"

127.0.0.1:6379> lrange cc1 0 -1
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> rpoplpush cc1 cc1			# 彈出cc1的尾部元素插入到cc1的頭部
"c"
127.0.0.1:6379> lrange cc1 0 -1
1) "c"
2) "a"
3) "b"
           

三、Hash 資料類型(散列類型)

3.1 概述

hash用于存儲對象。可以采用這樣的命名方式:對象類别和ID構成鍵名,使用字段表示對象的屬性,而字段值則存儲屬性值。 如:存儲 ID 為 2 的汽車對象

如果Hash中包含很少的字段,那麼該類型的資料也将僅占用很少的磁盤空間。每一個Hash可以存儲4294967295個鍵值對

3.2 HSET / HGET / HDEL / HEXISTS / HLEN / HSETNX

127.0.0.1:6379> hset cc1 field1 111				# 設定cc1鍵的字段field1的值為111
(integer) 1
127.0.0.1:6379> hget cc1 field1					# 檢視cc1鍵字段field1的值
"111"
127.0.0.1:6379> hget cc1 field2					# 2未建立,傳回nil
(nil)
127.0.0.1:6379> hset cc1 field2 222				# 建立字段field2
(integer) 1
127.0.0.1:6379> hlen cc1						# 擷取cc1鍵的字段數量
(integer) 2
127.0.0.1:6379> hexists cc1 field1				# 判斷鍵中是否存在字段為field1的字段,存在傳回1
(integer) 1
127.0.0.1:6379> hdel cc1 field1					# 删除鍵中的字段
(integer) 1
127.0.0.1:6379> hsetnx cc1 field1 111			# 給cc1添加新字段,成功傳回1
(integer) 1
127.0.0.1:6379> hsetnx cc1 field1 111			# 重複添加失敗,傳回0
(integer) 0
           

3.3 HINCRBY

127.0.0.1:6379> hset cc1 field 2			# 建立
(integer) 1
127.0.0.1:6379> hincrby cc1 field 1			# 給字段值加1,傳回為加後的結果
(integer) 3
127.0.0.1:6379> hincrby cc1 field 1
(integer) 4
127.0.0.1:6379> hincrby cc1 field -2		# 給字段值減2,傳回為減後的結果
(integer) 2
127.0.0.1:6379> hincrby cc1 field -2
(integer) 0
           

3.4 HGETALL / HKEYS / HVALS / HMGET / HMSET

127.0.0.1:6379> hmset cc1 field1 111 field2 222			# 批量建立多個字段
OK
127.0.0.1:6379> hmget cc1 field1 field2					# 批量擷取多個字段
1) "111"
2) "222"
127.0.0.1:6379> hgetall cc1								# 傳回所有字段和值
1) "field1"
2) "111"
3) "field2"
4) "222"
127.0.0.1:6379> hkeys cc1								# 僅擷取鍵中所有字段的名
1) "field1"
2) "field2"
127.0.0.1:6379> hvals cc1								# 僅擷取鍵中所有字段的值
1) "111"
2) "222"
           

四、SET 資料類型(無序集合)

4.1 概述

無序集合,元素類型為String類型,元素具有唯一性,不允許存在重複的成員。多個集合類型之間可以進行并集、交集和差集運算

應用範圍

  • 可以使用Redis的Set資料類型跟蹤一些唯一性資料,比如通路某一部落格的唯一IP位址資訊。對于此場景,我們僅需在每次通路該部落格時将通路者的IP存入Redis中,Set資料類型會自動保證IP位址的唯一性
  • 充分利用Set類型的服務端聚合操作友善、高效的特性,可以用于維護資料對象之間的關聯關系。比如所有購買某一電子裝置的客戶ID被存儲在一個指定的Set中,而購買另外一種電子産品的客戶ID被存儲在另外一個Set中,如果此時我們想擷取有哪些客戶同時購買了這兩種商品時,Set的intersections指令就可以充分發揮它的友善和效率的優勢

4.2 SADD / SMEMBERS / SCARD / SISMEMBER

127.0.0.1:6379> sadd cc1 a b c				# a b c不存在,可以直接插入建立
(integer) 3
127.0.0.1:6379> sadd cc1 a b d e			# a b已存在,隻插入未存在的兩個
(integer) 2

127.0.0.1:6379> sismember cc1 a				# 判斷a是否存在,傳回1表示存在
(integer) 1
127.0.0.1:6379> sismember cc1 f				# 判斷f是否存在,傳回0表示不存在
(integer) 0

127.0.0.1:6379> smembers cc1				# 輸出的順序與插入順序無關
1) "d"
2) "b"
3) "e"
4) "c"
5) "a"
127.0.0.1:6379> scard cc1					# 獲得元素的數量
(integer) 5
           

4.3 SPOP / SREM / SRANDMEMBER / SMOVE

127.0.0.1:6379> smembers cc1
1) "c"
2) "b"
3) "a"
4) "d"
127.0.0.1:6379> srandmember cc1			# 該指令随機傳回某一成員
"a"
127.0.0.1:6379> srandmember cc1
"d"

127.0.0.1:6379> spop cc1				# 随機移除一個成員
"b"
127.0.0.1:6379> smembers cc1			# 移除後結果
1) "c"
2) "a"
3) "d"

127.0.0.1:6379> srem cc1 a c e			# 移除a c e 其中e不存在,是以隻移除了兩個,傳回值2
(integer) 2

127.0.0.1:6379> sadd cc2 a b			# 建立cc2
(integer) 2
127.0.0.1:6379> smove cc1 cc2 c			# 将cc1的c字元移動到cc2
(integer) 1
127.0.0.1:6379> smembers cc2			# 檢視結果
1) "c"
2) "b"
3) "a"
           

五、Sorted Set 資料類型(zset、有序集合)

5.1 概述

  • 有序集合,元素類型為String,元素具有唯一性,不能重複
  • 每個元素都會關聯一個double類型的分數score(表示權重),可以通過權重的大小排序,元素的score可以相同

應用範圍

  • 可以用于一個大型線上遊戲的積分排行榜。每當玩家的分數發生變化時,可以執行ZADD指令更新玩家的分數,此後再通過ZRANGE指令擷取積分TOP10的使用者資訊。當然我們也可以利用ZRANK指令通過username來擷取玩家的排行資訊。最後我們将組合使用ZRANGE和ZRANK指令快速的擷取和某個玩家積分相近的其他使用者的資訊
  • Sorted-Set類型還可用于建構索引資料

5.2 ZADD / ZCARD / ZCOUNT / ZREM / ZINCRBY / ZSCORE / ZRANGE / ZRANK

127.0.0.1:6379> zadd cc 1 one					# 添加一個分數為1的成員
(integer) 1
127.0.0.1:6379> zadd cc 2 two 3 three			# 添加分數2和3的成員
(integer) 2
127.0.0.1:6379> zrange cc 0 -1 WITHSCORES		# 傳回結果包含每個成員及其分數,0 -1表示第一個到最後一個
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
127.0.0.1:6379> zrank cc one					# 擷取one的位置索引值,0表示第一個
(integer) 0
127.0.0.1:6379> zrank cc four					# 成員four不存在,傳回值nil
(nil)
127.0.0.1:6379> zcard cc						# 擷取成員數量
(integer) 3
127.0.0.1:6379> zcount cc 1 2					# 分數表達式,1≤ score ≤2的數量
(integer) 2
127.0.0.1:6379> zrem cc one two					# 删除成員one和two,傳回值為删除的數量
(integer) 2
127.0.0.1:6379> zcard cc						# 檢視是否成功
(integer) 1
127.0.0.1:6379> zscore cc three					# 擷取成員three的分數
"3"
127.0.0.1:6379> zscore cc two					# two被删除,是以擷取的是nil
(nil)
127.0.0.1:6379> zincrby cc 2 one				# one不存在,zincrby将添加該成員并假設初始分數為0,将成員two的分數加2并傳回更新後的分數
"2"
127.0.0.1:6379> zincrby cc -1 one				# 将成員one的分數-1,傳回更新後的分數
"1"
127.0.0.1:6379> zrange cc 0 -1 WITHSCORES
1) "one"
2) "1"
3) "three"
4) "3"
           

5.3 ZRANGEBYSCORE / ZREMRANGEBYRANK / ZREMRANGEBYSCORE

127.0.0.1:6379> zadd cc 1 one 2 two 3 three 4 four				# 建立
(integer) 4
127.0.0.1:6379> zrangebyscore cc 1 2							# 擷取 1≤ score ≤ 2的成員
1) "one"
2) "two"
127.0.0.1:6379> zrangebyscore cc -inf +inf limit 2 3			# -int表示第一個成員,+int表示最後一個,
																  limit後面的參數用于限制傳回成員的值,
																  2表示從位置索引等于2的成員開始,取後面3個成員
1) "three"
2) "four"
127.0.0.1:6379> zrangebyscore cc 0 4 limit 2 3
1) "three"
2) "four"
127.0.0.1:6379> zremrangebyscore cc 1 2							# 删除滿足表達式的成員,傳回實際删除數量
(integer) 2
127.0.0.1:6379> zrange cc 0 -1									# 檢視是否删除成功
1) "three"
2) "four"
127.0.0.1:6379> zremrangebyrank cc 0 1
(integer) 2
127.0.0.1:6379> zcard cc
(integer) 0
           

5.4 ZREVRANGE / ZREVRANGEBYSCORE / ZREVRANK

127.0.0.1:6379> zadd cc 1 one 2 two 3 three 4 four			# 添加
(integer) 4
127.0.0.1:6379> zrevrange cc 0 -1 WITHSCORES				# 以位置索引從高到低擷取傳回區間内的成員
1) "four"
2) "4"
3) "three"
4) "3"
5) "two"
6) "2"
7) "one"
8) "1"
127.0.0.1:6379> zrevrange cc 1 3							# 擷取1到3的成員,由于從高到低排序,是以第一個是four
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> zrevrange cc 1 3
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> zrevrank cc one								# one的位置是3
(integer) 3
127.0.0.1:6379> zrevrangebyscore cc 3 0						# 滿足表達式,從高到底輸出
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> zrevrangebyscore cc 4 0 limit 1 2			# 該指令支援limit選項,在計算位置時候按照相反的順序計算
1) "three"
2) "two"
           

繼續閱讀