極簡Redis速成學習

redis是什么?

是一種以鍵值對形式存儲的數據庫,特點是基于內存存儲,讀寫快,性能高,常用于緩存、消息隊列等應用情境

redis的五種數據類型是什么?

分別是String、Hash、List、Set和Zset(操作命令很多這里只寫部分關鍵的,其他查一查即可)

①String類型



redis中最基本的數據結構,key是String類型,value可以存儲字符串、整型或浮點數

SET <KEY> <VALUE>    //寫入
GET <KEY>    //讀取
②Hash類型?



在value部分提供了一個field作為value的鍵,因此一個Hash可以存儲多個字段和對應的值,適合用來存儲對象

HSET <KEY> <FIELD> <VALUE>    //寫入
HGET <KEY> <FIELD>        //讀取
③List類型

有序可重復,相當于LinkedList,可以從列表的兩端進行插入或刪除

LPUSH <KEY> <ELEMENT>    //從列表左邊插入
LPOP <KEY>        //移除左側第一個元素
右側同理,用RPUSH和RPOP
④Set類型

無序不重復

SADD <KEY> <MEMBER>...     //添加一個或多個
SREM <KEY> <MEMBER>...     //刪除一個或多個
SCARD <KEY>      //返回元素個數
⑤Zset類型

有序集合,每個元素都帶有一個score屬性,用score來排序

ZADD <KEY> <SCORE> <MEMBER>...     //添加一個或多個
ZREM <KEY> <MEMBER>...     //刪除一個或多個
ZSCORE <KEY> <MEMBER>      //獲取指定元素的score值

在Java中怎么使用redis?

我們會用RedisTemplate

使用方法:
①導入依賴

<!--Redis-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--連接池依賴-->
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId>
</dependency>

②在application.yml中配置redis

spring:redis:host:127.0.0.1  # Redis服務器地址port:6379   # Redis服務器連接端口password:    # Redis服務器連接密碼(默認為空)lettuce:pool:max-active:8  #最大連接max-idle:8  #最大空閑連接min-idle:0   #最小空閑連接max-wait:100  #連接等待時間

③在你要的文件中注入RedisTemplate

@Autowired
private RedisTemplate redisTemplate

?④代碼實例

redisTemplate.opsForValue.set(key,value);   //存
String id = redisTemplate.opsForValue.get(key);   //取
redisTemplate.delete(key);    //刪除

可以在存數據的時候設置超時時間,避免因為只存出現內存不足的情況(如果不引入超時刪除,就會出現redis只存不刪的情況,時間長了內存會爆)

redisTemplate.opsForValue.set(key,value,超時時間,超時單位);   //存

可以給已有的鍵值對設置過期時間

redisTemplate.expire(key,超時時間,超時單位);   

提示:key可以用 : 來分隔,這樣可以清楚層級,比如 login:user:code

?

Redis作用


一、redis+session登錄校驗

二、緩存數據?


優點:降低后端負端,提高讀寫效率和性能,更好應對高并發
以前的項目中我們是直接訪問數據庫,眾所周知mysql的性能很差,那我們就可以引入redis作為緩存,當用戶發起請求時,我們可以先去redis看看有沒有對應的數據,如果有我們就直接取用,不用訪問數據庫了;如果沒有我們才去數據庫取,同時把讀取到的數據寫入redis,方便下一次取用

但是會有一個問題:如果redis或者mysql其中一個地方的數據發生更改,沒有通知另一個,就會出現redis中的數據和數據庫中的數據不一致,也就是redis和數據庫的緩存一致性問題

為了解決緩存一致性問題,我們可以使用緩存更新策略?

第一種是內存淘汰,就是redis中存太多了它會自動殺掉
第二種是超時剔除,就是前面的給緩存設置超時時間
第三種是主動更新,就是我們手動添加邏輯,一致性最好,但是也最麻煩
因此我們常常采用主動更新策略,里面又有三種

第一種是旁路緩存,也是最常用的方法:讀操作先找緩存,沒有再找數據庫,然后把數據保存到緩存;寫操作就是在更新數據庫后刪除緩存。這樣操作相對最少出問題

第二種是讀寫穿透,將緩存和數據庫整合成一個服務。調用者只需與緩存交互,讀操作緩存未命中時,服務從數據庫加載數據并寫入緩存;寫操作時,服務先更新緩存,再同步更新數據庫,但是實現難一點,而且對數據庫要求高

第三種是異步寫回,調用者只操作緩存,然后緩存再異步更新到數據庫中,有可能出現一致性問題

三、緩存穿透等問題

(1)緩存穿透

緩存穿透就是指用戶請求的數據在緩存和數據庫中都不存在(比如亂傳一個id),那么因為緩存沒有這個數據,每次請求都會打到數據庫,然后數據庫返回一個null;如果有人故意大量制造這樣的請求,就會有大量的請求直接打到數據庫,導致數據庫崩潰,這就是緩存穿透問題

解決緩存穿透有主要兩種方法:

緩存空對象,如果用戶請求一個在緩存和數據庫中都不存在的數據,那就緩存null值,當下一次再請求,就直接返回null。但我覺得沒什么鳥用因為只要請求一直換他就要在redis一直新增緩存直接爆炸

布隆過濾 在請求到達緩存前,先用布隆過濾器進行判斷,存在就放行,不存在就拒絕

其余方法有加強權限校驗,設置限流等

(2)緩存雪崩

緩存雪崩是指同一時間大量的key失效或者redis直接宕機導致大量的請求直接打到數據庫

解決方法:

① 給不同的key添加不同的TTL隨機值
② 用redis集群 主從機制 哨兵檢測 主掛了就換一個從上
③ 使用多級緩存
④ 做限流

(3)緩存擊穿

緩存擊穿是指某些被大量訪問且緩存重建復雜的熱點key失效了,導致大量的請求直接打到數據庫

解決方法:

①互斥鎖

當大量請求來到時,只讓第一個到達的線程進行緩存的重建,此時其余請求會被卡住,直到這個緩存重建完成,優點是返回的數據是準確的,缺點是性能差
對于第一個線程:獲得互斥鎖,進行緩存重建
對于后面的線程:獲取不到互斥鎖,休眠,過段時間重試

②邏輯過期

熱點key永不過期,但是要設置一個過期時間的字段(不是設置過期時間)。當請求到達時會根據過期時間的字段進行判斷,如果過期了,那就用互斥鎖,創建一個新的線程單獨負責緩存的重建,而它和其余線程直接返回當前key的數據(也就是錯誤的舊數據),優點是線程無需等待性能好,缺點是數據一致性差
對于第一個線程:判斷緩存是否過期,如果過期,獲得互斥鎖,新建一個進程進行緩存重建,自己先返回舊的數據
對于后面的線程:獲取不到互斥鎖,直接先返回舊的數據

提示:在獲取到鎖后最好再進行一次判斷

(4)超賣問題

超賣問題就是比如有一個秒殺活動,此時大量的線程發起購買請求,線程a查到庫存為1,線程b查到庫存也為1,然后線程a調用請求會讓庫存 -1,而線程b不知道(因為查到的庫存為1),所以也會讓庫存 -1,本來庫存只有1,現在卻觸發了兩次扣減庫存,讓庫存為 -1,這就是超賣問題

解決方法:加鎖

①悲觀鎖

悲觀指認為線程安全問題一定會發生。因此在操作數據之前需要先獲取鎖,讓這些線程串行執行,優點是不出錯,缺點是性能差
synchronized、lock都屬于悲觀鎖

②樂觀鎖

樂觀指認為線程安全問題不一定發生,不加鎖,只在數據進行更新操作時檢查在此期間數據是否被更改
樂觀鎖的方法通常會給數據額外引入一個標識(比如版本號或者時間戳)來標記數據是否被更改
對于一個線程來說,去更新時發現如果數據已被更改就更新失敗;否則更新成功

但是這些只在單一服務下好用,多集群就失效了,要用分布式鎖

四、Redis分布式鎖

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/72374.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/72374.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/72374.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大語言模型學習--本地部署DeepSeek

本地部署一個DeepSeek大語言模型 研究學習一下。 本地快速部署大模型的一個工具 先根據操作系統版本下載Ollama客戶端 1.Ollama安裝 ollama是一個開源的大型語言模型&#xff08;LLM&#xff09;本地化部署與管理工具&#xff0c;旨在簡化在本地計算機上運行和管理大語言模型…

【OpenCV C++】以時間命名存圖,自動檢查存儲目錄,若不存在自動創建, 按下空格、回車、Q、S自動存圖

文章目錄 // 保存圖像的函數 void saveImage(const cv::Mat& frame) {// 生成唯一文件名auto now = std::chrono::system_clock::

【JavaEE】線程安全

【JavaEE】線程安全 一、引出線程安全二、引發線程安全的原因三、解決線程安全問題3.1 synchronized關鍵字&#xff08;解決修改操作不是原子的&#xff09;3.1.1 synchronized的特性3.1.1 synchronized的使用事例 3.2 volatile 關鍵字&#xff08;解決內存可見性&#xff09; …

Vue核心知識:動態路由實現完整方案

在Vue中實現動態路由&#xff0c;并結合后端接口和數據庫表設計&#xff0c;是一個復雜的項目&#xff0c;需要多個技術棧和步驟的配合。以下將詳細描述整個實現過程&#xff0c;包括數據庫設計、后端接口設計、前端路由配置以及如何實現動態路由的功能。 目錄 一、需求分析二…

自媒體多賬號如何切換不同定位才能做得更好

一、選擇稀缺增長的賽道&#xff0c;避開內卷紅海 1.職場賽道 ● 細分方向&#xff1a;公務員/體制內經驗分享、自由職業指南、遠程辦公技巧。例如&#xff0c;通過采訪自由職業者或分享遠程工作體驗&#xff0c;快速積累精準粉絲。 ● 優勢&#xff1a;職場人群需求明確&…

基于SpringBoot的校園二手交易平臺(源碼+論文+部署教程)

運行環境 校園二手交易平臺運行環境如下&#xff1a; ? 前端&#xff1a;Vue ? 后端&#xff1a;Java ? IDE工具&#xff1a;IntelliJ IDEA&#xff08;可自行更換&#xff09; ? 技術棧&#xff1a;SpringBoot Vue MySQL 主要功能 校園二手交易平臺主要包含前臺和…

iPhone 鏡像 連接錯誤

重置連接 defaults delete com.apple.ScreenContinuity打開 iPhone 鏡像 參考 mac鏡像iPhone無法連接報錯個人經歷的 iPhone 鏡像 bug 與部分解決辦法

Qt基礎入門-詳解

前言 qt之路正式開啟 &#x1f493; 個人主頁&#xff1a;普通young man-CSDN博客 ? 文章專欄&#xff1a;C_普通young man的博客-CSDN博客 ? 本人giee: 普通小青年 (pu-tong-young-man) - Gitee.com 若有問題 評論區見&#x1f4dd; &#x1f389;歡迎大家點贊&#x1f44…

Unity 優化封裝常用API和編輯器擴展工具包

資源名&#xff1a;WXTools 文章目錄 MeshRenderEditorSpriteGroupToolWXEditorUtilsComponentUtilsDataUtilsGameObjectUtilsRigidbodyUtilsStringUtilsTransformUtilsVectorUtilsWXTools 內容包括&#xff1a; MeshRenderEditor mesh擴展 SpriteGroupTool SpriteGroup操作…

python學習第三天

條件判斷 條件判斷使用if、elif和else關鍵字。它們用于根據條件執行不同的代碼塊。 # 條件判斷 age 18 if age < 18:print("你還是個孩子&#xff01;") elif age 18:print("永遠十八歲&#xff01;") else:print("你還年輕&#xff01;")…

ThinkPHP使用phpword讀取模板word文件并添加表格

1.安裝phpword包composer require phpoffice/phpword 2.模板文件結構 如上圖框住的是要替換的文本和要復制表格樣式 實現代碼 <?phpnamespace app\api\logic;use PhpOffice\PhpWord\Element\Table; use PhpOffice\PhpWord\SimpleType\TblWidth; use PhpOffice\PhpWord\…

(原創)用python語言基于paddleocr構建批量識別實現紙質和電子的增值稅專用發票程序

文章目錄 1. 說明2. 準備工作3. 代碼3.1 導入庫&#xff1a;3.2 遍歷發票指定處理方式3.3 發票識別相關函數3.4 發票字段定位函數3.6 識別記錄相關函數3.6 識別結果校驗3.7 文件預處理等其他函數3.8 main主函數 1. 說明 1.1 以paddle識別引擎為基礎的增值稅發票識別程序&#…

DeepSeek搭配Excel,制作自定義按鈕,實現辦公自動化!

今天跟大家分享下我們如何將DeepSeek生成的VBA代碼&#xff0c;做成按鈕&#xff0c;將其永久保存在我們的Excel表格中&#xff0c;下次遇到類似的問題&#xff0c;直接在Excel中點擊按鈕&#xff0c;就能10秒搞定&#xff0c;操作也非常的簡單. 一、代碼準備 代碼可以直接詢問…

解決顯示器在高刷條件下花屏的問題

起因是家里的顯示器好久沒用之后&#xff0c;100HZ的刷新率下會花屏&#xff0c;在75HZ的情況下就正常顯示&#xff0c;在網上找了一圈感覺是硬件問題解決不了 于是想了想如果我用90HZ呢&#xff1f;不過原始的情況下沒有自定義刷新率的選擇&#xff0c;不過amd和nvida控制面板…

IP-----雙重發布

目錄 6.雙重發布 1.重發布的作用 2.部署條件 1.必須存在ASBR 2.種子度量值 3.重發布的規則 4.重發布的數量 5.重發布的場景 1.場景和規則 2.直連和靜態 3.動態RIP 4.動態OSPF 5.更改開銷值 6.重發布的問題1 7.重發布的問題2 1.流量 2.前綴列表 3.偏移列表 4…

藍橋杯試題:DFS回溯

一、題目要求 輸入一個數組n&#xff0c;輸出1到n的全排列 二、代碼展示 import java.util.*;public class ikun {static List<List<Integer>> list new ArrayList<>();public static void main(String[] args) { Scanner sc new Scanner(System.in);…

Ruby基礎

一、字符串 定義 283.to_s //轉為string "something#{a}" //定義字符串&#xff0c;并且插入a變量的值 something//單引號定義變量 %q(aaaaaaaaa) // 定義字符串&#xff0c;&#xff08;&#xff09;內可以是任何數&#xff0c;自動轉義雙引號%Q("aaaaa"…

基于提示驅動的潛在領域泛化的醫學圖像分類方法(Python實現代碼和數據分析)

摘要 醫學圖像分析中的深度學習模型易受數據集偽影偏差、相機差異、成像設備差異等導致的分布偏移影響&#xff0c;導致在真實臨床環境中診斷不可靠。領域泛化&#xff08;Domain Generalization, DG&#xff09;方法旨在通過多領域訓練提升模型在未知領域的性能&#xff0c;但…

C#—Settings配置詳解

C#—Settings配置詳解 在C#項目中&#xff0c;全局配置通常指的是應用程序的設置&#xff08;settings&#xff09;&#xff0c;這些設置可以跨多個類或組件使用&#xff0c;并且通常用于存儲應用程序的配置信息&#xff0c;如數據庫連接字符串、用戶偏好設置等。 Settings配置…

國自然面上項目|基于多模態MR影像的膠質母細胞瘤高危區域定位及預后預測研究|基金申請·25-02-28

小羅碎碎念 今天和大家分享一個面上項目&#xff0c;執行年限為2019.01&#xff5e;2022.12&#xff0c;直接費用為57萬元。 膠質母細胞瘤&#xff08;GBM&#xff09;預后差且差異大&#xff0c;異質性是重要因素&#xff0c;臨床手段難評價。影像組學為異質性研究提供方法&am…