Redis 的基本數據類型 和 基礎應用場景

来源:https://www.cnblogs.com/laowenBlog/archive/2020/06/27/13198867.html
-Advertisement-
Play Games

1. 獲取中獎用戶ID,隨機彈出之後集合中就不存在了【set】 2. 存儲活動中中獎的用戶ID,保證同一個用戶不會中獎兩次【set】 3. 存儲粉絲列表,value 為粉絲的用戶ID,score 是關註時間【zset】 4. 存儲學生成績,value 為學生的ID,score 是考試成績【zset】... ...


Redis 的基礎應用場景

  1. 獲取中獎用戶ID,隨機彈出之後集合中就不存在了【set】
  2. 存儲活動中中獎的用戶ID,保證同一個用戶不會中獎兩次【set】
  3. 存儲粉絲列表,value 為粉絲的用戶ID,score 是關註時間【zset】
  4. 存儲學生成績,value 為學生的ID,score 是考試成績【zset】
  5. 記錄帖子的點贊數、評論數、和點擊率【hash】
  6. 記錄用戶的帖子ID列表,便於快速顯示用戶的帖子列表【zset】
  7. 記錄帖子的標題、摘要、作者和封面信息,用於列表展示頁【hash】
  8. 記錄帖子的點贊ID列表,評論ID列表,用於顯示和去重計數【zset】
  9. 緩存近期熱帖內容,減少資料庫壓力【hash】
  10. 記錄熱榜帖子ID列表,總熱榜和分類熱榜【zset】
  11. 收藏和貼子之間的關係【zset】
  12. 緩存用戶的歷史行為,過濾惡意行為【zset,hash】

Redis 的基本數據類型

  1. 建值對:相當於字典的 key 和 value,支持簡單的增刪改查操作。

    1. set/get/exists/del
    2. mset/mget => 批量鍵值對
    3. expire => 設置過期時間
    4. setex => 5秒後過期,set + expire
    5. setnx => 如果不存在就創建,如果存在就創建不成功
    6. incr/incrby => value是整數,可以進行自增,自增是有範圍的。
    7. 獲取所有的key:keys *
    8. 清空所有的數據: flushall
    127.0.0.1:6379> ## 單個鍵值對
    127.0.0.1:6379> ## 設置 key 為 name,value 為 laowen
    127.0.0.1:6379> set name laowen 
    OK
    127.0.0.1:6379> get name ## 獲取
    "laowen"
    127.0.0.1:6379> exists name ## 檢查是否存在
    (integer) 1
    127.0.0.1:6379> del name ## 刪除
    (integer) 1
    127.0.0.1:6379> get name ## 獲取
    (nil)
    127.0.0.1:6379> set name1 boy ## 設置
    OK
    127.0.0.1:6379> set name2 girl ## 設置
    OK
    127.0.0.1:6379> mget name1 name2  # 放回一個列表
    1) "boy"
    2) "girl"
    127.0.0.1:6379> ## 批量添加多個
    127.0.0.1:6379> mset name1 boy name2 girl name3 unknow
    OK
    127.0.0.1:6379> mget name1 name2 name3
    1) "boy"
    2) "girl"
    3) "unknow"
    127.0.0.1:6379> ## 設置過期時間
    127.0.0.1:6379> set name a
    OK
    127.0.0.1:6379> get name
    "a"
    127.0.0.1:6379> expire name 5 # 5秒後過期
    (integer) 1
    127.0.0.1:6379> get name # 不到5秒
    "a"
    127.0.0.1:6379> get name # 5秒之後
    (nil)
    127.0.0.1:6379> ## 5秒後過期,set + expire 
    127.0.0.1:6379> setex name 5  aa
    OK
    127.0.0.1:6379> get name
    "aa"
    127.0.0.1:6379> get name
    (nil)
    127.0.0.1:6379> ## 如果不存在就創建,如果存在就創建不成功
    127.0.0.1:6379> setnx name a # 如果不存在就創建
    (integer) 1
    127.0.0.1:6379> get names
    "a"
    127.0.0.1:6379> setnx name b # 如果存在就創建不成功
    (integer) 0
    127.0.0.1:6379> get name	# 沒有改變
    "a"
    127.0.0.1:6379> ## 計數
    127.0.0.1:6379> set age 20
    OK
    127.0.0.1:6379> get age 
    "20"
    127.0.0.1:6379> incr age
    (integer) 21
    127.0.0.1:6379> get age 
    "21"
    127.0.0.1:6379> incrby age 5
    (integer) 26
    127.0.0.1:6379> get age 
    "26"
    
  2. list 列表,註意它是鏈表而不是數組。

    ​ Redis的列表結構常用於做非同步隊列使用。隊列是先進先出的數據結構,常用於消息隊列和非同步邏輯處理,會確保元素的訪問順序性。

    ​ 當列表彈出最後一個元素之後,該數據結構被自動刪除,記憶體被回收。

    1. 【隊列:右進左出】

      1. rpush 尾部追加
      2. llen 獲取長度
      3. lpop 頭部刪除
      127.0.0.1:6379> ## 添加一個 books 隊列
      127.0.0.1:6379> rpush books php java net golang 
      (integer) 4
      127.0.0.1:6379> ## books 隊列尾部繼續添加內容
      127.0.0.1:6379> rpush books c
      (integer) 5
      127.0.0.1:6379> ## books 隊列尾部繼續添加內容
      127.0.0.1:6379> rpush books python
      (integer) 6
      127.0.0.1:6379> ## books 隊列尾部繼續添加內容
      127.0.0.1:6379> rpush books vue
      (integer) 7
      127.0.0.1:6379> ## 獲取 books 隊列的長度
      127.0.0.1:6379> llen books
      (integer) 7
      127.0.0.1:6379> ## 彈出 books 隊列的第一個內容
      127.0.0.1:6379> lpop books
      "php"
      127.0.0.1:6379> ## 彈出 books 隊列的第一個內容
      127.0.0.1:6379> lpop books
      "java"
      127.0.0.1:6379> ## 彈出 books 隊列的第一個內容
      127.0.0.1:6379> lpop books
      "net"
      127.0.0.1:6379> ## 彈出 books 隊列的第一個內容
      127.0.0.1:6379> lpop books
      "golang"
      127.0.0.1:6379> ## 彈出 books 隊列的第一個內容
      127.0.0.1:6379> lpop books
      "c"
      127.0.0.1:6379> ## 彈出 books 隊列的第一個內容
      127.0.0.1:6379> lpop books
      "python"
      127.0.0.1:6379> ## 彈出 books 隊列的第一個內容
      127.0.0.1:6379> lpop books
      "vue"
      127.0.0.1:6379> ## 彈出 books 隊列的第一個內容
      127.0.0.1:6379> lpop books
      (nil)
      127.0.0.1:6379>
      
    2. 【棧:右進右出】

      1. rpush 尾部追加
      2. llen 獲取長度
      3. rpop 從尾部刪除
      127.0.0.1:6379> ## 添加一個 books 棧
      127.0.0.1:6379> rpush books php java net golang 
      (integer) 4
      127.0.0.1:6379> ## 獲取 books 棧的長度
      127.0.0.1:6379> llen books
      (integer) 4
      127.0.0.1:6379> ## 彈出棧尾部的內容
      127.0.0.1:6379> rpop books
      "golang"
      127.0.0.1:6379> ## 彈出棧尾部的內容
      127.0.0.1:6379> rpop books
      "net"
      127.0.0.1:6379> ## 彈出棧尾部的內容
      127.0.0.1:6379> rpop books
      "java"
      127.0.0.1:6379> ## 彈出棧尾部的內容
      127.0.0.1:6379> rpop books
      "php"
      127.0.0.1:6379> ## 彈出棧尾部的內容
      127.0.0.1:6379> rpop books
      (nil)
      127.0.0.1:6379> 
      
    3. 【慢操作】

    4. 【快速列表】

  3. hash 哈希字典

    類似與字典,一個key對應一個value。適用於 key為標題,value為內容的存儲。當hash移除最後一個元素之後,該數據結構被自動刪除,記憶體被回收。

    1. hset key filed value 設置單個
    2. hget key filed 獲取單個
    3. hgetall key 獲取所有
    4. hdel key filed 刪除單個
    5. hlen key 獲取長度
    6. hmset key file value 批量設置
    127.0.0.1:6379> ## 設置 name 的哈希、註意 如果字元串中包含空格、需要使用引號
    127.0.0.1:6379> hset name wang wangzong
    (integer) 1
    127.0.0.1:6379> hset name wen wenzong
    (integer) 1
    127.0.0.1:6379> hset name zhang zhangzong
    (integer) 1
    127.0.0.1:6379> ## 獲取所有
    127.0.0.1:6379> hgetall name
    1) "wang"
    2) "wangzong"
    3) "wen"
    4) "wenzong"
    5) "zhang"
    6) "zhangzong"
    127.0.0.1:6379> ## 獲取長度
    127.0.0.1:6379> hlen name
    (integer) 3
    127.0.0.1:6379> ## 獲取單個
    127.0.0.1:6379> hget name wen
    "wenzong"
    127.0.0.1:6379> ## 更新單個,成功返回0
    127.0.0.1:6379> hset name wen wenzongbin
    (integer) 0
    127.0.0.1:6379> hget name wen
    "wenzongbin"
    127.0.0.1:6379> ## 更新單個,成功返回0
    127.0.0.1:6379> hset name wen xiaowen
    (integer) 0
    127.0.0.1:6379> hgetall name
    1) "wang"
    2) "wangzong"
    3) "wen"
    4) "xiaowen"
    5) "zhang"
    6) "zhangzong"
    127.0.0.1:6379> ## 批量 set
    127.0.0.1:6379> hmset name zhao zhaozong li lizong fei feizong
    OK
    127.0.0.1:6379> hgetall name
     1) "wang"
     2) "wangzong"
     3) "wen"
     4) "xiaowen"
     5) "zhang"
     6) "zhangzong"
     7) "zhao"
     8) "zhaozong"
     9) "li"
    10) "lizong"
    11) "fei"
    12) "feizong"
    127.0.0.1:6379> hget name wen
    "xiaowen"
    127.0.0.1:6379> ## 刪除單個
    127.0.0.1:6379> hdel name wen
    (integer) 1
    127.0.0.1:6379> hget name wen
    (nil)
    127.0.0.1:6379>  
    
  4. set 集合

    Redis 的集合內部是鍵值對,是無序的、唯一的。

    1. sadd key value => 添加
    2. smembers key => 獲取所有
    3. smembers key value => 檢查某個值是否存在
    4. scard key => 獲取長度
    5. spop key => 隨機彈出
    127.0.0.1:6379> ## 添加一個,不存在,返回1
    127.0.0.1:6379> sadd num 100 
    (integer) 1
    127.0.0.1:6379> ## 添加一個,存在, 返回0
    127.0.0.1:6379> sadd num 100	
    (integer) 0
    127.0.0.1:6379> ## 添加多個
    127.0.0.1:6379> sadd num 99 89 
    (integer) 2
    127.0.0.1:6379> ## 獲取所有 
    127.0.0.1:6379> ## 和插入的順序是不一致的,因為 set 是無序的
    127.0.0.1:6379> smembers num  
    1) "89"
    2) "99"
    3) "100"
    127.0.0.1:6379> ## 查詢某個值是否存在 存在返回 1
    127.0.0.1:6379> sismember num 100 
    (integer) 1
    127.0.0.1:6379> ## 查詢某個值是否存在 不存在返回 0
    127.0.0.1:6379> sismember num 90 
    (integer) 0
    127.0.0.1:6379> scard num ## 獲取長度
    (integer) 3
    127.0.0.1:6379> spop num ## 隨機彈出一個
    "100"
    127.0.0.1:6379> spop num ## 隨機彈出一個
    "89"
    127.0.0.1:6379> spop num ## 隨機彈出一個
    "99"
    127.0.0.1:6379> spop num
    (nil)
    
  5. zset 有序列表

    1. zadd key score value => 添加
    2. zrange key 範圍 => 按 score 正序列出,參數為排名範圍
    3. zrevrange key 範圍 => 按 score 逆序列出,參數為排名範圍
    4. zcard key => 獲取長度,相當於 count()
    5. zscore key value => 獲取指定 value 的 score
    6. zrank key value => 獲取指定 value 的排名
    7. zrangebyscore key 範圍 => 根據 score 範圍取值
    8. zrem key value => 刪除指定 value 的 score
    127.0.0.1:6379> ## 添加有序列表 zadd key score value
    127.0.0.1:6379> ## score:成績
    127.0.0.1:6379> ## key:fan
    127.0.0.1:6379> ## value:wen
    127.0.0.1:6379> zadd fan 100 wen
    (integer) 1
    127.0.0.1:6379> zadd fan 99 zhang
    (integer) 1
    127.0.0.1:6379> zadd fan 101 li
    (integer) 1
    127.0.0.1:6379> zadd fan 98 zhao
    (integer) 1
    127.0.0.1:6379> zadd fan 97 jin
    (integer) 1
    127.0.0.1:6379> ## zrange key 範圍
    127.0.0.1:6379> ## 按 score 正序取出;參數為範圍 
    127.0.0.1:6379> zrange fan 0 -1
    1) "jin"
    2) "zhao"
    3) "zhang"
    4) "wen"
    5) "li"
    127.0.0.1:6379> ## zrevrange key 範圍
    127.0.0.1:6379> ## 按 score 逆序取出;參數為範圍 
    127.0.0.1:6379> zrevrange fan 0 -1
    1) "li"
    2) "wen"
    3) "zhang"
    4) "zhao"
    5) "jin"
    127.0.0.1:6379> ## zcard key 獲取總數。相當於 count()
    127.0.0.1:6379> zcard fan
    (integer) 5
    127.0.0.1:6379> ## 獲取指定 value 的 score
    127.0.0.1:6379> ## zscore key value
    127.0.0.1:6379> zscore fan wen
    "100"
    127.0.0.1:6379> ## 獲取指定 value 的 排名
    127.0.0.1:6379> ## zrank key value
    127.0.0.1:6379> zrank fan wen
    (integer) 3
    127.0.0.1:6379> ## 獲取指定範圍的數據
    127.0.0.1:6379> ## zrangebyscore key 範圍
    127.0.0.1:6379> zrangebyscore fan 99 100
    1) "zhang"
    2) "wen"
    127.0.0.1:6379> ## 獲取指定範圍的數據
    127.0.0.1:6379> ## zrangebyscore key -inf inf 【只有value】
    127.0.0.1:6379> ## zrangebyscore key -inf inf withscores 【value 和 score 同時返回】
    127.0.0.1:6379> ## -inf/inf 代表 infinite,無窮大的意思,∞大
    127.0.0.1:6379> zrangebyscore fan -inf inf
    1) "jin"
    2) "zhao"
    3) "zhang"
    4) "wen"
    5) "li"
    127.0.0.1:6379> zrangebyscore fan -inf inf withscores
     1) "jin"
     2) "97"
     3) "zhao"
     4) "98"
     5) "zhang"
     6) "99"
     7) "wen"
     8) "100"
     9) "li"
    10) "101"
    127.0.0.1:6379> zrange fan 0 -1
    1) "jin"
    2) "zhao"
    3) "zhang"
    4) "wen"
    5) "li"
    127.0.0.1:6379> ## 刪除 value
    127.0.0.1:6379> ## zrem key value
    127.0.0.1:6379> zrem fan wen
    (integer) 1
    127.0.0.1:6379> zrange fan 0 -1
    1) "jin"
    2) "zhao"
    3) "zhang"
    4) "li"
    127.0.0.1:6379> 
    

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.靜態直觀的特點 靜態成員最顯著的一個特點就是它的作用域是全局的。只要在調用處引入了對應的命名空間,那麼我們可以在代碼任何地方都可以直接使用。凡是具有全局特征的東西我們就可以考慮使用靜態。在實際的開發中,靜態欄位我們常用實現數據的共用,修飾為靜態的方法當做常用的工具方法來使用。 2.命名上的思考 ...
  • 前言 之前在刷筆試題和麵試的時候經常會遇到或者被問到 try-catch-finally 語法塊的執行順序等問題,今天就抽空整理了一下這個知識點,然後記錄下來。 正文 本篇文章主要是通過舉例的方式來闡述各種情況,我這裡根據 try-catch-finally 語法塊分為兩種大情況討論:try-cat ...
  • 所謂原子性,就是事務中執行的語句要麼全部執行,要麼全部不執行,如果事務在中途發生錯誤,那麼前面執行過的語句將會回滾到事務前;一致性指的是在執行事務之前和事務執行完成後的資料庫狀態是完整的;也就是說我們執行的語句都按照我們預想的結果執行了;隔離性指資料庫允許多個併發事務同時對其數據進行讀寫和修改的能... ...
  • 語句執行過程中,由於各種原因使得語句不能正常執行,可能會造成更大錯誤或整個系統的崩潰,所以PS/SQL提供了異常(exception)著一處理的方法來防止此類情況的發生。在代碼運行的過程中無論何時發生錯誤,PL/SQL都能控製程序自動地轉向執行異常部分。 1.預定義異常 預定義異常是由於系統產生的。 ...
  • 第一種形式: decode(條件,值1,返回值1,值2,返回值2,…值n,返回值n,預設值) ​ 實現數據的彙總: 源數據: ​ 彙總後的數據:使用decode函數處理數據後對dname欄位進行彙總。 ​ 第二種形式: decode(欄位或欄位的運算,值1,值2,值3);當欄位或欄位的運算的值等於值 ...
  • 1、coalesce函數的用法 1.1 取出第一個不為空的列的數據。 ​ 1.2 coalesce函數裡面的數據類型,必須全部都跟第一列的數據類型一致。 ​ 原因為第一個參數為數值,第二個參數為字元串;可通過轉換數據類型來使用,如下圖: ​ ...
  • 函數參數:lpad( string, padded_length, [ pad_string ] ) 參數說明: string:源字元串; padded_length: 即最終結果返回的字元串的長度;如果最終返回的字元串的長度比源字元串的小,那麼此函數實際上對源串進行截取處理,與substr(str ...
  • 本博客SQL腳本地址:gitee 準備工作 已知有如下4張表: 學生表:student(學號,學生姓名,出生年月,性別) 成績表:score(學號,課程號,成績) 課程表:course(課程號,課程名稱,教師號) 教師表:teacher(教師號,教師姓名) 一、創建資料庫和表 為了演示題目的運行過程 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...