日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Redis五种数据结构应用场景

發布時間:2025/3/12 数据库 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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所儲存的值減去decrement

2.2、應用場景

2.2.1、單值緩存(最常用)

2.2.2、對象緩存

將對象轉為json存儲

SET user:1 value(json格式數據)

將對象的每個字段作為可以存儲

MSET user:1:name zhuge user:1:balance 1888

2.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鍵的值加上增量increment

3.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 + BRPOP

4.2.1 微博和微信公號消息


如上圖公眾號:我訂閱了阿里云云棲號(id10001)、新華網(id10002)、infoQ(id10003)等
1、首先在msg:1列表中增加10001、10002、10003 ,以及各個用戶對應的消息

LPUSH sub:1 10001 10002 10003LPUSH msg:10001 1 2 3 LPUSH msg:10002 4 5 6 LPUSH msg:10003 8 9

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 抽獎

  • 參與抽獎
  • SADD luck:1001 100001 //將用戶100001 加入商品1001 的參與池子中
  • 查看參與抽獎所有用戶
  • SMEMBERS luck:1001
  • 抽取1名中獎者
  • SPOP luck:1001 1

    5.2.2 微博點贊,收藏,標簽

    • 點贊
    SADD like:1 1001
    • 取消點贊
    SREM like:1 1001
    • 檢查用戶是否點過贊
    SISMEMBER like:1 1001

    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:共同關注
    劉昊然和張杰關注的人

    SINTER follow:lhr follow:zj


    模型2:我關注的人中也有關注
    劉昊然關注的人也在關注胡歌

    SISMEMBER follow:zj hg SISMEMBER follow:lt hg SISMEMBER follow:wbq hg

    模型2:可能感興趣的人
    劉昊然訪問張杰主頁,會推薦感興趣的人,張杰關注的人去且不在劉昊然關注中可以推薦

    SDIFF follow:zj follow:lhr


    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
    點擊新聞

    ZINCRBY hotnews:20220201 1 dawmll //2022-02-01 點擊冬奧我們來了+1 ZINCRBY hotnews:20220201 1 gtljp //2022-02-01 點擊高亭宇金牌+1
    • 展示當日排行前十
    ZREVRANGE hotnews:20220201 0 10 WITHSCORES [WITHSCORES]
    • 2日搜索榜單計算
    ZUNIONSTORE newhots 2 hotnews:20220201 hotnews:20220202 //將2個幾個中的相同的值的分數相加,將結果放到newhots 中

    • 展示2日排行前十
    ZREVRANGE newhots 0 10 //從上面統計的新的集合中取出前10


    總結

    通過本文,大家對Redis五種數據結構有了更多的了解,包括在實際場景中的使用,希望能幫助大家解決實際工作中的問題,后續也會更新Redis架構相關的文章。 如有幫助,感謝關注

    總結

    以上是生活随笔為你收集整理的Redis五种数据结构应用场景的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。