天天看點

【Redis高手修煉之路】②Redis的五大資料類型

目錄

  • ​​1.字元串​​
  • ​​1.1 常用指令:​​
  • ​​1.1.1 添加、查詢、擷取長度、字元串的追加​​
  • ​​1.1.2 批量插入和查詢​​
  • ​​1.1.3 設定key值的生存時間​​
  • ​​1.1.4 key值的自增和自減​​
  • ​​1.2 使用場景​​
  • ​​2.哈希​​
  • ​​2.1 常用指令​​
  • ​​2.1.1 添加、查詢、删除、擷取長度以及是否存在​​
  • ​​2.1.2 key值的增加​​
  • ​​2.1.3 批量添加字段​​
  • ​​2.2 三種存儲方式的差別​​
  • ​​3.清單​​
  • ​​3.1 常用指令​​
  • ​​3.1.1 清單的插入、移除及查詢​​
  • ​​3.1.2 對已有清單進行更新、截取元素​​
  • ​​3.2 使用場景​​
  • ​​4.集合​​
  • ​​4.1 常用指令​​
  • ​​4.1.1 添加、删除​​
  • ​​4.1.2 交集、并集、差集​​
  • ​​4.1.3 随機數​​
  • ​​4.2 使用場景​​
  • ​​5.有序集合​​
  • ​​5.1 常用指令​​
  • ​​5.1.1 添加、查詢​​
  • ​​5.1.2 排序、成員值的更新​​
  • ​​5.1.3 交集​​
  • ​​5.2 使用場景​​

1.字元串

字元串是Redis最基礎的資料類型:
  • 字元串類型實際可以存儲字元串、數字、二進制資料;
  • Redis中的鍵都是字元串類型,值也支援字元串類型;
  • 字元串類型的存儲空間是有限的,最大可以存放512M的資料。

1.1 常用指令:

1.1.1 添加、查詢、擷取長度、字元串的追加

​set key value​

​設定指定 key 的值

​get key​

​擷取指定 key 的值

​getrange key start end​

​傳回 key 中字元串值的子字元

​setrange key offset value​

​用 value 參數覆寫給定 key 所儲存的字元串值,從偏移量 offset 開始。

​strlen key​

​傳回 key 所儲存的字元串值的長度

​append key value​

​如果 key 已經存在并且是一個字元串,将 value 追加到 key 原來的值的末尾

127.0.0.1:6379> set name tom
OK
127.0.0.1:6379> get name
"tom"
#當值為字元串時要加雙引号,或者之間加逗号隔開,空格代表指令結束
127.0.0.1:6379> set address "bei jing" 
OK
127.0.0.1:6379> set hobby basketball,football
OK
127.0.0.1:6379> get address
"bei jing"
127.0.0.1:6379> get hobby
"basketball,football"
127.0.0.1:6379> append hobby "music"  #追加字元串
(integer) 24
127.0.0.1:6379> get hobby
"basketball,footballmusic"
127.0.0.1:6379> getrange address 0 2 #截取字元串,下标從0開始
"bei"
127.0.0.1:6379> strlen address
(integer) 8
      

1.1.2 批量插入和查詢

​mset key value [key value ...]​

​同時設定一個或多個 鍵值對

​mget key1 [key2...]​

​擷取一個或多個給定key的值

​msetnx key value [key value ...]​

​同時設定一個或多個 key-value 對,當且僅當所有給定 key 都不存在

127.0.0.1:6379> mset a 1 b 2 c 3
OK
127.0.0.1:6379> mget a b c
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> msetnx weight "170" height "100"
(integer) 1
127.0.0.1:6379> mget weight height
1) "170"
2) "100"      

1.1.3 設定key值的生存時間

​setex key seconds value​

​設定key-value ,并設定key的生存時間(秒)

​psetex key milliseconds value​

​設定key-value ,并設定key的生存時間(毫秒)

​setnx key value​

​在 key 不存在時設定 key 的值

127.0.0.1:6379> setex id 10 "1001"
OK
127.0.0.1:6379> get id
"1001"
127.0.0.1:6379> get id  #10s之後就過期了
(nil)
127.0.0.1:6379> psetex key 10000 abc
OK
127.0.0.1:6379> get key
"abc"
127.0.0.1:6379> get key
(nil)
127.0.0.1:6379> setnx id "1002"
(integer) 1
127.0.0.1:6379> get id
"1002"      

1.1.4 key值的自增和自減

​incr key key​

​值自動增一

​decr key key​

​值自動減一

​incrby key increment​

​将 key 所儲存的值加上給定的增量值(increment)

​incrbyfloat key increment​

​将 key 所儲存的值加上給定的浮點增量值(increment)

​decrby key decrementkey​

​所儲存的值減去給定的減量值(decrement)

127.0.0.1:6379> set age "15"
OK
127.0.0.1:6379> get age
"15"
127.0.0.1:6379> incr age
(integer) 16
127.0.0.1:6379> incrby age 5
(integer) 21
127.0.0.1:6379> decr age
(integer) 20
127.0.0.1:6379> decrby age 5
(integer) 15
127.0.0.1:6379> incrbyfloat age 1.5
"16.5"      

1.2 使用場景

  • 緩存

    set user:1 “{id:1,name:tom,…}” ex 300

  • 計數:比如計算頁面的通路次數或者某個連結的點選次數

    set post:1 “0”

    incr post:1 …

  • 限速:限制一分鐘隻能設定5次密碼

    set pwd:1 5 ex 60

    decr pwd:1

2.哈希

Redis的鍵所對應的值本身又是一個鍵值對結構
【Redis高手修煉之路】②Redis的五大資料類型

與關系型資料庫的差別:

1.關系型資料庫是結構化的,若添加新的列,會影響到所有的行,而哈希類型是稀疏的,每個鍵可以有不同的哈希資料;

2.關系型資料庫則可以支援複雜的關系查詢

2.1 常用指令

2.1.1 添加、查詢、删除、擷取長度以及是否存在

​hset key field value​

​将哈希表 key 中的字段 field 的值設為 value

​hget key field​

​擷取存儲在哈希表中指定字段的值/td>

​hdel key field2 [field2]​

​删除一個或多個哈希表字段

​hkeys key​

​擷取所有哈希表中的字段

​hvals key​

​擷取哈希表中所有值

​hgetall key​

​擷取在哈希表中指定 key 的所有字段和值

​hlen key​

​擷取哈希表中字段的數量

​hexists key field​

​檢視哈希表 key 中,指定的字段是否存在

127.0.0.1:6379> hset user name tom age "18"
(integer) 2
127.0.0.1:6379> hget user name
"tom"
127.0.0.1:6379> hgetall user
1) "name"
2) "tom"
3) "age"
4) "18"
127.0.0.1:6379> hdel user age
(integer) 1
127.0.0.1:6379> hgetall user
1) "name"
2) "tom"
127.0.0.1:6379> hkeys user
1) "name"
127.0.0.1:6379> hlen user
(integer) 1
127.0.0.1:6379> hexists user name
(integer) 1
127.0.0.1:6379> hexists user age
(integer) 0
127.0.0.1:6379> hvals user
1) "tom"      

2.1.2 key值的增加

​hincrby key field increment​

​為哈希表 key 中的指定字段的整數值加上增量 increment

​hincrbyfloat key field increment​

​為哈希表 key 中的指定字段的浮點數值加上增量 increment

127.0.0.1:6379> hset user score "85"
(integer) 1
127.0.0.1:6379> hincrby user score 5
(integer) 90
127.0.0.1:6379> hincrbyfloat user score 1.5
"91.5"      

2.1.3 批量添加字段

​hsetnx key field value​

​在字段 field 不存在時,設定哈希表字段的值

​hmget key field1 [field2]​

​擷取所有給定字段的值

​hmset key field1 value1 [field2 value2]​

​同時将多個域值對設定到哈希表中

127.0.0.1:6379> hsetnx user grade 3
(integer) 1
127.0.0.1:6379> hmget user name age grade
1) "tom"
2) "20"
3) "3"
127.0.0.1:6379> hmset user gender M class 1
OK
127.0.0.1:6379> hgetall user
 1) "name"
 2) "tom"
 3) "age"
 4) "20"
 5) "score"
 6) "91.5"
 7) "grade"
 8) "3"
 9) "gender"
10) "M"
11) "class"
12) "1"      

2.2 三種存儲方式的差別

  • 正常的字元串

    優點:每個鍵都可以單獨設定過期時間;

    缺點:鍵占用大量記憶體,資訊内聚性差;

  • 序列化字元串

    優點︰程式設計簡單;

    缺點:全量更新(反序列化->更新->序列化);

  • 哈希類型

    優點:每個鍵都可以單獨更新;

    缺點:如果沒有控制好編碼,會消耗更多記憶體。

3.清單

1.清單是線性有序的資料結構;

2.清單中的元素是可以重複的;

3.—個清單最多能存儲232-1個元素。

3.1 常用指令

3.1.1 清單的插入、移除及查詢

​lpush key value1 [value2]​

​将一個或多個值插入到清單頭部(左插入)

​rpush key value1 [value2]​

​在清單尾部添加一個或多個值(右插入)

​rpop key​

​移除并輸出清單最後一個元素

​lpop key​

​移出并輸出清單的第一個元素

​llen key​

​擷取清單長度

​lindex key index​

​ 通過索引擷取清單中的元素

​lrange key start stop​

​擷取清單指定範圍内的元素

127.0.0.1:6379> lpush list 3 2 1
(integer) 3
127.0.0.1:6379> rpush list 4 5 6
(integer) 6
127.0.0.1:6379> lrange list 0 -1 # 相當于lrange list 0 5 ,-1表示末尾
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
127.0.0.1:6379> rpop list
"6"
127.0.0.1:6379> lpop list
"1"
127.0.0.1:6379> llen list
(integer) 4
127.0.0.1:6379> lindex list 3
"5"      

3.1.2 對已有清單進行更新、截取元素

​lrem key count value​

​根據value移除指定數量的值

​lset key index value​

​通過索引更新元素

​linsert key before|after pivot value​

​在清單的元素前或者後插入元素

​lpushx key value​

​ 将一個或多個值插入到已存在的清單頭部

​rpushx key value​

​将一個或多個值插入到已存在的清單尾部

​ltrim key start stop​

​裁剪清單元素,隻保留指定區間内的元素,不在指定區間之内的元素都将被删除。

​rpoplpush source destination​

​移除清單的最後一個元素,并将該元素添加到另一個清單并傳回

127.0.0.1:6379> lpush mylist a 1 a 2 b 3 b 4 c 5 a 6
(integer) 12
127.0.0.1:6379> lrem mylist 2 a   #删除前兩個a
(integer) 2
127.0.0.1:6379> lrange mylist 0 -1
 1) "6"
 2) "5"
 3) "c"
 4) "4"
 5) "b"
 6) "3"
 7) "b"
 8) "2"
 9) "1"
10) "a"
127.0.0.1:6379> lset mylist 1 12
OK
127.0.0.1:6379> linsert mylist before 3 111   #在3前面插入111
(integer) 11
127.0.0.1:6379> lrange mylist 0 -1
 1) "6"
 2) "12"
 3) "c"
 4) "4"
 5) "b"
 6) "111"
 7) "3"
 8) "b"
 9) "2"
10) "1"
11) "a"
127.0.0.1:6379> lpushx mylist aaa
(integer) 12
127.0.0.1:6379> rpushx mylist bbb
(integer) 13
127.0.0.1:6379> lrange mylist 0 -1
 1) "aaa"
 2) "6"
 3) "12"
 4) "c"
 5) "4"
 6) "b"
 7) "111"
 8) "3"
 9) "b"
10) "2"
11) "1"
12) "a"
13) "bbb"
127.0.0.1:6379> ltrim mylist 0 5
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "aaa"
2) "6"
3) "12"
4) "c"
5) "4"
6) "b"
127.0.0.1:6379> rpoplpush mylist newlist
"b"      

3.2 使用場景

  • 消息隊列:生産者通過lpush指令從清單左側插入元素;消費者通過brpop指令從清單右側彈出元素;
  • 内容清單:有序存儲使用者的待辦事項、收藏文章等内容;

4.集合

1.集合中的元素是無序、不可重複的,一個集合最多能存儲232-1個元素;

2.集合除了支援對元素的增删改查之外,還支援對多個集合取交集、并集、差集。

4.1 常用指令

4.1.1 添加、删除

​sadd key member1 member2​

​向集合中添加一個或多個成員

​scard key​

​擷取集合成員數

​spop key​

​移除并傳回集合中的一個随機元素

​smembers key​

​傳回集合中的所有成員

​sismember key member​

​判斷member是否是集合key的成員

​srem key member1 member2​

​移除集合中的一個或多個成員

​smove source destination member​

​将 member 元素從 source 集合移動到 destination 集合

127.0.0.1:6379> sadd myset1 a b c d e f
(integer) 6
127.0.0.1:6379> sadd myset2 d e f g h i
(integer) 6
127.0.0.1:6379> scard myset1
(integer) 6
127.0.0.1:6379> smembers myset1
1) "b"
2) "a"
3) "c"
4) "f"
5) "d"
6) "e"
127.0.0.1:6379> spop myset1 2  # 随機移除2個成員
1) "e"
2) "b"
127.0.0.1:6379> sismember myset1 c   #查詢集合中是否存在c
(integer) 1
127.0.0.1:6379> srem myset1 f #将集合中的f移除
(integer) 1
127.0.0.1:6379> smove myset1 newset a  #将a從集合myset1移動到newset
(integer) 1
127.0.0.1:6379> smembers newset
1) "a"      

4.1.2 交集、并集、差集

​sinter key1 key2返​

​回給定的集合的交集

​sunion key1 key2​

​傳回給定的集合的并集

​sdiff key1 key2​

​傳回給定的集合的差集

​sinterstore destination key1 key2​

​傳回給定的集合的交集并存到destination中

​sunionstore destination key1 key2​

​傳回給定的集合的并集并存到destination中

​sdiffstore destination key1 key2​

​傳回給定的集合的差集并存到destination中

127.0.0.1:6379> sinter myset1 myset2
1) "d"
2) "e"
127.0.0.1:6379> sunion myset1 myset2
1) "d"
2) "e"
3) "a"
4) "c"
5) "g"
6) "h"
7) "f"
8) "b"
9) "i"
127.0.0.1:6379> sdiff myset1 myset2
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> sinterstore newset1 myset1 myset2
(integer) 2
127.0.0.1:6379> smembers newset1
1) "d"
2) "e"
127.0.0.1:6379> sunionstore newset2 myset1 myset2
(integer) 9
127.0.0.1:6379> smembers newset2
1) "d"
2) "e"
3) "a"
4) "c"
5) "g"
6) "h"
7) "f"
8) "b"
9) "i"
127.0.0.1:6379> sdiffstore newset3 myset1 myset2
(integer) 3
127.0.0.1:6379> smembers newset3
1) "a"
2) "b"
3) "c"      

4.1.3 随機數

​srandmember key count​

​随機傳回集合中的一個或多個元素

127.0.0.1:6379> srandmember myset1 2 #随機傳回兩個元素
1) "b"
2) "a"
127.0.0.1:6379> srandmember myset1 
"a"
127.0.0.1:6379> srandmember myset1 
"d"      

4.2 使用場景

  • 點贊:統計一篇文章的點贊數量
  • 指令:scard like
  • 抽獎:在一組資料中随機彈出一個元素以達到抽獎的目的
  • 指令:spop user
  • 共同關注:通過求兩個集合的交集來達到目的
  • 指令:sinterstore follow follow1 follow2

5.有序集合

1.有序集合保留了集合元素不能重複的特點;

2.有序集合會給每個元素設定一個分數,并以此作為排序的依據;

3.有序集合不能包含相同的元素,但是不同元素的分數可以相同。

5.1 常用指令

5.1.1 添加、查詢

​zadd key score1 member1 score2 member2​

​向有序集合添加一個或多個成員,或者更新已存在成員的分數

​zrange key start stop [WITHSCORES]​

​通過索引區間傳回有序集合成指定區間内的成員

​zrangebyscore key min max [WITHSCORES] [LIMIT]​

​通過分數傳回有序集合指定區間内的成員

​zcount key min max​

​計算在有序集合中指定區間分數的成員數

127.0.0.1:6379> zadd scores 70 tom
(integer) 1
127.0.0.1:6379> zadd scores 80 lucy 85 lily
(integer) 2
127.0.0.1:6379> zrange scores 0 -1
1) "tom"
2) "lucy"
3) "lily"
127.0.0.1:6379> zrange scores 0 -1 withscores
1) "tom"
2) "70"
3) "lucy"
4) "80"
5) "lily"
6) "85"
127.0.0.1:6379> zrangebyscore scores 70 85 withscores
1) "tom"
2) "70"
3) "lucy"
4) "80"
5) "lily"
6) "85"
127.0.0.1:6379> zrangebyscore scores -inf 80 withscores  #負無窮到80
1) "tom"
2) "70"
3) "lucy"
4) "80"
127.0.0.1:6379> zrangebyscore scores 80 +inf withscores  #80到正無窮
1) "lucy"
2) "80"
3) "lily"
4) "85"
127.0.0.1:6379> zcount scores 70 80
(integer) 2      

5.1.2 排序、成員值的更新

​zrevrange key start stop [WITHSCORES]​

​傳回有序集中指定區間内的成員,由大到小

​zrevrangebyscore key max min [WITHSCORES]​

​傳回有序集中指定分數區間内的成員,分數由大到小

​zrank key member​

​傳回有序集合中指定成員的索引

​zscore key member​

​傳回有序集中,成員的分數值

​zincrby key increment member​

​有序集合中對指定成員的分數加上增量 increment

​zcard key​

​擷取有序集合的成員數

127.0.0.1:6379> zrevrange scores 0 -1 withscores
 1) "jery"
 2) "90"
 3) "dady"
 4) "88"
 5) "lily"
 6) "85"
 7) "lucy"
 8) "80"
 9) "tom"
10) "70"
127.0.0.1:6379> zrevrangebyscore scores 88 80
1) "dady"
2) "lily"
3) "lucy"
127.0.0.1:6379> zrank scores tom
(integer) 0
127.0.0.1:6379> zscore scores lucy
"80"
127.0.0.1:6379> zincrby scores 5 lucy
"85"
127.0.0.1:6379> zcard scores
(integer) 5
127.0.0.1:6379> zrem scores jery
(integer) 1      

5.1.3 交集

127.0.0.1:6379> zunionstore newscores 2 scores scores1 aggregate max
(integer) 5
127.0.0.1:6379> zrange newscores 0 -1 withscores
 1) "das"
 2) "56"
 3) "tom"
 4) "70"
 5) "lily"
 6) "85"
 7) "lucy"
 8) "85"
 9) "dady"
10) "88"      

5.2 使用場景

  • 排行榜:根據文章或文章的點贊數、評論數、浏覽量等的權重來統計
  • 指令zrevrange key 0 -1
  • 延時隊列:輪詢集合中的資料,根據分數判斷是否逾時,若逾時則做出處理并移除資料
  • 指令:zrange key 0 0 , zremrangebyrank key 0 0 / zpopmin