Redis五种数据结构应用场景
文章目錄
- 前言
- 二、字符串String
- 2.1、常用操作
- 2.2、應用場景
- 2.2.1、單值緩存(最常用)
- 2.2.2、對象緩存
- 2.2.3、分布式鎖
- 2.2.4、計數器
- 三、哈希hash
- 3.1、常用操作
- 3.2、應用場景
- 3.2.1、對象緩存
- 3.2.2、 電商購物車
- 四、列表list
- 4.1、常用操作
- 4.2、應用場景
- 4.2.1 微博和微信公號消息
- 五、 集合set
- 5.1 常用操作
- 5.2 應用場景
- 5.2.1 抽獎
- 5.2.2 微博點贊,收藏,標簽
- 5.2.3 微博微信關注模型
- 5.2.4 購物網站商品篩選
- 六、有序集合sorted set
- 6.1 常用操作
- 6.2 應用場景
- 6.2.1 微博熱搜榜
- 總結
前言
Redis作為緩存數據庫,目前在市場上占有很大的使用率,大部分人在工作中都使用到其string格式的存儲,對于剩下的數據結構卻很少使用到,Redis 基本數據結構包含:字符串(string)、 散列(hash)、 列表(list)、 集合(set)、 有序集合(sorted set)五種。這五種數據結構在我們工作中不同的場景中經常使用到,面試過程中經常被問到,因此熟練掌握這5種基本數據結構的使用和應用場景是Redis知識最基礎也是最重要的部分
二、字符串String
2.1、常用操作
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所儲存的值減去decrement2.2、應用場景
2.2.1、單值緩存(最常用)
2.2.2、對象緩存
將對象轉為json存儲
SET user:1 value(json格式數據)將對象的每個字段作為可以存儲
MSET user:1:name zhuge user:1:balance 18882.2.3、分布式鎖
SETNX product:10001 true //返回1代表獲取鎖成功 SETNX product:10001 true //返回0代表獲取鎖失敗 。。。執行業務操作 DEL product:10001 //執行完業務釋放鎖SET product:10001 true ex 10 nx //設置過期時間防止程序意外終止導致死鎖
2.2.4、計數器
文章的閱讀量、點贊量
分布式系統全局序列號,每個系統如果每次使用序號就從redis獲取,影響性能,所以每個系統每次可以批量申請N個序號供當前系統使用,使用完畢后再繼續獲取,可以提升性能
三、哈希hash
3.1、常用操作
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鍵的值加上增量increment3.2、應用場景
3.2.1、對象緩存
3.2.2、 電商購物車
以用戶id為key, 商品id為field,商品數量為value,添加購物車操作
HSET cart:1 10001 2 //用戶1:商品10001 數量2 HSET cart:1 10002 1 //用戶1:商品10002 數量1 HINCRBY cart:1 10001 1 //用戶1:商品10001 數量+1 HINCRBY cart:1 10001 -2 //用戶1:商品10001 數量-2 HLEN cart:1 //獲取用戶1購物車商品數量 HGETALL cart:1 //獲取用戶1購物車商品以及數量 hdel cart:1 10001 //刪除用戶1的10001商品
優點
1)同類數據歸類整合儲存,方便數據管理
2)相比string操作消耗內存與cpu更小
3)相比string儲存更節省空間
缺點
過期功能不能使用在field上,只能用在key上
Redis集群架構下不適合大規模使用(key相同的經過hash后只會落在其中一臺機器上)
四、列表list
4.1、常用操作
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指定 LINSERT key BEFORE|AFTER pivot element // 在元素element前后插入pivot LREM key count element //根據參數 COUNT 的值,移除列表中與參數 VALUE 相等的元素 count > 0 : 從表頭開始向表尾搜索,移除與 VALUE 相等的元素,數量為 COUNT //count < 0 : 從表尾開始向表頭搜索,移除與 VALUE 相等的元素,數量為 COUNT 的絕對值。 //count = 0 : 移除表中所有與 VALUE 相等的值。 BLPOP key [key ...] timeout //從key列表表頭彈出一個元素,若列表中沒有元素,阻塞等待 timeout秒,如果timeout=0,一直阻塞等待 BRPOP key [key ...] timeout //從key列表表尾彈出一個元素,若列表中沒有元素,阻塞等待 timeout秒,如果timeout=0,一直阻塞等待4.2、應用場景
Stack(棧FILO) = LPUSH + LPOP Queue(隊列FIFO)= LPUSH + RPOP Blocking MQ(阻塞隊列)= LPUSH + BRPOP4.2.1 微博和微信公號消息
如上圖公眾號:我訂閱了阿里云云棲號(id10001)、新華網(id10002)、infoQ(id10003)等
1、首先在msg:1列表中增加10001、10002、10003 ,以及各個用戶對應的消息
2、此時10002發送一條消息 id : 11 ,首先在我訂閱的集合中移除10002,然后在最前面加入10002,然后在msg中加入11
LREM sub:1 0 10002 LPUSH sub:1 10002 LPUSH msg:10002 11五、 集合set
5.1 常用操作
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中刪除SINTER key [key ...] //交集運算 SINTERSTORE destination key [key ..] //將交集結果存入新集合destination中 SUNION key [key ..] //并集運算 SUNIONSTORE destination key [key ...] //將并集結果存入新集合destination中 SDIFF key [key ...] //差集運算 SDIFFSTORE destination key [key ...] //將差集結果存入新集合destination中5.2 應用場景
5.2.1 抽獎
5.2.2 微博點贊,收藏,標簽
- 點贊
- 取消點贊
- 檢查用戶是否點過贊
5.2.3 微博微信關注模型
劉昊然關注:張杰、劉濤、王寶強
SADD follow:lhr zj lt wbq張杰關注:劉昊然、劉濤、王寶強、王瀧正、謝娜、胡歌
SADD follow:zj lhr lt wbq wlz xl hg劉濤關注:劉昊然、張杰、陳奕迅、許嵩
SADD follow:lt lhr zj cyx xs模型1:共同關注
劉昊然和張杰關注的人
模型2:我關注的人中也有關注
劉昊然關注的人也在關注胡歌
模型2:可能感興趣的人
劉昊然訪問張杰主頁,會推薦感興趣的人,張杰關注的人去且不在劉昊然關注中可以推薦
5.2.4 購物網站商品篩選
SADD brand:huawei P30 //華為品牌集合中 p30 SADD brand:xiaomi mi-6X //小米品牌集合中 mi-6X SADD brand:iPhone iphone8 //蘋果品牌集合中 iphone8 SADD os:android P30 mi-6X //安卓系統集合中 P30 mi-6X SADD cpu:brand:intel P30 mi-6X //cpu 英特爾集合中 P30 mi-6X SADD ram:8G P30 mi-6X iphone8 //8G內存集合中 P30 mi-6X iphone8查找內存為8G,英特爾CPU和安卓系統的手機:
SINTER os:android cpu:brand:intel ram:8G六、有序集合sorted set
6.1 常用操作
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 key start stop [WITHSCORES] //倒序獲取有序集合key從start下標到stop下標的元素ZUNIONSTORE destkey numkeys key [key ...] //并集計算 ZINTERSTORE destkey numkeys key [key …] //交集計算6.2 應用場景
6.2.1 微博熱搜榜
以每天熱搜新聞為一個集合,當天當一個用戶點擊一個話題后,分值+1
點擊新聞
- 展示當日排行前十
- 2日搜索榜單計算
- 展示2日排行前十
總結
通過本文,大家對Redis五種數據結構有了更多的了解,包括在實際場景中的使用,希望能幫助大家解決實際工作中的問題,后續也會更新Redis架構相關的文章。 如有幫助,感謝關注
總結
以上是生活随笔為你收集整理的Redis五种数据结构应用场景的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java并发——线程安全
- 下一篇: php如何将mysql数据库中的admi