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"