對redis、redisson、springcache總結

<一> redis-緩存中間件

  1. 什么是redis
    redis是c語言開發的,一個高性能key-value鍵值對內存數據庫,可以用來做數據庫、緩存、消息中間件的一種非關系型數據庫。

  2. redis數據存儲在哪里
    內存和磁盤中,但是redis的讀寫都在內存中,這也是速度快的原因之一。
    對于高頻繁訪問的數據,存儲在內存中方便訪問。
    為了避免服務宕機或者重啟數據丟失,也可以將數據存儲在磁盤中持久化。

  3. redis的數據類型
    String、set、zset、list、hash

  4. redis為什么響應速度快
    1) 基于內存存儲,redis的讀寫都是基于內存的key-value操作。內存遠大于磁盤響應速度。
    2) 單線程操作,避免了多線程cpu來回切換和各種加鎖和解鎖的資源消耗。
    redis的單線程操作是指一個模塊的操作單線程,其他該多線程的還是使用多線程。
    3)豐富的數據結構
    redis是基于key-velue鍵值對存儲的緩存數據庫,對于key都是string類型,但是vlue有多種數據類型
    4)高性能的多復用IO模型

  5. 為什么需要使用redis
    redis的響應速度快讀10w+,寫8w,對于一些業務場景(可以將計算的結果-菜單等存儲到緩存中,下次直接getfromredis)

  6. redis怎么配置、步驟
    1) pom文件加上依賴


    org.springframework.boot
    spring-boot-starter-data-redis



    io.lettuce
    lettuce-core


2) 配置文件加上redis服務器的host port user psw等信息
3)使用springboot自動配置好的StringRedisTemplete工具來操作redis進行讀寫操作,
@Autowired
StringRedisTemplete stringRedisTemplete;
// 讀
stringRedisTemplete.opsForValue.get(“keyName”)
// 寫
stringRedisTemplate.opsForValue().set(“keyName”, value, 1, TimeUnit.DAYS); // 設置過期時間 防止緩存數據與數據庫不一致

  1. redis怎么進行get,set,讀寫數據
    使用StringRedisTemplete .get(“keyname”) /.set(“keyname”,“value”,“time”,“時間單位”)

  2. redis有哪些參數
    key-String
    value-list,string、set、zset、hash
    過期時間-過期刪除,重新sql獲取set到緩存中,與數據庫數據保持一致
    過期時間的單位

  3. redis緩存容易出現的問題
    1)緩存穿透
    reason: 大量并發請求一個不存在的數據,到緩存中null,之后大量請求到了數據庫中,數據庫壓力過大崩了。這種是緩存穿透。
    way: 即使數據庫中為null的數據,也存儲一個標識到緩存中,并且設置一個過期時間。

2)緩存雪崩
r:大量不同業務模塊的請求到緩存,但是對應的數據同時過期了,導致所有的請求到db-壓力大。
w:設置不同的過期時間,可以在配置文件中統一配置,因為不同業務key存儲的時間不同,過期點也不會相同。

3)緩存擊穿
r:大量惡意請求到一個熱點詞,剛好這個key過期了。db壓力過大
w:加鎖-記得雙重驗證,每次只允許一個請求進入db-get->db,其他沒有進去鎖的去訪問緩存即可。

  1. 本地鎖(不是redis分布式鎖,加關鍵字Synchronized等)
    本地鎖只能鎖住同一個進程里面的線程,如果是分布式下,即使每個服務僅僅放一個線程進來,相互是隔離的,不能只鎖住一個。這個時候需要分布式鎖-redisson(使用redis分布式鎖-沒有看門狗機制)

  2. redis怎么保證與數據庫數據一致(更新數據庫)
    1)雙寫模式
    先更新數據庫,再去更新緩存對應的key,這種緩存中可能會短暫出現臟數據,穩定后緩存過期-重新讀取db即可保證最新數據。
    2)失效模式
    先寫數據庫,后刪除緩存。這種也可能短暫出現緩存有臟數據,穩定后即可

        無論是更新緩存還是刪除緩存都會有臟數據,解決如下
    

    1)失效模式-使用雙刪模式
    先刪除緩存->更新db-隔幾秒再去刪除緩存
    2)使用MQ消息隊列,消費者監聽queue消息去刪除緩存
    生產者(更新db)->MQ->queue有數據->customer監聽到->刪除緩存->告知queue是否刪除成功,失敗queue再次發送。(不需要寫代碼,mq本身會重復出隊。解耦修改數據庫和查詢數據庫解耦,不會造成緩存有臟數據)

11.緩存鎖使用的原則
正常數據,緩存加上過期時間,就可以實現數據一致性。
對于實時性要求高的,最好是到數據庫中讀取。
對于頻繁修改的數據,不建議加讀寫鎖,性能會慢。

<二> redisson-分布式鎖

  1. redisson是什么
    redisson是基于redis的分布式框架,提供了分布式鎖等服務

  2. 為什么需要分布式鎖
    本地鎖只能鎖住當前進程-一個服務的線程,所以需要分布式鎖。

  3. redission配置步驟
    1)pom文件加上依賴(前提是有redis依賴)

    org.redisson
    redisson
    3.12.0

    2)配置redis配置信息

  4. redisson提供的分布式鎖與redis自己的分布式鎖區別
    1)redisson提供的分布式鎖
    -分布式下也只能有一個線程占用鎖,執行業務代碼,直至解鎖,下一個thread才能進來執行。
    使用RedissonClient加鎖—不會出現死鎖----鎖會自動過期
    @Autowried
    RedissonClient client;
    // 1. 獲取鎖mylock 只要鎖的名字相同 就是同一把鎖
    RLock myLock = redisson.getLock(“myLock”);
    // 2. 加鎖
    myLock.lock(); // 阻塞鎖
    // 業務代碼
    try {
    System.out.println(“加鎖成功,執行業務…” + Thread.currentThread().getId());
    Thread.sleep(3000);
    } catch (Exception e) {
    } finally {
    // 3. 解鎖
    // 即使業務代碼執行失敗或者斷電,沒有解鎖成功,也不會出現死鎖,
    // RedissonClient不會出現死鎖
    System.out.println(“釋放鎖” + Thread.currentThread().getId());
    myLock.unlock();
    }

2)redis提供的分布式鎖
使用StringRedisTemplate加鎖
Boolean lock = stringRedisTemplate.opsForValue().setIfAbsent(
“lockValue”,
uuid,
5,
TimeUnit.SECONDS);

3) redis-StringRedisTemplate分布式鎖與redisson-RedissonClient 分布式鎖區別。
區別在于
1.–redisson分布式鎖有看門狗機制,一個線程占用鎖之后,如果鎖沒有釋放之前,redisson會自動給鎖續期(10s檢查一次鎖是否釋放,續期time-30s),不會過期,直至線程結束鎖釋放。
2- -redis 的stringRedisTemplate分布式鎖不會自動續期。
redisson加鎖的業務代碼只要完成,就不會自動給鎖續期,即使不unlock,鎖默認在30s后自動刪除。即使服務宕機-業務結束,也不會出現死鎖,鎖會自動過期。

  1. 讀寫鎖相關
    // 6.1 讀寫鎖(可以獲read-write)
    RReadWriteLock readWriteLock = redissonClient.getReadWriteLock(“catalogJson-lock”);
    // 6.2 寫鎖
    RLock wLock = readWriteLock.writeLock();
    // 6.3 讀鎖
    RLock rLock = lock.readLock();
    注意
    1)一個讀鎖可以被多個thread線程占用不互斥。
    2)寫鎖與其他鎖都互斥,一次只能有一個線程占用鎖,其他寫或者讀必須等待。

  2. 分布式鎖的幾個參數
    創建鎖的過期時間,時間單位,redisson分布式鎖默認是10s查看一次鎖是否還在,如果在自動延長30s(前提是沒有手動設置過期時間)

  3. redisson分布式鎖的特點
    1)一次只能有一個進程的一個線程進來
    2)有看門狗機制,redisson–自動續期30s,業務未執行完,其他鎖進來造成數據紊亂
    3)自動過期-避免死鎖(什么是死鎖,加鎖->執行業務->執行完解鎖,沒有解鎖業務代碼出異常或者服務掛了,鎖就一直存在redis緩存數據庫中-死鎖)

  4. redisson看門狗機制(給線程看門,線程進去執行業務,redisson看門)
    redisson-redissonClient提供的分布鎖,一旦某個線程進入到占了鎖,在業務代碼沒有執行完成,釋放鎖之前,redisson沒10s會自動檢測鎖是否還在,并續期30s。直至業務完成,解鎖,不再自動續期。這種情況只針對沒有手動配置過期時間的前提,如果配置了則失效。

  5. redission的可重入鎖機制
    Redisson 可重入鎖是一種分布式鎖,它基于 Redis 實現。可重入指的是同一個線程在持有鎖的情況下,可以多次獲取該鎖而不會造成死鎖。

<三>SpringCache-分布式緩存使用

  1. springcache是什么
    spring提供的一個緩存框架,使用一些注解解決緩存的問題,不需要關心底層代碼邏輯如何實現

  2. 使用redis作為緩存工具,cache使用步驟
    1)pom文件加上依賴
    引入依賴 spring-boot-starter-cache
    spring-boot-starter-data-redis
    2)手動在配置文件加上緩存類型(其他配置后面使用場景再說)
    spring.cache.type=redis
    3)開啟緩存@EnableCaching // 開啟緩存,加在對應Configuration類上面

3.springcache 主要的注解
1)@EnableCaching-開啟緩存
2)@Cacheable 加上方法上面,觸發方法更新緩存(如果緩存不是null則不存儲db數據到緩存中)
3)@CacheEvict,更新數據庫觸發刪除緩存對應的數據-失效模式
4)@CachePut,更新數據庫,在不影響更新數據庫的情況下,更新緩存數據-雙寫模式。

  1. springcache有哪些不足之處?該緩存框架默認不加鎖
    1)讀模式(@Cacheable-讀db->set->redis)
    只要涉及讀db數據到redis緩存,且不加鎖的情況,大并發就會暴露redis存儲缺陷。
    a. 緩存穿透-開啟db空值也存到redis中
    配置文件加
    spring.cache.redis.cache-null-values=true

    b. 緩存雪崩-配置設置緩存的過期時間
    spring.cache.redis.time-to-live=600000

    c. 緩存擊穿-加鎖
    springCache默認是不加分布式鎖的,可以對應方法上
    @Cacheable注解上面加上sync = “true”,線程加鎖-一次只允許一個線程占用鎖訪問db-避免熱點擊穿db。
    @Cacheable(value = “category”, key = “#root.method.name”, sync = true)

    2)寫模式
    數據寫模式對應的是更新數據,勢必涉及更新db與更新緩存,兩者存在數據一致性問題。
    解決方法:對于讀多寫少的數據,直接使用springcache緩存即可,key設置過期時間,查詢觸發再次更新db數據到緩存redis中。

總結
redis-緩存中間件-暫時的非關系key-value鍵值對數據庫,StringRedisTemplate操作。
redisson-基于redis操作的數據庫,提供分布式鎖,解決分布式下操作redis缺陷。-使用redissonClient操作分布式鎖(單體不需要redisson,本地鎖就可以解決)
springcache-spring提供的分布式緩存框架,可以使用多種緩存中間件存儲數據,本文type是redis,直接使用一些注解實現redis讀-存儲,寫-寫/刪數據。不需要再單獨使用redis執行一些列繁瑣的代碼實現。

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

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

相關文章

leetcode-413. 等差數列劃分(java)

等差數列劃分 leetcode-413. 等差數列劃分題目描述雙指針 上期經典算法 leetcode-413. 等差數列劃分 難度 - 中等 原題鏈接 - 等差數列劃分 題目描述 如果一個數列 至少有三個元素 &#xff0c;并且任意兩個相鄰元素之差相同&#xff0c;則稱該數列為等差數列。 例如&#xff0…

16 腦洞大開:GUI測試還能這么玩

頁面對象自動生成技術 頁面對象自動生成技術&#xff0c;屬于典型的“自動化你的自動化”的應用場景。它的基本思路是&#xff0c;你不用再手工維護 Page Class 了&#xff0c;只需要提供 Web 的 URL&#xff0c;它就會自動幫你生成這個頁面上所有控件的定位信息&#xff0c;并…

JMeter接口測試數據分離驅動應用

步驟&#xff1a; 創建csv文件&#xff0c;編寫接口測試用例 新建線程組——創建循環控制器&#xff08;循環次數填用例總數&#xff09; 創建CSV數據文件設置&#xff0c;設置參數。&#xff08;注意&#xff1a;是否允許帶引號&#xff1f;&#xff1a;一定要設置為true&a…

深度學習實戰48-【未來的專家團隊】基于AutoCompany模型的自動化企業概念設計與設想

大家好,我是微學AI,今天給大家介紹一下深度學習實戰48-【未來的專家團隊】基于AutoCompany模型的自動化企業概念設計與設想,文本將介紹AutoCompany模型的概念設計,涵蓋了AI智能公司的各個角色,并結合了GPT-4接口來實現各個角色的功能,設置中央控制器,公司運作過程會生成…

【MFC常用問題記錄】

MFC 記錄 MFC的edit control控件顯示1.控件添加變量M_edit后&#xff1a;2.控件ID為IDC_EDIT1: 線程函數使用 MFC的edit control控件顯示 1.控件添加變量M_edit后&#xff1a; CString str; int x 10; str.Format(_T("%d"),x); M_edit.SetWindowText(str)2.控件ID…

JMM內存模型之happens-before闡述

文章目錄 一、happens-before的定義二、happens-before的規則1. 程序順序規則&#xff1a;2. 監視器鎖規則&#xff1a;3. volatile變量規則&#xff1a;4. 傳遞性&#xff1a;5. start()規則&#xff1a;6. join()規則&#xff1a; 一、happens-before的定義 如果一個操作hap…

【編程二三事】ES究竟是個啥?

在最近的項目中&#xff0c;總是或多或少接觸到了搜索的能力。而在這些項目之中&#xff0c;或多或少都離不開一個中間件 - ElasticSearch。 今天忙里偷閑&#xff0c;就來好好了解下這個中間件是用來干什么的。 ES是什么? ? ES全稱ElasticSearch&#xff0c;是個基于Lucen…

性能優化的重要性

性能優化的重要性 性能優化的重要性摘要引言注意事項代碼示例及注釋性能優化的重要性 性能優化的重要性在 Java 中的體現響應速度資源利用效率擴展性與可維護性并發性能合理的鎖策略線程安全的數據結構并發工具類的應用避免競態條件和死鎖 總結代碼示例 博主 默語帶您 Go to Ne…

一張圖看懂 USDT三種類型地址 Omni、ERC20、TRC20的區別

USDT是當前實用最廣泛&#xff0c;市值最高的穩定幣&#xff0c;它是中心化的公司Tether發行的。在今年的4月17日之前&#xff0c;市場上存在著2種不同類型的USDT。4月17日又多了一種波場TRC20協議發行的USDT&#xff0c;它們各自有什么區別呢?哪個轉賬最快到賬&#xff1f;哪…

谷歌推出首款量子彈性 FIDO2 安全密鑰

谷歌在本周二宣布推出首個量子彈性 FIDO2 安全密鑰&#xff0c;作為其 OpenSK 安全密鑰計劃的一部分。 Elie Bursztein和Fabian Kaczmarczyck表示&#xff1a;這一開源硬件優化的實現采用了一種新穎的ECC/Dilithium混合簽名模式&#xff0c;它結合了ECC抵御標準攻擊的安全性和…

[LeetCode]矩陣對角線元素的和

解題 思路 1: 循環,找到主對角線的下標和副對角線的下標,如果矩陣長或寬為奇數的時候,需要減去中間公共的那一個值,中間公共的那個數的下標為mat[mat.size()/2][mat.size()/2]副對角線的下標為 mat [i][mat.size()-i-1] class Solution { public:int diagonalSum(vector<ve…

JVM中判定對象是否回收的的方法

引用計數法 引用計數法是一種垃圾回收&#xff08;Garbage Collection&#xff09;算法&#xff0c;用于自動管理內存中的對象。在引用計數法中&#xff0c;每個對象都有一個關聯的引用計數器&#xff0c;用于記錄對該對象的引用數量。 當一個新的引用指向對象時&#xff0c;…

Hive底層數據存儲格式

前言 在大數據領域,Hive是一種常用的數據倉庫工具,用于管理和處理大規模數據集。Hive底層支持多種數據存儲格式,這些格式對于數據存儲、查詢性能和壓縮效率等方面有不同的優缺點。本文將介紹Hive底層的三種主要數據存儲格式:文本文件格式、Parquet格式和ORC格式。 一、三…

SpringBoot復習:(42)WebServerCustomizer的customize方法是在哪里被調用的?

ServletWebServletAutoConfiguration類定義如下&#xff1a; 可以看到其中通過Import注解導入了其內部類BeanPostProcessorRegister。 BeanPostProcessor中定義的registerBeanDefinition方法會被Spring容器調用。 registerBeanDefinitions方法調用了RegistrySyntheticBeanIf…

解決vue3前端獲取文件的絕對路徑問題

解決vue3前端獲取文件的絕對路徑問題 公司的項目是基于vue3的&#xff0c;由于需求需要前端獲取用戶選的文件的絕對路徑。但是瀏覽器處于安全策略無法獲取真實的文件路徑&#xff0c;只能拿到相對路徑或者是D:\fakepath\xxxx. 看了網上很多方法都很坑&#xff0c;明明沒拿到路…

vue基礎-vue監聽當前屏幕大小做不同的操作

文章目錄 前言一、代碼如下&#xff1a;總結 前言 在vue項目開發過程中&#xff0c;有個需求&#xff0c;就是當屏幕大于1024時&#xff0c;我們默認為PC模式。小于1024時&#xff0c;我們默認為H5模式。但是有的界面我們想在PC和H5上面展示不同的數據&#xff0c;請求不同的接…

Intellij IDEA SBT依賴分析插件

可分析模塊和傳遞依賴 安裝完插件后&#xff0c;由于IDEA BUG&#xff0c;會出現兩個分析按鈕&#xff0c;一個是gradle的&#xff0c;一般是后者是新安裝的sbt。 選擇需要分析的模塊 只需要在project/plugins.sbt中添加代碼&#xff0c;啟動官方分析插件addDependencyTreeP…

1281. 整數的各位積和之差

諸神緘默不語-個人CSDN博文目錄 力扣刷題筆記 文章目錄 1. 簡單粗暴的遍歷2. 其實也是遍歷&#xff0c;但是用Python內置函數只用寫一行 1. 簡單粗暴的遍歷 Python版&#xff1a; class Solution:def subtractProductAndSum(self, n: int) -> int:he0ji1while n>1:last…

redis 數據結構(一)

Redis 為什么那么快 redis是一種內存數據庫&#xff0c;所有的操作都是在內存中進行的&#xff0c;還有一種重要原因是&#xff1a;它的數據結構的設計對數據進行增刪查改操作很高效。 redis的數據結構是什么 redis數據結構是對redis鍵值對值的數據類型的底層的實現&#xff0c…

WordToPDF2.java

用Java將Word轉PDF 本例子測試了spire.doc.free-3.9.0.jar的包 <dependency><groupId> e-iceblue </groupId><artifactId>spire.doc.free</artifactId><version>3.9.0</version></dependency> package word;import com.spire.…