Redis入門教程(二)— 基本資料型別

mpsky發表於2021-09-09

閱讀以下內容時,手邊開啟一個redis-cli一起輸入,輸入命令敲擊Enter鍵前在心中想好你的答案,如果結果不合你的預期,請分析原因,使極大地提高學習效率。如果沒有條件,每個資料型別後有程式碼執行結果,供你參考。

Reids作為一個key-value型儲存系統,下面我們就分別從key和value說起:

key

key支援非二進位制安全的字元型別(not binary-safe strings)。它不支援空格和換行等,key的命名一般建議使用object-type:id:field,即物件型別 :物件ID:物件屬性方式。

對於key的命名,不要太長,佔記憶體,導致查詢慢;不要太短,顯然car:1:color比c:1:c的可讀性高太多

key的相關操作

  • KEYS pattern 返回匹配指定模式的所有key列表( ? :匹配一個字元 : 匹配任意個字元 [a-z] : 匹配括號中的任一字元 x : 跳脫字元 ) 如:`keys `
  • EXISTS key 判斷鍵是否存在,存在返回1,否則返回0 如:exists car
  • DEL key [key2 ...] 刪除鍵,可以刪除一個或者多個,返回值是刪除的鍵的個數 如:del car
  • TYPE key 獲取鍵值的資料型別 如:type car
  • RANDOMKEY 隨機返回當前資料庫中的一個key,如果資料庫為空,返回空串 如:randomkey
  • RENAME oldkey newkey 重新命名一個key,如果newkey存在,將會被覆蓋,成功返回1,否則返回0。失敗可能是oldkey不存在或者與newkey相同 如:rename car train
  • RENAMENX oldkey newkey 功能同上,如果newkey存在,返回失敗 如:renamenx car train
  • DBSIZE 返回當前資料庫的key數量 如:dbsize
  • EXPIRE key seconds 為key指定過期時間,單位秒。成功返回1,否則返回0。0表示key已經設定過期或者不存在 如:expire train 60
  • TTL key 返回key剩餘過期時間,單位秒。返回-1表示key不存在或者沒有設定過期時間 如:ttl train
  • MOVE key db_index 將key從當前資料庫移動到指定資料庫。成功返回1,否則返回0。0表示key不存在或者已經在指定資料庫中 如:move key 1
  • FLUSHDB 刪除當前資料庫中的所有key,此方法不會失敗,慎用 如:flushdb
  • FLUSHALL 刪除所有資料庫中的所有key,此方法不會失敗,慎用 如:flushall

Value

Redis有這豐富的資料型別,包括Strings,Hashes,Lists,Sets和Ordered Sets

1. 字串 Strings

字串型別是Redis中最基本的資料型別,它可以儲存任何形式的字串,包括二進位制資料。可以用它儲存使用者的郵箱、JSON話的物件甚至是一張圖片。一個字串型別鍵允許儲存的資料最大容量是512MB。

字串型別是其他4中資料型別的基礎,其他資料型別和字串型別的差別從某種角度來說只是組織字串的形式不同。

  • SET key value 設定指定key的值 如:set age 101
  • SETNX key value 設定指定key的值(只在可key不存在時) 如:setnx price 101
  • GET key 獲取指定key的值 如:get age
  • GETRANGE key start end 返回key中字串值得子字元(與java不同,包含end) 如:getrange age 0 1
  • GETSET key value 將給定key的值設為value並返回key的舊值 如:getset age 12
  • MSET key value [key value...] 同時設定一個或多個key-value對 如:mset age1 1 age2 2
  • MGET key [key2 ...] 獲取所有給定key的值 如:mget age1 age2
  • SETEX key seconds value 將值value關聯到key,並將key的過期時間設為seconds秒 如:setex age3 60 3
  • STRLEN key 返回key所儲存的字串值的長度 如:strlen age
  • INCR key 將key中儲存的數字值增一 如:incr age
  • INCRBY key increment 將key所儲存的值加上給定的增量值 如:incrby age 12
  • INCRBYFLOAT key increment 將key所儲存的值加上給定的浮點值 如:incrbyfloat price 12.4
  • DECR key 將key中儲存的數字值減一,等同於incrby key -1 如:decr age
  • DECRBY key decrement 將key所儲存的值減去指定的值 如:decrby age 12
  • APPEND key value 如果key存在,在其末尾追加value 如:append age years
127.0.0.1:6379> set age 101
OK
127.0.0.1:6379> setnx price 101
(integer) 1
127.0.0.1:6379> get age
"101"
127.0.0.1:6379> getrange age 0 1
"10"
127.0.0.1:6379> getset age 12
"101"
127.0.0.1:6379> mset age1 1 age2 2
OK
127.0.0.1:6379> mget age1 age2
1) "1"
2) "2"
127.0.0.1:6379> setex age3 60 3
OK
127.0.0.1:6379> strlen age
(integer) 2
127.0.0.1:6379> incr age
(integer) 13
127.0.0.1:6379> incrby age 12
(integer) 25
127.0.0.1:6379> incrbyfloat price 12.4
"113.4"
127.0.0.1:6379> decr age
(integer) 24
127.0.0.1:6379> decrby age 12
(integer) 12
127.0.0.1:6379> append age years
(integer) 7

2. 雜湊 Hashes

雜湊型別是一個String型別的欄位(field)和欄位值(value)的對映表,欄位值只能是字串,換句話說,雜湊型別不能巢狀其他的資料型別,每個hash可以儲存2^32-1鍵值對(40多億)。

提示:除了雜湊型別,Redis的其他資料型別同樣不支援資料型別巢狀。比如集合型別的每個元素都只能是字串,不能是另一個集合或雜湊表等。

雜湊型別適合儲存物件:使用物件類別和ID構成鍵名,使用欄位表示物件的屬性,而欄位值則儲存屬性值。例如要儲存ID為2的汽車物件,可以分別使用名為color、name和price的3個欄位儲存該汽車的顏色、名稱和價格:

hset car price 500
hset car name BMW
hset car color red
  • HSET key field value 將雜湊表key中的欄位field的值設為value 如:hset student name zhangsan
  • HSETNX key field value 只有在欄位field不存在時,設定雜湊表欄位的值 如:hsetnx student age 12
  • HMSET key field1 value1 [field2 value2 ...] 同時將多個 field-value (域-值)對設定到雜湊表 key 中 如:hmset student sex boy address beijing
  • HGET key field 獲取儲存在雜湊表中指定欄位的值 如:hget student name
  • HMGET key filed1 [field2...] 獲取所有給定欄位的值 如:hmget student name age
  • HGETALL key 獲取在雜湊表中指定 key 的所有欄位和值 如:hgetall student
  • HEXISTS key field 檢視雜湊表 key 中,指定的欄位是否存在 如:hexists student name
  • HINCRBY key field increment 為雜湊表 key 中的指定欄位的整數值加上增量 increment 如:hincrby student age 1
  • HINCRBYFLOAT key field increment 為雜湊表 key 中的指定欄位的浮點數值加上增量 increment 如:hincrbyfloat student age 1.2
  • HDEL key field1 [field2...] 刪除一個或多個雜湊表欄位 如:hdel student age address
  • HVALS key 獲取雜湊表中所有值 如:hvals student
  • HKEYS key 獲取所有雜湊表中的欄位 如:hkeys student
  • HLEN key 獲取雜湊表中欄位的數量 如:hlen student
127.0.0.1:6379> hset student name zhangsan
(integer) 1
127.0.0.1:6379> hsetnx student age 12
(integer) 1
127.0.0.1:6379> hmset student sex boy address beijing
OK
127.0.0.1:6379> hget student name
"zhangsan"
127.0.0.1:6379> hmget student name age
1) "zhangsan"
2) "12"
127.0.0.1:6379> hgetall student
1) "name"
2) "zhangsan"
3) "age"
4) "12"
5) "sex"
6) "boy"
7) "address"
8) "beijing"
127.0.0.1:6379> hexists student name
(integer) 1
127.0.0.1:6379> hincrby student age 1
(integer) 13
127.0.0.1:6379> hincrbyfloat student age 1.2
"14.2"
127.0.0.1:6379> hdel student age address
(integer) 2
127.0.0.1:6379> hvals student
1) "zhangsan"
2) "boy"
127.0.0.1:6379> hkeys student
1) "name"
2) "sex"
127.0.0.1:6379> hlen student
(integer) 2

3. 列表 List

列表型別(List)可以儲存一個有序的字串列表,常見的操作有向列表兩端新增元素,或者獲取列表的某一個片段。

其內部使用雙向連結串列實現,所以向列表兩端新增元素、取元素的時間複雜度為O(1),獲取越接近兩端的元素速度越快;使用連結串列的代價是透過索引訪問元素比較慢,設想在IPhone發售當天有1000個人在排隊,蘋果公司打算給第486位顧客免費贈送一部,工作人員不得不一個一個數到第486個人。如果是新來的人想加入隊伍,直接排到隊尾就可以。

  • LPUSH key value1 [value2...] 將一個或多個值插入到列表頭部 如:lpush student xiaoli xiaowang xiaoliu xiaozhang
  • RPUSH key value1 [value2...] 在列表尾部中新增一個或多個值 如:rpush student zhangsan lisi wangwu
  • LPUSHX key value 將一個值插入到已存在的列表頭部 如:lpushx student xiaoming
  • RPUSHX key value 將一個值插入到已存在的列表尾部 如:rpushx student maliu
  • LPOP key 移出並獲取列表的第一個元素 如:lpop student
  • RPOP key 移出並獲取列表的最後一個元素 如:rpop student
  • LINDEX key index 透過索引獲取列表中的元素(從0開始) 如:lindex student 0
  • LINSERT key before|after pivot value 在列表的元素前或者後插入元素 如:linsert student before xiaozhang zhangsan
  • LLEN key 獲取列表長度 如:llen student
  • LRANGE key start stop 獲取列表指定範圍內的元素 如:lrange student 0 4
  • LREM key count value 從key對應list中刪除count個和value相同的元素,count為0時候刪除全部 如:lrem student 2 zhangsan
  • LSET key index value 設定list中指定下標的元素值 如:lset student 2 xiaolei
  • LTRIM key start stop 對一個列表進行修剪(trim),就是說,讓列表只保留指定區間內的元素,不在指定區間之內的元素都將被刪除 如:ltrim student 0 3
  • BLPOP key1 [key2...] timeout 從頭部非空list進行lpop操作並返回,就是說,blpop list1 list2 list3,如果list1不存在,list2、list3都是非空則對list2進行lpop操作並返回。如果所有的list都是空或不存在,則會阻塞timeout秒,timeout為0表示一直阻塞;當阻塞時,如果有client對key1...keyN中的任意key進行push操作,則第一在這個key上被阻塞的client會立即返回。如果超時發生,則返回nil
  • BRPOP key1 [key2...] timeout 同blpop,brpop是從尾部開始執行
  • RPOPLPUSH source destination 從詞面意思可以看出先做rpop,再做lpush。它的作用是從source對應list的尾部移除元素並新增到destination對應list的頭部,最後返回被移除的元素值,整個操作是原子的。如果source 是空或者不存在則返回nil
  • BRPOPLPUSH source destination timeout 從列表尾部中彈出一個值,將彈出的元素插入到另外一個列表中並返回它; 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止
127.0.0.1:6379> lpush student xiaoli xiaowang xiaoliu xiaozhang
(integer) 4
127.0.0.1:6379> rpush student zhangsan lisi wangwu
(integer) 7
127.0.0.1:6379> lpushx student xiaoming
(integer) 8
127.0.0.1:6379> rpushx student maliu
(integer) 9
127.0.0.1:6379> lpop student
"xiaoming"
127.0.0.1:6379> rpop student
"maliu"
127.0.0.1:6379> lindex student 0
"xiaozhang"
127.0.0.1:6379> linsert student before xiaozhang zhangsan
(integer) 8
127.0.0.1:6379> llen student
(integer) 8
127.0.0.1:6379> lrange student 0 4
1) "zhangsan"
2) "xiaozhang"
3) "xiaoliu"
4) "xiaowang"
5) "xiaoli"
127.0.0.1:6379> lrem student 2 zhangsan
(integer) 2
127.0.0.1:6379> lset student 2 xiaolei
OK
127.0.0.1:6379> ltrim student 0 3
OK
127.0.0.1:6379> lrange student 0 3
1) "xiaozhang"
2) "xiaoliu"
3) "xiaolei"
4) "xiaoli"

4. 集合 Set

集合的概念高中數學中就已經學過,集合中的每一個元素都是不同的,且沒有順序。一個集合型別(Set)鍵可以儲存至多2^32-1個字串。

集合型別的常用操作是向集合中加入或刪除元素、判斷某個元素是否存在等,由於集合型別在Redis內部是使用值為空的雜湊表(hash table)實現的,所以這些操作的時間複雜度都是O(1)。最方便的是多個集合型別鍵之間還可以進行交集、並集和差集運算。

  • SADD key member [member2...] 向集合新增一個或多個成員 如:sadd student zhangsan lisi ,sadd monitor wangwu zhangsan
  • SCARD key 獲取集合的成員數 如:scard student
  • SMEMBERS key 返回集合中的所有成員 如:smembers student
  • SREM key member [member2...] 移除集合中一個或多個成員 如:srem student lisi
  • SISMEMBER key member 判斷 member 元素是否是集合 key 的成員 如:sismember student zhangsan
  • SINTER key1 [key2...] 返回給定所有集合的交集 如:sinter student monitor
  • SINTERSTORE destination key1 [key2...] 返回給定所有集合的差集並儲存在 destination 集合中 如:sinterstore sinter student monitor
  • SUNION key1 [key2...] 返回給定所有集合的並集 如:sunion student monitor
  • SUNIONSTORE destination key1 [key2...] 所有給定集合的並集儲存在 destination 集合中 如:sunionstore sunion student monitor
  • SDIFF key1 [key2...] 返回給定所有集合的差集 如:sdiff monitor student
  • SDIFFSTORE destination key1 [key2...] 返回給定所有集合的差集並儲存在 destination 集合中 如:sdiffstore sdiff monitor student
  • SRANDMEMBER key [count] 隨機返回key集合中count個成員 如:srandmember sunion 2
  • SPOP key 移除並返回集合中的一個隨機元素 如:spop sunion
  • SMOVE source destination member 將 member 元素從 source 集合移動到 destination 集合 如:smove monitor student wangwu
127.0.0.1:6379> sadd student zhangsan lisi
(integer) 2
127.0.0.1:6379> sadd monitor wangwu zhangsan
(integer) 2
127.0.0.1:6379> scard student
(integer) 2
127.0.0.1:6379> smembers student
1) "zhangsan"
2) "lisi"
127.0.0.1:6379> srem student lisi
(integer) 1
127.0.0.1:6379> sismember student zhangsan
(integer) 1
127.0.0.1:6379> sinter student monitor
1) "zhangsan"
127.0.0.1:6379> sinterstore sinter student monitor
(integer) 1
127.0.0.1:6379> sunion student monitor
1) "zhangsan"
2) "wangwu"
127.0.0.1:6379> sunionstore sunion student monitor
(integer) 2
127.0.0.1:6379> sdiff monitor student
1) "wangwu"
127.0.0.1:6379> sdiffstore sdiff monitor student
(integer) 1
127.0.0.1:6379> srandmember sunion 2
1) "zhangsan"
2) "wangwu"
127.0.0.1:6379> spop sunion
"zhangsan"
127.0.0.1:6379> smove monitor student wangwu
(integer) 1

5. 有序集合 Sorted Set

有序集合與集合的區別在於“有序”二字,不僅可以完成插入、刪除和判斷元素是否存在等集合型別支援的操作,而且還能有序的獲取前N個元素。

有序集合型別在某些方面和列表型別有些相似。

  • 二者都是有序的。
  • 二者都可以獲得某一範圍的元素。

但是二者有著很大的區別,這使得它們的應用場景也是不同的。

  • 列表型別是透過連結串列實現的,獲取靠近兩端的資料速度極快,而當元素增多後,訪問中間資料的速度會較慢,所以它更加適合實現如“新鮮事”或“日誌”這樣很少訪問中間元素的應用。
  • 有序集合型別是使用雜湊表和跳躍表(Skip list)實現的,所以即使讀取位於中間部分的資料速度也很快(時間複雜度是O(log(N))) 。
  • 有序集合要比列表型別更耗費記憶體

有序集合型別算得上是Redis的5種資料型別中最高階的型別了,在學習時可以與列表型別和集合型別對照理解。

  • ZADD key score1 member1 [score2 member2] 向有序集合新增一個或多個成員,或者更新已存在成員的分數 如:新增成員 zadd score 50 zhangsan 60 lisi 70 wangwu 80 zhaoliu 90 yangqi 120 xiaoming 130 xiaozhang 140 xiaoli 150 xiaoliu 更新分數 zadd score 100 zhangsan
  • ZSCORE key member 返回有序集中,成員的分數值 如:zscore score zhangsan
  • ZRANGE key start stop [WITHSCORES] 按照成員分數從小到大的順序返回索引從start到stop之間的所有成員值。索引從0開始,-1表示最後一個元素。如果需要同時返回分數,在後面加上WITHSCORES。 如:zrange score 0 -1 withscores
  • ZREVRANGE key start stop [WITHSCORES] 與ZRANGE唯一的不同是按照成員分數從大到小的順序返回。 如:zrevrange score 0 -1 withscores
  • ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] 按照成員分數從小到大的順序返回分數值從min到max之間的所有成員值。如果不想包含端點值,可以在分數前加上(;min和max還支援無窮大,-inf和+inf分別代表負無窮和正無窮。LIMIT offset count中,offset表示從第一個元素開始偏移的位數,count表示輸出的數量。 如:zrangebyscore score 50 (80 limit 1 2
  • ZREVRANGEBYSCORE key max min [WITHSCORES] 與ZRANGEBYSCORE唯一的不同是按照成員分數從大到小的順序返回。 如:zrevrangebyscore score 80 50
  • ZRANGEBYLEX key min max [LIMIT offset count] 按照字典順序區間返回有序集合的成員
  • ZINCRBY key increment member 有序集合中對指定成員的分數加上增量 increment 如:zincrby score 5 lisi
  • ZCARD key 獲取有序集合的成員數 如:zcard score
  • ZCOUNT key min max 計算在有序集合中指定區間分數的成員數 如:zcount score 50 100
  • ZLEXCOUNT key min max 在有序集合中計算指定字典區間內成員數量
  • ZREM key member [member...] 移除有序集合中的一個或多個成員 如:zrem score wangwu
  • ZREMRANGEBYRANK key start stop 按照元素分數從小到大的順序(索引0表示最小的值)刪除處在指定索引範圍內的所有元素,並返回刪除的元素數量 如:zremrangebyrank score 0 1
  • ZREMRANGEBYSCORE key min max 按照元素分數從小到大的順序(索引0表示最小的值)刪除處在指定分數範圍內的所有元素,並返回刪除的元素數量 如:zremrangebyscore score 90 100
  • ZREMRANGEBYLEX key min max 移除有序集合中給定的字典區間的所有成員
  • ZRANK key member 返回有序集合中指定成員的索引 如:zrank score xiaoliu
  • ZREVRANK key member 與ZRANK唯一的不同是按照成員分數從大到小的順序返回指定的索引 如:zrevrank score xiaoliu
127.0.0.1:6379> zadd score 50 zhangsan 60 lisi 70 wangwu 80 zhaoliu 90 yangqi 120 xiaoming 130 xiaozhang 140 xiaoli 150 xiaoliu
(integer) 9
127.0.0.1:6379> zadd score 100 zhangsan
(integer) 0
127.0.0.1:6379> zscore score zhangsan
"100"
127.0.0.1:6379> zrange score 0 -1 withscores
 1) "lisi"
 2) "60"
 3) "wangwu"
 4) "70"
 5) "zhaoliu"
 6) "80"
 7) "yangqi"
 8) "90"
 9) "zhangsan"
10) "100"
11) "xiaoming"
12) "120"
13) "xiaozhang"
14) "130"
15) "xiaoli"
16) "140"
17) "xiaoliu"
18) "150"
127.0.0.1:6379> zrevrange score 0 -1 withscores
 1) "xiaoliu"
 2) "150"
 3) "xiaoli"
 4) "140"
 5) "xiaozhang"
 6) "130"
 7) "xiaoming"
 8) "120"
 9) "zhangsan"
10) "100"
11) "yangqi"
12) "90"
13) "zhaoliu"
14) "80"
15) "wangwu"
16) "70"
17) "lisi"
18) "60"
127.0.0.1:6379> zrangebyscore score 50 (80 limit 1 2
1) "wangwu"
127.0.0.1:6379> zrevrangebyscore score 80 50
1) "zhaoliu"
2) "wangwu"
3) "lisi"
127.0.0.1:6379> zincrby score 5 lisi
"65"
127.0.0.1:6379> zcard score
(integer) 9
127.0.0.1:6379> zcount score 50 100
(integer) 5
127.0.0.1:6379> zrem score wangwu
(integer) 1
127.0.0.1:6379> zremrangebyrank score 0 1
(integer) 2
127.0.0.1:6379> zremrangebyscore score 90 100
(integer) 2
127.0.0.1:6379> zrank score xiaoliu
(integer) 3
127.0.0.1:6379> zrevrank score xiaoliu
(integer) 0

文章除註明轉載外,均為原創。歡迎任何形式的轉載,但請務必註明出處:
文章轉載自
本文作者:
作者主頁:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1806/viewspace-2799412/,如需轉載,請註明出處,否則將追究法律責任。

相關文章