目錄
- 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的鍵所對應的值本身又是一個鍵值對結構
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yMwYDM3IWYlNDOwgzYjZjZyYzX2EjN1UDMzEzLchDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
與關系型資料庫的差別:
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