国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Redis(8)】Spring Boot整合Redis和Guava,解決緩存穿透、緩存擊穿、緩存雪崩等緩存問題

這篇具有很好參考價值的文章主要介紹了【Redis(8)】Spring Boot整合Redis和Guava,解決緩存穿透、緩存擊穿、緩存雪崩等緩存問題。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

在緩存技術的挑戰(zhàn)及設計方案我們介紹了使用緩存技術可能會遇到的一些問題,那么如何解決這些問題呢?

在構建緩存系統(tǒng)時,Spring Boot和Redis的結合提供了強大的支持,而Guava的LoadingCache則為緩存管理帶來了便捷的解決方案。下面我將介紹如何通過整合Spring Boot、Redis和Guava來實現一個解決緩存穿透、緩存擊穿、緩存雪崩、緩存污染和緩存數據一致性問題的緩存方案。

一、整合Spring Boot與Redis

首先,我們需要在Spring Boot項目中整合原生Redis客戶端。這可以通過添加Spring Boot Redis依賴來實現。

二、引入Guava

Guava的LoadingCache是一個高級緩存工具,它支持自動加載、緩存數據的自動刷新和監(jiān)聽器通知。

三、工具類

下面是一個三高緩存工具類的實現,它整合了Spring Boot、Redis和Guava的LoadingCache。這個工具類旨在解決緩存穿透、緩存擊穿、緩存雪崩、緩存污染和緩存數據一致性問題。

import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

public class CacheUtil<DataLoader extends CacheUtil.DataLoaderInterface> {

    private final StringRedisTemplate stringRedisTemplate;
    private final ValueOperations<String, String> valueOperations;
    private final LoadingCache<String, String> loadingCache;
    private final DataLoader dataLoader;

    @Autowired
    public CacheUtil(
        StringRedisTemplate stringRedisTemplate, DataLoader dataLoader) {
        this.stringRedisTemplate = stringRedisTemplate;
        this.valueOperations = stringRedisTemplate.opsForValue();
        this.dataLoader = dataLoader;

        // 初始化Guava LoadingCache
        // 設置最大容量,避免緩存污染
        // 設置寫入后過期時間,避免緩存雪崩
        // 使用鎖機制,避免緩存擊穿
        this.loadingCache = CacheBuilder.newBuilder()
                .maximumSize(10000)
                .expireAfterWrite(10, TimeUnit.MINUTES)
                .build(new CacheLoader<String, String>() {
                    @Override
                    public String load(String key) throws Exception {
                        // 當緩存未命中時,調用數據加載器的方法從數據庫加載數據
                        return dataLoader.loadDataFromDatabase(key);
                    }
                });
    }

    public String get(String key) {
        try {
            // 通過Guava LoadingCache獲取數據
            // 自動處理緩存穿透和擊穿
            return loadingCache.get(key);
        } catch (ExecutionException e) {
            // 異常處理,返回null
            return null;
        }
    }

    public void set(String key, String value) {
        // 同時更新Redis和Guava LoadingCache
        // 保持數據一致性
        valueOperations.set(key, value);
        loadingCache.put(key, value);
    }

    public void update(String key, String value) {
        // 更新緩存數據,解決數據一致性問題
        set(key, value);
    }

    public void insert(String key, String value) {
        // 插入前檢查緩存,避免緩存污染
        if (get(key) == null) {
            set(key, value);
        }
    }

    public void delete(String key) {
        // 刪除Redis和Guava LoadingCache中的數據
        // 保持數據一致性
        valueOperations.delete(key);
        loadingCache.invalidate(key); // 使緩存項失效
    }

    // 用于在數據庫更新后刷新緩存
    public void refreshCache(String key) {
        loadingCache.invalidate(key);
    }

    // 數據加載器接口,調用者需要實現該接口以提供數據加載邏輯
    public interface DataLoaderInterface {
        String loadDataFromDatabase(String key);
    }
}

四、使用示例

  • 實現數據加載器接口:創(chuàng)建一個類實現CacheUtil.DataLoaderInterface接口,提供具體的數據加載邏輯。
public class UserCacheDataLoader implements CacheUtil.DataLoaderInterface {

    private final UserService userService; // 假設這是您的UserService

    @Autowired
    public UserCacheDataLoader(UserService userService) {
        this.userService = userService;
    }

    @Override
    public String loadDataFromDatabase(String key) {
        // 根據鍵(例如用戶ID)從數據庫加載數據
        User user = userService.findById(key);
        if (user != null) {
            return user.toString(); // 將用戶信息轉換為字符串
        }
        return null; // 用戶不存在
    }
}
  • 配置Spring Bean:在Spring配置中注冊CacheUtil?Bean。
@Configuration
public class CacheConfig {

    @Bean
    public CacheUtil<UserCacheDataLoader> userCacheUtil(
        UserCacheDataLoader userCacheDataLoader) {
        // 假設已經配置好
        StringRedisTemplate stringRedisTemplate = stringRedisTemplate(); 
        return new CacheUtil<>(stringRedisTemplate, userCacheDataLoader);
    }

    // 其他配置...
}
  • 在應用中使用:在需要緩存的地方注入CacheUtil并使用它。
@RestController
@RequestMapping("/users")
public class UserController {

    private final CacheUtil<UserCacheDataLoader> userCacheUtil;

    @Autowired
    public UserController(CacheUtil<UserCacheDataLoader> userCacheUtil) {
        this.userCacheUtil = userCacheUtil;
    }

    @GetMapping("/{userId}")
    public String getUserDetails(@PathVariable String userId) {
        // 使用CacheUtil的get方法來獲取緩存數據
        return userCacheUtil.get(userId);
    }

   
    // 更新緩存數據
    userCacheUtil.update(key, value);

    // 插入緩存數據
    userCacheUtil.insert(key, value);

    // 刪除緩存數據
    userCacheUtil.delete(key);

    // 數據庫更新后刷新緩存
    userCacheUtil.refreshCache(key);
}

?文章來源地址http://www.zghlxwxcb.cn/news/detail-855509.html

注意:

  • 請確保StringRedisTemplate和數據加載器(如UserCacheDataLoader)已經正確配置并注入到CacheUtil中。
  • 根據業(yè)務邏輯的復雜性,loadDataFromDatabase方法可能需要合理的超時和重試策略。
  • 在實際部署前,進行充分的測試,確保緩存加載邏輯在各種情況下都能正常工作。

?

到了這里,關于【Redis(8)】Spring Boot整合Redis和Guava,解決緩存穿透、緩存擊穿、緩存雪崩等緩存問題的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • redis緩存穿透、緩存擊穿、緩存雪崩及對應解決方法

    緩存穿透、擊穿和雪崩是緩存使用中的常見問題,對它們的理解和相應的解決方法對于維護系統(tǒng)性能和穩(wěn)定性至關重要。 定義 : 當客戶端請求的數據在緩存中和數據庫中都不存在時,該請求會直接打到數據庫上,這種情況稱為緩存穿透。如果持續(xù)請求這樣的數據,會給數據

    2024年04月08日
    瀏覽(20)
  • redis緩存雪崩、穿透、擊穿解決方案

    redis緩存雪崩、穿透、擊穿解決方案

    關于緩存異常,我們常見的有三個問題:緩存雪崩、緩存擊穿、緩存穿透。這三個問題一旦發(fā)生,會導致大量請求直接落到數據庫層面。如果請求的并發(fā)量很大,會影響數據庫的運行,嚴重的會導致數據庫宕機。 為了避免緩存異常帶來的損失,我們需要了解每種異常的原因以

    2024年02月10日
    瀏覽(100)
  • Redis什么是緩存穿透、擊穿、雪崩?如何解決

    Redis什么是緩存穿透、擊穿、雪崩?如何解決

    通常后端會采用Mysql等磁盤數據庫,可以持久化但是訪問慢,高并發(fā)時性能差,需要設置Nosql內存型數據庫緩存:Redis等 但緩存可能出現:緩存穿透、緩存擊穿、緩存雪崩等問題 查找數據的順序是:先查找緩存,再查找數據庫 當查找一個數據時,緩存沒有都會請求數據庫,當

    2024年02月09日
    瀏覽(28)
  • Redis緩存穿透、擊穿、雪崩問題及其解決方法

    Redis緩存穿透、擊穿、雪崩問題及其解決方法

    緩存穿透 :緩存穿透是指客戶端請求的數據在緩存中和數據庫中都不存在,這樣緩存永遠不會生效,這些請求都會打到數據庫。 常見的解決方案有兩種: 緩存空對象 優(yōu)點:實現簡單,維護方便 缺點: 額外的內存消耗 可能造成短期的不一致 布隆過濾 優(yōu)點:內存占用較少,

    2024年02月02日
    瀏覽(15)
  • Redis:緩存擊穿、緩存穿透與緩存雪崩的區(qū)別、解決方案

    Redis:緩存擊穿、緩存穿透與緩存雪崩的區(qū)別、解決方案

    ? ? ? ? 近期學習redis相關原理,記錄一下開發(fā)過程中Redis的一些常見問題及應對方法。 一句話總結:先查 redis發(fā)現沒數據 ,再去 數據庫查發(fā)現還是沒數據 。 這種情況下 緩存永遠不會生效 ,數據庫將承擔巨大壓力。 ? ? ? ? 我們知道,redis的緩存作用,是在客戶端發(fā)起查

    2024年02月06日
    瀏覽(28)
  • redis中緩存雪崩,緩存穿透,緩存擊穿的原因以及解決方案

    redis中緩存雪崩,緩存穿透,緩存擊穿的原因以及解決方案

    在redis中,新,舊數據交替時候,舊數據進行了刪除,新數據沒有更新過來,造成在高并發(fā)環(huán)境下,大量請求查詢redis沒有數據,直接查詢mysql,造成mysql的壓力驟增,給mysql造成極大的壓力,造成一連串的后續(xù)異常反應。 1.大多數系統(tǒng)設計者 考慮用加鎖 (最多的解決方案)或

    2024年02月15日
    瀏覽(36)
  • Redis中的緩存雪崩、擊穿、穿透的原因以及解決辦法

    Redis中的緩存雪崩、擊穿、穿透的原因以及解決辦法

    緩存雪崩、擊穿、穿透一旦發(fā)生,會導致大量的請求積壓到數據庫層。如果請求的并發(fā)量很大,就會導致數據庫宕機或是故障,這就是很嚴重的生產事故了。 俗話說,知己知彼,百戰(zhàn)不殆。了解了問題的成因,我們就能夠在應用Redis緩存時,進行合理的緩存設置,以及相應的

    2024年02月12日
    瀏覽(32)
  • redis實戰(zhàn)-緩存三劍客穿透擊穿雪崩解決方案

    redis實戰(zhàn)-緩存三劍客穿透擊穿雪崩解決方案

    緩存穿透 :緩存穿透是指客戶端請求的 數據在緩存中和數據庫中都不存在 ,這樣緩存永遠不會生效,這些請求都會打到數據庫, 造成數據庫壓力 ,也讓緩存沒有發(fā)揮出應有的作用 緩存空對象 當我們客戶端訪問不存在的數據時,先請求redis,但是此時redis中沒有數據,此時

    2024年02月11日
    瀏覽(29)
  • Redis中的緩存穿透、雪崩、擊穿的原因以及解決方案

    Redis中的緩存穿透、雪崩、擊穿的原因以及解決方案

    是指用戶查詢數據,在數據庫沒有,自然在緩存中也不會有。這樣就導致用戶查詢的時候,在緩存中找不到,每次都要去數據庫再查詢一遍,然后返回空(相當于進行了兩次無用的查詢)。這樣請求就繞過緩存直接查數據庫,這也是經常提的緩存命中率問題。 我們可以簡單的

    2024年02月12日
    瀏覽(21)
  • Redis緩存雪崩、穿透、擊穿原因分析和解決方案,附Redis管道使用技巧

    Redis緩存雪崩、穿透、擊穿原因分析和解決方案,附Redis管道使用技巧

    先給大家附上其他幾篇文章,感興趣的自行開車導航 Redis過期策略和持久化機制全面揭秘,教你如何合理配置 【深入淺出Redis 一】從版本特性到數據類型到線程模型,帶你了解Redis的核心特性和應用場景! 一次redis OOM問題分析解決,rdbtools安裝分析redis內存 Redis管道(pipelin

    2024年02月16日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包