一、Redis簡介
Redis 是一個開源的使用 ANSI C 語言編寫、遵守 BSD 協議、支援網路、可基於記憶體、分散式、可選永續性的鍵值對(Key-Value)儲存資料庫,並提供多種語言的 API。
Redis 通常被稱為資料結構伺服器,因為值(value)可以是字串(String)、雜湊(Hash)、列表(list)、集合(set)和有序集合(sorted set)等型別。
二、字串(String)
1,常用指令
#常用操作 SET key value //存入字串鍵值對 MSET key value [key value ...] //批量儲存字串鍵值對 SETNX key value //當且僅當key不存在,存入value返回1;若key已存在,則不做操作返回0。 GET key //獲取一個key對應的value MGET key [key ...] //批量獲取字串鍵值 DEL key [key ...] //刪除鍵 #原子加減操作 INCR key //將key中儲存的數字值(value為string報錯)加1 DECR key //將key中儲存的數字值(value為string報錯)減1 INCRBY key n //將key中儲存的數字值加n DECRBY key n //將key中儲存的數字值減n
2,應用場景
a)單值快取
- SET key value
- GET key
b)物件快取
- SET user:1 value(json格式資料)
- MSET user:1:name zs user:1:age 18 user:2:name ls user:2:age 20
採用String型別的物件快取有兩種方式:1.直接快取整個物件的json;2.採用將key進行分離為user:ID:屬性,採用MSET儲存,用MGET獲取各屬性值。
c)分散式鎖
- set product:10001 true ex 10 nx
SET key value [EX seconds] [PX milliseconds] [NX|XX]
EX seconds :設定失效時間,單位秒
PX milliseconds:設定失效時間,單位毫秒
NX : key不存在時設定value,成功返回OK,失敗返回nil
XX : key存在時設定value,成功返回OK,失敗返回nil
設定key為product:ID過期時間為10s,如果當前key已經存在就會直接返回nil。
d)計數器
- INCR aritcle:readcount:{文章id}
- GET aritcle:readcount:{文章id}
e)分散式系統全域性序列號
- INCRBY orderId 10
三、雜湊(Hash)
1,常用命令
#hash常用操作 HSET key field value //儲存一個雜湊表key的鍵值 HSETNX key field value //儲存一個不存在的雜湊表key的鍵值 HMSET key field value [field value...] //在一個雜湊表key中儲存多個鍵值對 HGET key field //獲取雜湊表key對應的field鍵值 HMGET key field [field ...] //批量獲取雜湊表key中多個field鍵值 HDEL key field [field ...] //刪除雜湊表key中的field鍵值 HLEN key //返回雜湊表key中field的數量 HGETALL key //返回雜湊表key中所有的鍵值 HINCRBY key field n //為雜湊表key中field鍵的值加上增量n
2,應用場景
a)物件儲存
- HMSET user 1:name zs 1:age 20
- HMGET user 1:name 1:age
當需要儲存的物件不大時,可以採用固定的key,對應的field為ID:屬性,採用HMSET的方式,這樣就能將所有的物件儲存在同一個key中;
當需要儲存的物件比較大時,可以將key進行動態分離開,例如:設定key為user:序號,序號為0~1000,每個儲存物件根據id%序號,確定當前物件分配到哪個key中。
b)購物車
定義:使用者id為key,商品id為field,商品數量為value
- 新增商品:hset cart:1001 1100 1
- 新增數量:hincrby cat:1001 1100 1
- 商品總數:hlen cart:1001
- 刪除商品:hdel cart:1001 1100
- 獲取購物車所有商品:hgetall cart:1001
3,hash結構優缺點
a)優點
- 同類資料歸類整合儲存,方便資料管理
- 相比String操作消耗記憶體與cpu更小
- 相比String儲存更省空間
b)缺點
- 過期功能不能使用在field上,只能用在key上
- Redis叢集架構下不適合大規模使用(容易造成資料傾斜)
四、列表(list)
1,常用命令
#List常用操作 LPUSH key value [value ...] //將一個或多個值value插入到key列表的表頭(最左邊),最後的值在最前面 RPUSH key value [value ...] //將一個或多個值value插入到key列表的表尾(最右邊) LPOP key //移除並返回key列表的頭元素 RPOP key //移除並返回key列表的尾元素 LRANGE key start stop //返回列表key中指定區間內的元素,區間以偏移量start和stop指定,從0開始 BLPOP key [key ...] timeout //從key列表表頭彈出一個元素,沒有就阻塞timeout秒,如果timeout=0則一直阻塞 BRPOP key [key ...] timeout //從key列表表尾彈出一個元素,沒有就阻塞timeout秒,如果timeout=0則一直阻塞
2,應用場景
a)常用資料結構
- stack(棧) = LPUSH + LPOP -> FIFO
- queue(佇列) = LPUSH + RPOP
- Blocking MQ(阻塞佇列) = LPUSH + BRPOP
b)微博訊息和微信公眾號訊息
使用者A關注了公眾號B和公眾號C
- B發微博,訊息ID為1001。LPUSH msg:AID 1001
- C發微博,訊息ID為1002。LPUSH msg:AID 1002
- A檢視微博前五條。LRANGE msg:AID 0 4
五、集合(Set)
1,常用命令
#Set常用操作 SADD key member [member ...] //往集合key中存入元素,元素存在則忽略,若key不存在則新建 SREM key member [member ...] //從集合key中刪除元素 SMEMBERS key //獲取集合key中所有元素 SCARD key //獲取集合key中的元素個數 SISMEMBER key member //判斷member元素是否存在於集合key中 SRANDMEMBER key [count] //從集合key中隨機選出count個元素,元素不從key中刪除 SPOP key [count] //從集合key中隨機選出count個元素,元素從key中刪除 #Set運算操作 SINTER key [key ...] //交集運算 SINTERSTORE destination key [key ...] //將交集結果存入新集合destination中 SUNION key [key ...] //並集運算 SUNIONSTORE destination key [key ...] //將並集結果存入新集合destination中 SDIFF key [key ...] //差集運算 SDIFFSTORE destination key [key ...] //將差集結果存入新集合destination中
2,應用場景
a)微信微博點贊,收藏,標籤
- 點贊。SADD like:{訊息ID} {使用者ID}
- 取消點贊。SREM like:{訊息ID} {使用者ID}
- 檢查使用者是否點贊。SISMEMBER like:{訊息ID} {使用者ID}
- 獲取點讚的使用者列表。SMEMBERS like:{訊息ID}
- 獲取點贊使用者數。SCARD like:{訊息ID}
b)微博微信關注模型
- A關注的人:aSet -> {b,c,d}
- B關注的人:bSet -> {a,c,d,e}
- C關注的人:cSet -> {a,b,d,e,f}
- A和B共同關注的人:SINTER aSet bSet ->{c,d}
- A關注的人也關注C:A可能認識的人:SDIFF bSet aSet -> {a,e}
- SISMEMBER cSet b
- SISMEMBER cSet d
六、有序集合(sorted set)
1,常用命令
#ZSet常用操作 ZADD key score member [[score member]...] //往有序集合key中加入帶分值元素 ZREM key member [member...] //往有序集合key中刪除元素 ZSCORE key member //返回有序集合key中元素member的分值 ZINCREBY key increment member //為有序集合key中元素member的分值加上increment ZCARD key //返回有序集合key中元素個數 ZRANGE key start stop [WITHSCORES] //正序獲取有序集合key從start下標到stop下標的元素 ZREVRANGE key start stop [WITHSCORES] //倒序獲取有序集合key從start下標到stop下標的元素 #ZSet運算操作 ZUNIONSTORE destkey numberkeys key [key...] //並集計算(相同元素分值相加),numberkeys一共多少個key,WEIGHTS每個key對應的分值乘積 ZINTERSTORE destkey numberkeys key [key...] //交集計算(相同元素分值相加),numberkeys一共多少個key,WEIGHTS每個key對應的分值乘積
2,應用場景
a)微博熱搜榜
- 點選新聞:ZINCRBY hotNews:210218 1 春節零售餐飲消費超8000億元 (將當前新聞的分值加1)
- 展示當日排行前十:ZRERANGE hotNews:210218 0 9 WITHSCORES
- 七日搜尋榜單計算:ZUNIONSTORE hotNews:210212-210218 7 hotNews:210212 hotNews:210213 ... hotNews:210218
- 展示七日排行前七:ZREVRANGE hotNews:210212-210218 0 9 WITHSCORES