Redis學習之數據類型及基本操作
前言
在前面一個小節中,我們學習了Redis的安裝、客戶端的使用等,在這一小節中,將學習Redis的五種數據結構及對應的操作。
在前面我們提到了,Redis是基于鍵值對的,也就是說,所有的數據類型都必須有一個鍵與其對應,而這里五種數據結構,指的是對應的值的類型,這一點需要注意一下。
基本操作
Redis中有非常多的命令,有一些命令是用于操作特定數據結構的,而有一些命令則是通用的,我們先來學習一些通用的命令
獲取符合規則的鍵名列表
操作命令:keys PATTERN
PATTERN支持通配符的形式
-
?
匹配一個字符 -
*
匹配任意多個字符 -
[]
匹配括號中間的任意字符 -
\x
匹配字符x,其中x需要進行轉移
注意事項:由于keys命令會遍歷Redis中所有鍵,當數量比較大的時候,會影響性能,所以,不建議在生成環境中使用
判斷一個鍵是否存在
操作命令:exists KEY
,如果存在則返回1,否則返回0
刪除鍵
操作命令:del KEY
,返回刪除的鍵的個數
獲取鍵值的類型
操作命令:type KEY
,返回類型:string、hash、list、set、zset
字符串類型
字符串類型是Redis中最基本的數據類型,能存儲任意形式的字符串,包括二進制數據,可以用于存儲用戶的郵箱,JSON化的數據,甚至是一張圖片,一個字符串類型鍵允許存儲的數據的最大容量是512MB
基本命令
賦值與取值
命令:set KEY VALUE
、get KEY
127.0.0.1:6379> set name xavier
OK
127.0.0.1:6379> get name
"xavier"
遞增數字
命令:incr KEY
注意
- 該命令只能用于值是數字類型的,如果是字符串等,會報錯(很合理嘛)
- incr命令在內的所有Redis命令都是原子操作,所以不用擔心會出現競態條件
127.0.0.1:6379> set age 22
OK
127.0.0.1:6379> incr age
(integer) 23
127.0.0.1:6379> get age
"23"
127.0.0.1:6379> incr age
(integer) 24
增加指定的整數
命令:incr KEY INCREMENT
,INCRMENT指定要增加的數值
127.0.0.1:6379> incrby year 2018
(integer) 2018
127.0.0.1:6379> get year
"2018"
減少指定的整數
命令:decr KEY
,減一
命令:decrby KEY DECREMENT
,減少DECREMENT
127.0.0.1:6379> get year
"2018"
127.0.0.1:6379> decr year
(integer) 2017
127.0.0.1:6379> decrby year 10
(integer) 2007
增加指定浮點數
命令:incrbyfloat KEY INCREMENT
27.0.0.1:6379> incrbyfloat num 3.2
"3.2"
127.0.0.1:6379> get num
"3.2"
向尾部追加值
命令:append KEY VALUE
127.0.0.1:6379> append year years
(integer) 9
127.0.0.1:6379> get year
"2018years"
獲取字符串長度
命令:strlen KEY
127.0.0.1:6379> get year
"2018years"
127.0.0.1:6379> strlen year
(integer) 9
同時設置/獲取多個鍵值
命令:mget KEY [KEY1 KEY2 ...]
命令:mset KEY VALUE [KEY1 VALUE1 KEY2 VALUE2 ...]
127.0.0.1:6379> mset name xavier age 23 school szu
OK
127.0.0.1:6379> mget name age school
1) "xavier"
2) "23"
3) "szu"
散列類型
散列類型,也就是hash,是一種鍵值對,存儲了字段和字段值的映射,但是字段值只能放字符串類型,不能存放其他類型,也就是hash類型不支持嵌套
舉Java中的Map
作為例子,此時的名字就是Map
結構的名字,而對應的字段就是Map
中的key,對應的字段值就是Map
中的value
基本操作
賦值與取值
命令:hset KEY FILED VALUE
命令:hget KEY FILED
127.0.0.1:6379> hset stu name xavier
(integer) 0
127.0.0.1:6379> hget stu name
"xavier"
命令:hmset KEY FIELD VALUE [FIELD1 VALUE1 FIELD2 VALUE2 ...]
命令:hmget KEY FIELD [FIELD1 FIELD2 ...]
127.0.0.1:6379> hmset stu name xavier age 23 school szu
OK
127.0.0.1:6379> hmget stu name age school
1) "xavier"
2) "23"
3) "szu"
命令:hgetall KEY
,獲取hash結構的所有字段及其值
127.0.0.1:6379> hgetall stu
1) "name"
2) "xavier"
3) "age"
4) "23"
5) "school"
6) "szu"
注意跟mset
命令的區別,mset的是設置多個鍵,hmset
設置的一個鍵的多個字段
判斷字段是否存在
命令:hexists KEY FIELD
127.0.0.1:6379> hexists stu hello
(integer) 0
127.0.0.1:6379> hexists stu name
(integer) 1
字段不存在時賦值
命令:hsetnx KEY FIElD VALUE
127.0.0.1:6379> hsetnx stu name xavier
(integer) 0
127.0.0.1:6379> hsetnx stu country china
(integer) 1
127.0.0.1:6379> hgetall stu
1) "name"
2) "xavier"
3) "age"
4) "23"
5) "school"
6) "szu"
7) "country"
8) "china"
增加數字
命令:hincryby KEY FIElD INCREMENT
,注意,字段不存在時會新增并且賦值
127.0.0.1:6379> hincrby stu age 1
(integer) 24
刪除字段
命令:hdel KEY FIELD [FIELD1 FIELD2]
127.0.0.1:6379> hdel stu work_year
(integer) 1
只獲取字段名或字段值
命令:hkeys KEY
命令:hvals KEY
127.0.0.1:6379> hkeys stu
1) "name"
2) "age"
3) "school"
4) "country"
127.0.0.1:6379> hvals stu
1) "xavier"
2) "24"
3) "szu"
4) "china"
獲取字段數量
命令:hlen KEY
127.0.0.1:6379> hlen stu
(integer) 4
列表類型
列表類型,list,可以存儲一個有序的字符串列表,Redis中使用的列表是雙向鏈表,可以從鏈表兩端操作數據
基本操作
向列表兩端增加數據
命令:lpush KEY VALUE [VALUE1 VALUE2 ...]
命令:rpush KEY VALUE [VALUE1 VALUE2 ...]
127.0.0.1:6379> lpush page 1 2 3 5
(integer) 4
127.0.0.1:6379> rpush page 9 8 7
(integer) 7
# 此時列表內容為 5 3 2 1 9 8 7
從列表兩端彈出元素
命令:lpop KEY
命令:rpop KEY
127.0.0.1:6379> lpop page
"5"
127.0.0.1:6379> rpop page
"7"
# 此時列表內容為 3 2 1 9 8
獲取列表中元素的個數
命令:llen KEY
127.0.0.1:6379> llen page
(integer) 5
獲取列表片段
命令:lrange KEY START END
注意
- START、END表示的是起始位置到結束位置(從0開始計數,包含兩端)
- 如果START大于END,則返回空列表
- 負數表示從右邊開始,如 -1表示最后的位置
- 如果END大于實際的位置,只返回到最右邊的位置(不會超出)
127.0.0.1:6379> lrange page 0 2
1) "3"
2) "2"
3) "1"
127.0.0.1:6379> lrange page 0 -1
1) "3"
2) "2"
3) "1"
4) "9"
5) "8"
127.0.0.1:6379> lrange page 100 1
(empty list or set)
127.0.0.1:6379> lrange page 0 100
1) "3"
2) "2"
3) "1"
4) "9"
5) "8"
刪除列表中指定的值
命令:lrem KEY COUNT VALUE
,刪除列表中前COUNT個值為VALUE的元素,返回實際刪除的個數
注意
- 如果COUNT > 0 時,會從列表左邊開始刪除前COUNT個值為VALUE的元素
- 如果COUNT < 0 時,從列表右邊開始刪除前COUNT個值為VALUE的元素
- 如果COUNT = 0 時,會刪除所有值為VALUE的元素
127.0.0.1:6379> lrange numbers 0 -1
1) "2"
2) "0"
3) "1"
4) "2"
5) "2"
6) "3"
7) "2"
127.0.0.1:6379> lrem numbers -1 2
(integer) 1
127.0.0.1:6379> lrange numbers 0 -1
1) "2"
2) "0"
3) "1"
4) "2"
5) "2"
6) "3"
127.0.0.1:6379> lrem numbers 1 2
(integer) 1
127.0.0.1:6379> lrange numbers 0 -1
1) "0"
2) "1"
3) "2"
4) "2"
5) "3"
127.0.0.1:6379> lrem numbers 0 2
(integer) 2
127.0.0.1:6379> lrange numbers 0 -1
1) "0"
2) "1"
3) "3"
獲取/設置指定索引的元素值
命令:lindex KEY INDEX
命令:lset KEY INDEX VALUE
127.0.0.1:6379> lindex numbers 0
"0"
127.0.0.1:6379> lset numbers 0 100
OK
127.0.0.1:6379> lrange numbers 0 -1
1) "100"
2) "1"
3) "3"
只保留列表指定片段
命令:ltrim KEY START END
127.0.0.1:6379> ltrim numbers 0 1
OK
127.0.0.1:6379> lrange numbers 0 -1
1) "100"
2) "1"
向列表中插入元素
命令:linsert KEY BEFORE|AFTER VAL VALUE
,在列表中VAL的前/后插入值為VALUE的元素
127.0.0.1:6379> linsert numbers before 100 200
(integer) 3
127.0.0.1:6379> lrange numbers 0 -1
1) "200"
2) "100"
3) "1"
127.0.0.1:6379> linsert numbers after 100 300
(integer) 4
127.0.0.1:6379> lrange numbers 0 -1
1) "200"
2) "100"
3) "300"
4) "1"
將元素從一個列表轉到另一個列表
命令:rpoplpush SOURCE DEST
,執行一次,傳輸一個元素,不是整個列表
127.0.0.1:6379> rpoplpush numbers list_
"1"
127.0.0.1:6379> lrange list_ 0 -1
1) "1"
127.0.0.1:6379> rpoplpush numbers list_
"300"
127.0.0.1:6379> rpoplpush numbers list_
"100"
127.0.0.1:6379> rpoplpush numbers list_
"200"
集合類型
集合中的元素是無序的,并且不存在重復元素,Redis中使用值為空的hash table實現的
基本操作
增加/刪除元素
命令:sadd KEY VALUE [VALUE1 VALUE2 ...]
命令:srem KEY VALUE [VALUE1 VALUE2 ...]
127.0.0.1:6379> sadd letters a b c a b c
(integer) 3 # 實際上值增加了三個元素,不是六個
127.0.0.1:6379> srem letters a b d
(integer) 2 # d不存在,也就不存在所謂的刪除了
獲取集合中的所有元素
命令:smembers KEY
127.0.0.1:6379> smembers letters
1) "c"
判斷元素是否在集合中
命令:sismember KEY VALUE
,1表示存在,0表示不存在
127.0.0.1:6379> sismember letters c
(integer) 1
127.0.0.1:6379> sismember letters e
(integer) 0
集合間運算
命令:sdiff KEY [KEY1 KEY2 ...]
,差集,從KEY集合中去掉其他
命令:sinter KEY [KEY1 KEY2 ...]
,交集,KEY集合與其他集合的交集
命令:sunion KEY [KEY1 KEY2 ...]
,并集,KEY集合與其他集合的并集
127.0.0.1:6379> sadd setA 1 2 3
(integer) 3
127.0.0.1:6379> sadd setB 2 3 4
(integer) 3
127.0.0.1:6379> sdiff setA setB
1) "1"
127.0.0.1:6379> sdiff setB setA
1) "4"
127.0.0.1:6379> sinter setA setB
1) "2"
2) "3"
127.0.0.1:6379> sunion setA setB
1) "1"
2) "2"
3) "3"
4) "4"
獲取集合中元素的個數
命令:scard KEY
127.0.0.1:6379> scard setA
(integer) 3
進行集合運算并將結果存儲
命令:sdiffstore DEST KEY1 [KEY2 ...]
命令:sinterstore DEST KEY1 [KEY2 ...]
命令:sunionstore DEST KEY1 [KEY2 ...]
從集合中彈出一個元素
命令:spop KEY
,隨機彈出
127.0.0.1:6379> spop setA
"2"
有序集合
與集合類似,但是具有排序的能力,在集合的基礎上,為每個元素關聯一個分數,然后根據分數進行排序
基本操作
增加元素
命令:zadd KEY SCORE VALUE [SCORE1 VALUE1 SCORE2 VALUE2 ...]
,如果元素存在,則用新的分數替換原來的分數,分數可以是整數,也可以是雙精度浮點數(+inf表示正無窮、-inf表示負無窮)
127.0.0.1:6379> zadd scoreboard 89 tom 67 peter 100 david
(integer) 3
127.0.0.1:6379> zadd scoreboard 76 peter
(integer) 0
獲取元素分數
命令:zscore KEY VALUE
127.0.0.1:6379> zscore scoreboard peter
"76"
獲取排名在某個范圍的元素列表
命令:zrange KEY START STOP [WITHSCORES]
,START、END指的是索引,不是分數值,WITHSCORES表示將分數也顯示出來,如果分數相同,則字段按照字典序排序,下同,分數從小到大
命令:zrevrange KEY START STOP [WITHSCORES]
,逆序
127.0.0.1:6379> zrange scoreboard 0 1 WITHSCORES
1) "peter"
2) "76"
3) "tom"
4) "89"
127.0.0.1:6379> zrevrange scoreboard 0 1 WITHSCORES
1) "david"
2) "100"
3) "tom"
4) "89"
127.0.0.1:6379> zrevrange scoreboard 0 1
1) "david"
2) "tom"
獲得指定分數范圍的元素
命令:zrangebyscore KEY MIN MAX [WITHSCORE] [LIMIT OFFSET COUNT]
,默認包含端點,如果不希望包含端點,在分數前面加上(
,如(80
,OFFSET、COUNT用法同SQL,用于指定偏移位置以及元素個數
命令:zrevrangebyscore
,原理同上,注意,MIN和MAX的位置也是相反的
127.0.0.1:6379> zrangebyscore scoreboard 80 100 WITHSCORES
1) "tom"
2) "89"
3) "david"
4) "100"
127.0.0.1:6379> zrangebyscore scoreboard 80 (100 WITHSCORES
1) "tom"
2) "89
增加某個元素的分數
命令:zincrby KEY INCREMENT VALUE
127.0.0.1:6379> zincrby scoreboard 3 peter
"79"
獲取集合中元素個數
命令:zcard KEY
獲取指定分數范圍內元素的個數
命令:zcount KEY MIN MAX
127.0.0.1:6379> zcount scoreboard 80 100
(integer) 2
刪除一個或者多個元素
命令:zrem KEY MEMBER [MEMBER1 MEMBER2 ...]
,返回成功刪除元素個數
127.0.0.1:6379> zrange scoreboard 0 -1
1) "peter"
2) "tom"
3) "david"
127.0.0.1:6379> zrem scoreboard tom
(integer) 1
127.0.0.1:6379> zrange scoreboard 0 -1
1) "peter"
2) "david"
按照排名范圍刪除元素
命令:zremrangebyrank KEY START END
127.0.0.1:6379> zrange scoreboard 0 -1
1) "peter"
2) "david"
127.0.0.1:6379> zremrangebyrank scoreboard 0 1
(integer) 2
127.0.0.1:6379> zrange scoreboard 0 -1
(empty list or set)
按照分數范圍刪除元素
命令:zremrangebyscore KEY MIN MAX
獲取元素排名
命令:zrank KEY MEMBER
,排名從0開始,默認是根據分數從小到大
127.0.0.1:6379> zadd scoreboard 1 a 2 b 3 c
(integer) 3
127.0.0.1:6379> zrange scoreboard 0 -1
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> zrank scoreboard a
(integer) 0
127.0.0.1:6379> zrank scoreboard b
(integer) 1
計算有序集合的交集
命令:zinterstore DEST NUM_KEYS KEY [KEY ...] [weight WEIGHT [WEIGHT ...] [aggregate SUM|MIN|MAX]]
注意,DEST中元素分數是由aggrate參數決定的
- SUM,也是默認值時,DEST中元素的分數是每個參與運算的集合中該元素的分數和
- MIN,表示采用最小值
- MAX,表示采用最大值
可以通過weight參數設置每個集合的權重,每個集合在參與計算時元素的分數乘上該權重
127.0.0.1:6379> zadd sortedSet1 1 a 2 b
(integer) 2
127.0.0.1:6379> zadd sortedSet2 10 a 20 b
(integer) 2
127.0.0.1:6379> zinterstore sortedSetsResult 2 sortedSet1 sortedSet2
(integer) 2
127.0.0.1:6379> zrange sortedSetsResult 0 -1 withscores
1) "a"
2) "11"
3) "b"
4) "22"
# min/max基本同上,不演示
127.0.0.1:6379> zinterstore sortedSetsResult 2 sortedSet1 sortedSet2 weights 20 2
(integer) 2
127.0.0.1:6379> zrange sortedSetsResult 0 -1 withscores
1) "a"
2) "40"
3) "b"
4) "80"
zunionstore命令的用法與zinterstore類似
總結
本小節主要學習了Redis的五種數據類型,string、hash、list、set、zset,在Redis中,每個不同的數據類型有不同的用法,適用于不同的場景,在使用的時候需要靈活使用,選擇最合適的數據結構