Redis學習之數據類型及基本操作

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 VALUEget 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中,每個不同的數據類型有不同的用法,適用于不同的場景,在使用的時候需要靈活使用,選擇最合適的數據結構

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 2016年,安徽合肥成為國內房價上漲的最快的城市,令人驚訝。在胡潤研究院今年1月發布的2016年全球房價指數中,合...
    17034b15b301閱讀 997評論 0 1
  • 說不用擔心老人對孩子專注力的影響。可我還是焦慮,一會遞給寶一個玩具,寶剛玩上,老人又遞一個新的。我看到老人對孩子...
    山里仁佳閱讀 274評論 0 0
  • 創建表的語句很簡單,格式如下create table 表名(字段名 類型,字段名 類型,…); 當你new了之后,...
    duoduo7628閱讀 10,322評論 0 2