對redis的實戰理解

来源:https://www.cnblogs.com/pzistart/archive/2022/10/26/16828265.html
-Advertisement-
Play Games

我國目前並未出台專門針對網路爬蟲技術的法律規範,但在司法實踐中,相關判決已屢見不鮮,K 哥特設了“K哥爬蟲普法”專欄,本欄目通過對真實案例的分析,旨在提高廣大爬蟲工程師的法律意識,知曉如何合法合規利用爬蟲技術,警鐘長鳴,做一個守法、護法、有原則的技術人員。 案情介紹 2018年10月,北京市公安局海 ...


把黑馬的redis實戰看了將近一半,自己也做了挺多思考,現在對於Redis的使用,以及業務方面的思考,有了更深刻的理解。

  • 使用緩存能夠加快數據的查詢速度,提高用戶的使用感受,對於經常需要訪問的數據,都可以放到緩存中,這樣也能給資料庫減少壓力。

但是,使用緩存之後,就有許多問題需要解決,包括業務場景的考慮。

1. 緩存和資料庫一致性的問題
  • 這個問題是確保用戶能夠從緩存中訪問到最新的數據。
    -- 一般需要考慮的場景就是:更新了資料庫,那麼我們的緩存也要更新。否則用戶去查數據走緩存,那麼拿到的數據就可能是假的。
  • 如何去更新也是有技巧,能夠確保不做過多的無效操作,也要確保用戶能拿到最新數據。
  • 根據學習,我理解的就是採用:先更新資料庫,再刪除緩存這麼一個策略
    -- 相較於每次更新完資料庫都去更新緩存。這個策略就能避免很多無效的寫操作。也能確保緩存是最新的(這其中就涉及到一些併發的業務邏輯)。
2. 緩存擊穿問題
  • 這個問題就是熱點key失效了,而重構這個key又需要比較久的時間。
    -- 而在這個重構的時間段裡面,如果併發訪問數據,那麼就又會給資料庫造成很大壓力。
  • 如何去解決這個問題。我理解的就是加鎖。
    -- 如果用戶進來查詢數據,後臺發現未命中緩存,那麼就去嘗試獲取鎖,而這個鎖,是redis中的一個分散式鎖,setnx這個命令。拿到了鎖,那麼就去執行緩存重建邏輯。
    -- 而如果這時候,其他用戶也進來查數據,此時肯定拿不到鎖,那麼就會休眠一會,然後嘗試重新去查詢數據。
  • 這就是1一個解決方案,這個方案能避免給資料庫造成很大壓力,但是也可能會影響用戶體驗,因為需要進行等待。
  • 還有一個解決方案就是邏輯超時,也就是不給key設置過期時間,但是給他設置一個邏輯超時時間,這個方案的話就是給k-v的v中存儲一個key的有效期。這個方式的話,在緩存重建之前,用戶會拿到臟數據。
  • 還得根據具體業務去選擇
3. 緩存穿透問題
  • 這個問題就是客戶端發來了很多請求,但是這些請求需要的數據在緩存、資料庫都沒有,給資料庫造成了很大的壓力。
  • 解決方案:1.緩存空數據 2.布隆過濾器(對這個不是很瞭解,沒用過)
4. 緩存雪崩問題
  • 這個問題是redis宕機,或者說大量的key失效
  • 解決方案:搭建redis集群

分析一個具體的業務場景
用戶搶優惠券,要滿足條件:一人一單
要考慮併發時出現的問題。
1.首先要查該用戶是否有券,如果沒有就能讓它去搶,否則就不允許
2.如果該用戶沒券,就去執行搶券邏輯

在查券的時候,如果同一個用戶發來了很多請求,這是一個併發問題。
如果說線程1判斷無券,那麼就去執行搶券邏輯。如果這時候線程2進來了,也會判斷無券,又會執行它的搶券邏輯。
所以需要加一個鎖,即使同一個用戶發來多次請求,此時也是串列的,只有等他執行完搶券邏輯,才會釋放鎖。那麼如果該用戶的其他的搶券請求進來,也不會去執行搶券。
同時,搶券邏輯也在這個鎖的鎖定範圍內,也避免了超賣的問題。

這裡的鎖需要使用分散式鎖,比如redis的setnx()。

分析:我們採用的鎖對象是,user.getId()。在單體項目之下,對於一個用戶的多個請求進來,該鎖對象確實是唯一的。

但是如果將該項目做成集群的形式,由於每個Tomcat都有自己的JVM,那麼此時的鎖就不是同一吧了,而是這台伺服器認為他的這把鎖是唯一的,那台伺服器認為他的這把鎖是唯一的。這樣子就做不到唯一鎖。所以我們這裡需要使用分散式鎖。

但是分散式鎖也會遇到一些問題,比如說誤刪鎖問題,以及刪鎖時的原子性問題。


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

-Advertisement-
Play Games
更多相關文章
  • 泛型 泛型定義 Scala的泛型和Java中的泛型表達的含義都是一樣的,對處理的數據類型進行約束,但是Scala提供了更加強大的功能 scala中的泛型採用中括弧 scala中的泛型是不可變的 泛型和類型不是一個層面的東西 所以scala中泛型和類型無法聯合使用 泛型語法 如果能將類型和泛型當成一個 ...
  • 核心功能點 【1】服務註冊:Nacos Client會通過發送REST請求的方式向Nacos Server註冊自己的服務,提供自身的元數據,比如ip地址、埠等信息。Nacos Server接收到註冊請求後,就會把這些元數據信息存儲在一個雙層的記憶體Map中。 【2】服務心跳:在服務註冊後,Nacos ...
  • 1、項目模塊介紹 2、 父項目 主要依賴 spring-cloud 的 版本控制 <properties> <!-- springCloud 版本 --> <scd.version>Dalston.SR4</scd.version> </properties> <dependencyManageme ...
  • RabbitMQ安裝說明文檔(超詳細版本) 1. 安裝依賴環境 線上安裝依賴環境: yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c++ kernel-devel m4 n ...
  • 在服務端開發中,緩存常常被當做系統性能扛壓的不二之選。在實施方案上,緩存使用策略雖有一定普適性,卻也並非完全絕對,需要結合實際的項目訴求與場景進行綜合權衡與考量,進而得出符合自己項目的最佳實踐。 ...
  • 折騰好 Wordpress,開始安裝插件了,結果直接報錯 Installation failed: Could not create directory 當時站點健康工具(Site Health)里的文件系統許可權(Filesystem Permissions) 全是 Not Writable 搜了一 ...
  • 隱式轉換 精度小的類型可以自動轉換為精度大的類型,這個轉換過程無需開發人員參與,由編譯器自動完成,這個轉換操作我們稱之為隱式轉換。 如果程式編譯出錯,編譯器會嘗試在整個的作用域中查找能夠讓程式編譯通過的方式 如果找到,那麼編譯器會嘗試二次編譯,讓之前編譯出現錯誤的代碼經過轉換後能夠編譯通過。 這個轉 ...
  • 回答: 我們為什麼要學習源碼? 1、知其然知其所以然 2、站在巨人的肩膀上,提高自己的編碼水平 3、應付面試 1.1 Spring源碼閱讀小技巧 1、類層次藏得太深,不要一個類一個類的去看,遇到方法該進就大膽的進 2、更不要一行一行的去看,看核心點,有些方法並不重要,不要跟它糾纏 3、看不懂的先不看 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...