2021-05-12 14:32:11
阿里面試常問的redis資料結構,建議收藏
2021-01-25 13:00:07
關於Redis
redis是一個開源的使用C語言編寫的一個kv儲存系統,是一個速度非常快的非關係遠端記憶體資料庫。它支援包括String、List、Set、Zset、hash五種資料結構。除此之外,通過複製、持久化和使用者端分片等特性,使用者可以很方便地將redis擴充套件成一個能夠包含數百GB資料和每秒處理上百萬次的請求的系統。目前支援多種語言的api,方便使用者使用。
redis同時也內建了事務、LUA指令碼、複製等功能,提供兩種持久化選項,一種是每隔一段時間將資料匯入到磁碟(快照模式),另一種是追加命令到紀錄檔中(AOF模式)。如果只是作為高效的記憶體資料庫使用也可以關閉持久化功能。通過哨兵(sentinel)和自動分割區(Cuuster)的方式可以提高redis伺服器的高可用性。
與關係型資料庫相比,redis的命令請求不需要經過查詢分析器或查詢優化器進行處理,也避免了更新資料時引起的隨機讀寫,這些慢操作。它直接讀寫記憶體中的資料,並且資料是按照一定的資料結構儲存的。所以它的速度非常快。
Redis五種資料結構如下:
- 字串(string)
- 雜湊(hash)
- 列表(list)
- 集合(set)
- 有序集合(zset)
對redis來說,所有的key(鍵)都是字串。
字串string
string基本操作
字串string是redis的基本操作型別,一個key對應一個value。並且字串string型別是二進位制安全,也就是說string可以包含任何資料型別,比如圖片,數位,字串等。
- 字串常用操作
SET key value //存入字串鍵值對
MSET key value [key value ...] //批次儲存字串鍵值對
SETNX key value //存入一個不存在的字串鍵值對
GET key //獲取一個字串鍵值
MGET key [key ...] //批次獲取字串鍵值
DEL key [key ...] //刪除一個鍵
EXPIRE key seconds //設定一個鍵的過期時間(秒)
- 原子加減
INCR key //將key中儲存的數位值加1
DECR key //將key中儲存的數位值減1
INCRBY key increment //將key所儲存的值加上increment
DECRBY key decrement //將key所儲存的值減去decrement
string使用場景
- 統計功能(統計網站的存取人數)
- web叢集session共用
- 單值快取
set key value
get key
- 單個物件快取
set user:1 value(json資料)
- 批次物件快取
mset user:1:name memo user:1:age 1
mget user:1:name user:1:age
- 分散式鎖
setnx product:10001 true // 返回1代表獲取鎖成功
setnx product:10001 false // 返回0代表獲取鎖失敗
// do...
del product:10001 // 執行完業務刪除鎖
set product:10001 true ex 10 nx //防止程式意外終止導致死鎖(獲取鎖命令+鎖過期命令合二為一)
雜湊hash
hash常用操作
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 increment //為雜湊表key中field鍵的值加上增量increment
hash使用場景
電商購物車實現原理
- 電商購物車
- 以使用者id為key
- 商品id為field
- 商品數量為value
- 購物車操作
- 新增商品
hset cart:1001 1008 1 --> hset 使用者id 商品id 商品數量
- 增加數量
hincrby cart:1001 1008 1 --> hincrby 使用者id 商品id 增加基數
- 商品總數
hlen cart:1001 --> hlen 使用者id
- 刪除商品
hdel cart:1001 1008 --> hdel 使用者id 商品id
- 獲取購物車所有商品
hgetall cart:1001 --> hgetall 使用者id
hash優缺點
- 優點
- 同類資料歸類整合儲存,方便資料管理
- 相比string操作消耗記憶體與cpu更小
- 相比string儲存更節省空間
- 缺點
- 過期功能不能使用在field上,只能用在key上
- redis叢集架構下不適合大規模使用
列表list
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指定
BLPOP key [key ...] timeout //從key列表表頭彈出一個元素,若列表中沒有元素,阻塞等待 timeout秒,如果timeout=0,一直阻塞等待
BRPOP key [key ...] timeout //從key列表表尾彈出一個元素,若列表中沒有元素,阻塞等待 timeout秒,如果timeout=0,一直阻塞等待
使用list構造資料結構
- Stack(棧)= lpush+lpop -> FIFO(先進後出,後進先出)
- Queue(佇列)=lpush+rpop
- Blocking MQ(阻塞佇列)=LPUSH+BRPOP
List應用場景
- 微信公眾號訊息
memocoding關注了MacTalk,備胎說車等大V
- MacTalk發微博,訊息ID為10018
LPUSH msg:{memocoding-ID} 10018
- 備胎說車發微博 訊息ID 為10086
LPUSH msg:{memocoding-ID} 10086
- 檢視最新微博訊息
LRANGE msg:{memocoding-ID} 0 5
集合set
常用操作
- Set常用操作
SADD key member [member ...] // 往集合key中存入元素 元素存在則忽略 若key不存在則新建
SREM key member [member ...] // 從集合key中刪除元素
SMEMBERS 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 ...] // 並集運算
SUNION destination key [key ...] // 將並集結果存入新集合destination中
SDIFF key [key ...] // 差集運算
SDIFFSTORE destination key [key ...] // 將差集結果存入新集合destination中
set應用場景
微信小程式抽獎活動
- 點選參與抽獎加入集合
SADD key {userID}
- 檢視參與抽獎所有使用者
SMEMBERS key
- 抽取count名中獎者
SRANDMEMBER key [count] // 從集合key中選取count元素,元素不從key中刪除
SPOP key [count] //從集合key中選取count元素 元素從key中刪除
微信微博點贊 收藏 標籤
- 點贊
SADD like:{訊息ID} {使用者ID}
- 取消點贊
SREM like:{訊息ID} {使用者ID}
- 檢查使用者是否點贊
SISMEMBER like:{訊息ID} {使用者ID}
- 獲取點讚的使用者列表
SMEMBERS like:{訊息ID}
- 獲取點贊使用者數
SCARD like:{訊息ID}
有序集合zset
資料結構
- ZSet 常用操作
ZADD key score member [[score member] ...] // 往有序集合key中加入帶分值元素
ZREM key member [member ...] // 從有序集合key中刪除元素
ZScore key member // 返回有序集合key中元素member的分值
ZINCRBY key increment member // 為有序集合key中元素member的分值加上increment
ZCARD key // 返回有序集合key中元素個數
ZRANGE key start stop [WITHSCORES] // 正序獲取有序集合key從start下標到stop下標的元素
ZREVRANGE start stop [WITHSCORES] // 倒序獲取有序集合key從start下標到stop下標的元素
- ZSet集合操作
ZUNIONSTORE destkey numkeys key [key ...] // 並集計算 destkey: 新生成集合 numkeys:後面所有key的集合數量
ZINTERSTORE destkey numkeys key [key ...] // 交集計算
zset應用場景
-
ZSet集合操作實現排行榜
-
點選新聞
ZINCRBY hostNews:20190819 1 守護香港
- 展示當日排行前十
ZREVRANGE hostNews:20190819 0 9 WITHSCORES
- 七日搜尋榜單計算
ZUNIONSTORE hostNews:20190813-20190819 7
hostNews:20190813 hostNews:20190814 ... hostNews:20190819
- 展示七日排行前十
ZREVRANGE hostNews:20190813-20190819 0 9 WITHSCORES
文章也會持續更新,可以微信搜尋「 邁莫coding 」第一時間閱讀。
相關文章