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
  • 1. 說明 /* Performs operations on System.String instances that contain file or directory path information. These operations are performed in a cross-pla ...
  • 視頻地址:【WebApi+Vue3從0到1搭建《許可權管理系統》系列視頻:搭建JWT系統鑒權-嗶哩嗶哩】 https://b23.tv/R6cOcDO qq群:801913255 一、在appsettings.json中設置鑒權屬性 /*jwt鑒權*/ "JwtSetting": { "Issuer" ...
  • 引言 集成測試可在包含應用支持基礎結構(如資料庫、文件系統和網路)的級別上確保應用組件功能正常。 ASP.NET Core 通過將單元測試框架與測試 Web 主機和記憶體中測試伺服器結合使用來支持集成測試。 簡介 集成測試與單元測試相比,能夠在更廣泛的級別上評估應用的組件,確認多個組件一起工作以生成預 ...
  • 在.NET Emit編程中,我們探討了運算操作指令的重要性和應用。這些指令包括各種數學運算、位操作和比較操作,能夠在動態生成的代碼中實現對數據的處理和操作。通過這些指令,開發人員可以靈活地進行算術運算、邏輯運算和比較操作,從而實現各種複雜的演算法和邏輯......本篇之後,將進入第七部分:實戰項目 ...
  • 前言 多表頭表格是一個常見的業務需求,然而WPF中卻沒有預設實現這個功能,得益於WPF強大的控制項模板設計,我們可以通過修改控制項模板的方式自己實現它。 一、需求分析 下圖為一個典型的統計表格,統計1-12月的數據。 此時我們有一個需求,需要將月份按季度劃分,以便能夠直觀地看到季度統計數據,以下為該需求 ...
  • 如何將 ASP.NET Core MVC 項目的視圖分離到另一個項目 在當下這個年代 SPA 已是主流,人們早已忘記了 MVC 以及 Razor 的故事。但是在某些場景下 SSR 還是有意想不到效果。比如某些靜態頁面,比如追求首屏載入速度的時候。最近在項目中回歸傳統效果還是不錯。 有的時候我們希望將 ...
  • System.AggregateException: 發生一個或多個錯誤。 > Microsoft.WebTools.Shared.Exceptions.WebToolsException: 生成失敗。檢查輸出視窗瞭解更多詳細信息。 內部異常堆棧跟蹤的結尾 > (內部異常 #0) Microsoft ...
  • 引言 在上一章節我們實戰了在Asp.Net Core中的項目實戰,這一章節講解一下如何測試Asp.Net Core的中間件。 TestServer 還記得我們在集成測試中提供的TestServer嗎? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。 ...
  • 在發現結果為真的WHEN子句時,CASE表達式的真假值判斷會終止,剩餘的WHEN子句會被忽略: CASE WHEN col_1 IN ('a', 'b') THEN '第一' WHEN col_1 IN ('a') THEN '第二' ELSE '其他' END 註意: 統一各分支返回的數據類型. ...
  • 在C#編程世界中,語法的精妙之處往往體現在那些看似微小卻極具影響力的符號與結構之中。其中,“_ =” 這一組合突然出現還真不知道什麼意思。本文將深入剖析“_ =” 的含義、工作原理及其在實際編程中的廣泛應用,揭示其作為C#語法奇兵的重要角色。 一、下劃線 _:神秘的棄元符號 下劃線 _ 在C#中並非 ...