最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

記錄一次并發(fā)情況下的redis導致服務假死的問題解決

 更新時間:2023年09月26日 14:46:29   作者:簡單簡單小白  
由于Redis需要依賴于操作系統(tǒng)環(huán)境,如果系統(tǒng)資源受限,比如過量的進程在擠占系統(tǒng)資源、系統(tǒng)死鎖等情況,本文主要介紹了記錄一次并發(fā)情況下的redis導致服務假死的問題解決,感興趣的可以了解一下

問題描述

最近項目在做性能壓測,框架使用的是 spring boot 2.1.2 + jedis 2.9.1,80個并發(fā)持續(xù)壓測4-5分鐘服務就假死,所有的請求就pending,查看服務日志沒有任何異常,查看其它沒有使用redis的接口都能正常請求。

查找問題思路

  • 查看了一下redis的連接配置,都是正常夠用的

  • 再使用jstack看一下堆棧信息

在這里插入圖片描述

發(fā)現(xiàn)很多WAITING的線程,再往下看都是redis的getResource方法導致的等待。

  • 查看redis的源碼Jedis.java

    @Override
    public void close() {
        if (dataSource != null) {//1
            if (client.isBroken()) {
                this.dataSource.returnBrokenResource(this);
            } else {
                this.dataSource.
                        returnResource(this); // 2
            }
            this.dataSource = null;   // 3
        } else {
            super.close();
        }
    }
  • 分析一下這個代碼,client.isBroken()這里默認值是false,連接釋放的時候先釋放resource 然后再將dataSource置為null,那如果是并發(fā)的情況下話,那有可能再下一個線程進來的時候dataSource已經就是null了,在執(zhí)行第2步的時候dataSource剛好被置為null,那這個時候就無法釋放連接了。這個時候我們再看下獲取連接的方法。JedisSentinelPool.java

    @Override
    public Jedis getResource() {
        while (true) {
            Jedis jedis = super.getResource();
            jedis.setDataSource(this);  // <-- This line 
            // get a reference because it can change concurrently
            final HostAndPort master = currentHostMaster;
            final HostAndPort connection = new HostAndPort(jedis.getClient().getHost(), jedis.getClient()
                    .getPort());
            if (master.equals(connection)) {
                // connected to the correct master
                return jedis;
            } else {
                returnBrokenResource(jedis);
            }
        }
    }

    這里jedis.setDataSource(this);設置的則為null。

問題解決方案

我查看了一下jedis的github,在issue上有找到有人曾經提出過這樣的問題,https://github.com/redis/jedis/issues/1920 ,給出的解決方案是升級jedis的jar包到2.10.2版本以上,換成高版本的以后問題果然就解決了。

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.10.2</version>
</dependency>

這里要注意一下的是jedis的版本跟spring-data-redis的版本是有一個對應關系的。

  • spring-data-redis 2.1.x 對應的jedis版本是2.x.x 版本

  • spring-data-redis 2.2.x 對應的jedis 版本就是3.x版本了

分析升級版本以后的改動

還是看那兩個類,看看新版本做了什么改動

    public void close() {
        if (this.dataSource != null) {
            Pool<Jedis> pool = this.dataSource;
            this.dataSource = null;
            if (this.client.isBroken()) {
                pool.returnBrokenResource(this);
            } else {
                pool.returnResource(this);
            }
        } else {
            super.close();
        }
    }

這里很明顯的處理方式就是講dataSource復制給pool,然后用pool去釋放資源,這個時候設置dataSource與這個就沒有關系了,就不存在釋放資源釋放不了的情況了。

到此這篇關于記錄一次并發(fā)情況下的redis導致服務假死的問題解決的文章就介紹到這了,更多相關redis導致服務假死內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關文章

  • Redis安裝圖文教程(Windows和Linux)

    Redis安裝圖文教程(Windows和Linux)

    這篇文章主要介紹了Redis安裝教程(Windows和Linux),本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • Redis 在真實世界的 5 個用法

    Redis 在真實世界的 5 個用法

    Redis是一個開源的使用ANSI C語言編寫、支持網絡、可基于內存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API這篇文章主要介紹了Redis 在真實世界的 5 個用法,需要的朋友可以參考下
    2018-03-03
  • Redis如何使用樂觀鎖(CAS)保證數(shù)據(jù)一致性

    Redis如何使用樂觀鎖(CAS)保證數(shù)據(jù)一致性

    本文主要介紹了Redis如何使用樂觀鎖(CAS)保證數(shù)據(jù)一致性,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Redis和Lua使用過程中遇到的小問題

    Redis和Lua使用過程中遇到的小問題

    這篇文章主要給大家介紹了關于Redis和Lua使用過程中遇到的小問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-11-11
  • 使用 Redis 流實現(xiàn)消息隊列的代碼

    使用 Redis 流實現(xiàn)消息隊列的代碼

    這篇文章主要介紹了使用 Redis 流實現(xiàn)消息隊列,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-11-11
  • Redis shake實現(xiàn)可視化監(jiān)控的示例代碼

    Redis shake實現(xiàn)可視化監(jiān)控的示例代碼

    Redis可視化監(jiān)控是通過監(jiān)控Redis服務器的各項指標和狀態(tài),并將其以可視化的方式展示給用戶,本文給大家介紹了Redis shake實現(xiàn)可視化監(jiān)控,并通過代碼示例講解的非常詳細,需要的朋友可以參考下
    2024-03-03
  • 基于Redis實現(xiàn)每日登錄失敗次數(shù)限制

    基于Redis實現(xiàn)每日登錄失敗次數(shù)限制

    這篇文章主要介紹了通過redis實現(xiàn)每日登錄失敗次數(shù)限制的問題,通過redis記錄登錄失敗的次數(shù),以用戶的username為key,本文給出了實例代碼,需要的朋友可以參考下
    2019-08-08
  • Redis多種內存淘汰策略及配置技巧分享

    Redis多種內存淘汰策略及配置技巧分享

    本文介紹了 Redis 內存滿時的淘汰機制,包括內存淘汰機制的概念,Redis 提供的 8 種淘汰策略(如 noeviction、volatile-lru 等)及其適用場景,還講解了如何配置淘汰機制,通過合理配置可提高緩存效率和系統(tǒng)性能,需要的朋友可以參考下
    2025-01-01
  • redis分布式鎖的8大坑總結梳理

    redis分布式鎖的8大坑總結梳理

    這篇文章主要介紹了redis分布式鎖的8大坑總結梳理,使用redis的分布式鎖,我們首先想到的可能是setNx命令,文章圍繞setNx命令展開詳細的內容介紹,感興趣的小伙伴可以參考一下
    2022-07-07
  • redis服務如何啟動

    redis服務如何啟動

    這篇文章主要介紹了redis服務如何啟動問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08

最新評論

公主岭市| 阳泉市| 昆山市| 南江县| 渭源县| 哈巴河县| 巴林左旗| 明光市| 贵溪市| 印江| 梅河口市| 离岛区| 石景山区| 中西区| 新兴县| 蒙城县| 霍州市| 班戈县| 苍山县| 环江| 昭通市| 郎溪县| 七台河市| 安陆市| 游戏| 衡山县| 岳阳市| 福贡县| 保康县| 高雄县| 饶河县| 新邵县| 叙永县| 黄大仙区| 太仆寺旗| 南木林县| 克什克腾旗| 德庆县| 渭源县| 达孜县| 宜兰市|