色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Redis重試準則是什么?

OSC開源社區 ? 來源:OSC開源社區 ? 2023-11-15 10:31 ? 次閱讀

網絡和運行環境影響,應用程序可能遇到暫時性故障,如瞬時網絡抖動、服務暫時不可用、服務繁忙導致超時等。 自動重試機制可大幅避免此類故障,保障操作成功執行。

1 引發暫時性故障的原因

1.1 故障觸發了高可用機制

云 Redis 支持節點健康狀態監測,當監測到實例中的主節點不可用時,會自動觸發主備切換,例如將主節點和從節點進行互換,保障實例的高可用性。此時,客戶端可能會遇到下列暫時性故障:秒級的連接閃斷。30 秒內的只讀狀態(用于避免主備切換引起潛在的數據丟失風險和雙寫)。 更多參見:主備切換(https://help.aliyun.com/zh/redis/user-guide/master-replica-switchovers#concept-2025502)

1.2 慢查詢引起了請求堵塞

執行時間復雜度為 O (N) 的操作,引發慢查詢和請求的堵塞,此時,客戶端發起的其他請求可能出現暫時性失敗。

1.3 復雜的網絡環境

由于客戶端與 Redis 服務器之間復雜網絡環境引起,可能出現偶發的網絡抖動、數據重傳等問題,此時,客戶端發起的請求可能會出現暫時性失敗。

2 推薦的重試準則

2.1 僅重試冪等的操作

由于超時可能發生在下述任一階段:該命令由客戶端發送成功,但尚未到達 Redis。命令到達 Redis,但執行超時。命令在 Redis 中執行結束,但結果返回給客戶端時發生超時。如果執行重試可能導致某個操作在 Redis 中被重復執行,因此不是所有操作均適合設計重試機制。通常推薦僅重試冪等的操作,例如SET操作,即多次執行SET a b命令,那么 a 的值只可能是 b 或執行失敗;如果執行LPUSH mylist a則不是冪等的,可能導致 mylist 中包含多個 a 元素。

2.2 適當的重試次數與間隔

根據業務需求和實際場景調整適當的重試次數與間隔,否則可能引發下述問題:如果重試次數不足或間隔太長,應用程序可能無法完成操作而導致失敗。如果重試次數過大或間隔過短,應用程序可能會占用過多的系統資源,且可能因請求過多而堵塞在服務器上無法恢復。常見的重試間隔方式包括立即重試、固定時間重試、指數增加時間重試、隨機時間重試等。

2.3 避免重試嵌套

避免重試嵌套,否則可能會導致重復的重試且無法停止。

2.4 記錄重試異常并打印失敗報告

在重試過程中,建議在 WARN 級別上打印重試錯誤日志,同時,僅在重試失敗時打印異常信息

3 Jedis

建議使用 Jedis 4.0.0 及以上版本,推薦使用最新的 Jedis 版本,以下代碼為 Jedis 5.0.0 的重試示例。

3.1 添加 Jedis 的 Pom 依賴


    redis.clients
    jedis
    5.0.0

3.2 重試實戰

① 標準架構實例或集群架構代理(Proxy)模式

使用 JedisPool 模式。 該示例會將 SET 命令自動重試 5 次,且總重試時間不超過 10s,每次重試之間等待類指數間隔的時間,如果最終不成功,則拋出異常。

PooledConnectionProvider provider = new PooledConnectionProvider(HostAndPort.from("127.0.0.1:6379"));
int maxAttempts = 5; // 最大重試次數
Duration maxTotalRetriesDuration = Duration.ofSeconds(10); // 最大的重試時間
UnifiedJedis jedis = new UnifiedJedis(provider, maxAttempts, maxTotalRetriesDuration);
try {
    System.out.println("set key: " + jedis.set("key", "value"));
} catch (Exception e) {
    // 表示嘗試maxAttempts次或到達了最大查詢時間maxTotalRetriesDuration仍舊沒有訪問成功。
    e.printStackTrace();
}

② 集群架構直連模式

使用 JedisCluster 模式。 可以通過配置 maxAttempts 參數來定義失敗情況下的重試次數,默認值為 5,如果最終不成功,則拋出異常。

HostAndPort hostAndPort = HostAndPort.from("127.0.0.1:30001");
int connectionTimeout = 5000;
int soTimeout = 2000;
int maxAttempts = 5;
ConnectionPoolConfig config = new ConnectionPoolConfig();
JedisCluster jedisCluster = new JedisCluster(hostAndPort, connectionTimeout, soTimeout, maxAttempts, config);
try {
    System.out.println("set key: " + jedisCluster.set("key", "value"));
} catch (Exception e) {
    // 表示嘗試maxAttempts之后仍舊沒有訪問成功。
    e.printStackTrace();
}

4 Redisson

Redisson 客戶端提供了兩個參數來控制重試邏輯:

retryAttempts:重試次數,默認為 3。

retryInterval:重試間隔,默認為 1,500 毫秒。

重試示例如下:

Config config = new Config();
config.useSingleServer()
    .setTimeout(1000)
    .setRetryAttempts(3)
    .setRetryInterval(1500) //ms
    .setAddress("redis://127.0.0.1:6379");
RedissonClient connect = Redisson.create(config);

5 StackExchange.Redis

StackExchang.Redis 客戶端目前僅支持重試時連接,重試示例如下:

var conn = ConnectionMultiplexer.Connect("redis0:6380,redis1:6380,connectRetry=3");
說明 如需實現 API 級別的重試策略,請參見 Polly。

6 Lettuce

Lettuce 客戶端未提供在命令超時后重試的參數,但是您可以通過下述參數來實現命令重試策略:

at-most-once execution:命令最多執行 1 次,即 0 次或 1 次,如果連接斷開并重新連接,命令可能會丟失。

at-least-once execution(默認):最少成功執行 1 次,即可能會在執行時進行多次嘗試,保障最少成功執行 1 次。使用此策略時,如果 Tair 實例發生了主備切換,此時客戶端可能累積了較多的重試命令,主備切換完成后可能會引發 Tair 實例的 CPU 使用率激增。

說明

更多信息,請參見 Client-Options(https://github.com/lettuce-io/lettuce-core/wiki/Client-Options) 和 Command execution reliability(https://github.com/lettuce-io/lettuce-core/wiki/Command-execution-reliability)。

重試示例:

clientOptions.isAutoReconnect() ? Reliability.AT_LEAST_ONCE : Reliability.AT_MOST_ONCE;

參考:

https://help.aliyun.com/zh/redis/use-cases/retry-mechanisms-for-redis-clients

通過客戶端程序連接 Redis

客戶端程序 TLS(SSL)加密連接 Redis

編輯:黃飛

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 服務器
    +關注

    關注

    12

    文章

    9123

    瀏覽量

    85331
  • API
    API
    +關注

    關注

    2

    文章

    1499

    瀏覽量

    61965
  • 客戶端
    +關注

    關注

    1

    文章

    290

    瀏覽量

    16684
  • Redis
    +關注

    關注

    0

    文章

    374

    瀏覽量

    10871

原文標題:大廠都是怎么做Redis重試的?

文章出處:【微信號:OSC開源社區,微信公眾號:OSC開源社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    如何使用Rust連接Redis

    Redis是一款快速、開源、鍵值存儲數據庫,被廣泛應用于緩存、發布/訂閱系統、定時任務等場景中。Rust提供了很多Redis的客戶端庫,本教程將會介紹如何使用Rust連接Redis,以及如何通過
    的頭像 發表于 09-19 16:22 ?2345次閱讀

    Redis Stream應用案例

    摘要: Redis Stream Redis最新的大版本5.0已經RC1了,其中最重要的Feature莫過于Redis Stream了,關于Redis Stream的基本使用介紹和設計
    發表于 06-26 17:15

    redis概述

    REmote DIctionary Server(Redis)是一個基于key-value鍵值對的持久化數據庫存儲系統。redis和大名鼎鼎的Memcached緩存服務軟件很像,但是redis支持
    發表于 07-17 07:38

    如何使得redis中的數據不再有

    嵌入式Linux系統重啟后如何使得redis中的數據不再有今天在工作中遇到一個問題:網頁展示redis中的數據,然而再Linux系統重啟后網頁還能展示redis中的數據,感覺很奇怪,到網上搜了下
    發表于 11-05 08:50

    設計STM32串口驅動要遵循的兩條準則是什么

    設計STM32串口驅動要遵循的兩條準則是什么?如何去實現STM32串口設備驅動接口的代碼呢?
    發表于 12-07 06:15

    圓形電路板設計事項和準則是什么?

    圓形電路板設計事項和準則是什么? 現如今PCB板有多種形狀可供選擇,盡管方形和矩形 PCB 仍然是最常見的,但隨著電子行業的不斷發展,圓形PCB也是逐漸嶄露頭角。 顧名思義,圓形PCB是板子是圓形
    的頭像 發表于 09-21 18:28 ?1735次閱讀

    如何在RocketMQ中合理使用重試機制

    RocketMQ 的重試機制包括三部分,分別是生產者重試,服務端內部數據復制遇到非預期問題時重試,消費者消費重試
    的頭像 發表于 11-23 10:15 ?1119次閱讀

    什么是 Redis

    ? — ? 1 ?— 什么是 RedisRedis(REmote DIctionary Service)是一個開源的鍵值對數據庫服務器。 Redis 更準確的描述是一個數據結構服務器。Re
    的頭像 發表于 05-22 15:32 ?1106次閱讀
    什么是 <b class='flag-5'>Redis</b>

    Redis的主從、哨兵、Redis Cluster集群

    ? 前言 今天跟小伙伴們一起學習Redis的主從、哨兵、Redis Cluster集群。 Redis主從 Redis哨兵 Redis Clu
    的頭像 發表于 06-12 14:58 ?826次閱讀
    <b class='flag-5'>Redis</b>的主從、哨兵、<b class='flag-5'>Redis</b> Cluster集群

    如何用Springboot整合Redis

    本篇文件我們來介紹如何用Springboot整合Redis。 1、Docker 安裝 Redis 1.1 下載鏡像 docker pull redis: 6 . 2 . 6 1.2 創建配置文件
    的頭像 發表于 10-08 14:56 ?581次閱讀
    如何用Springboot整合<b class='flag-5'>Redis</b>

    Redis持久化RDB方式介紹

    主從復制操作 原理圖 設置快照保存規則 快照規則是配置在 redis.conf 文件中的,我這里我截取對應的代碼片段,給大家看下。 #
    的頭像 發表于 10-09 14:56 ?506次閱讀
    <b class='flag-5'>Redis</b>持久化RDB方式介紹

    Tenacity重試模塊實踐

    為了避免由于一些網絡或等其他不可控因素,而引起的功能性問題。比如在發送請求時,會因為網絡不穩定,往往會有請求超時的問題。 這種情況下,我們通常會在代碼中加入重試的代碼。重試的代碼本身不難實現,但
    的頭像 發表于 11-02 11:33 ?402次閱讀

    Python中retrying庫的有參數重試

    有參數重試 (1) stop_max_attempt_number 在retry中傳入stop_max_attempt_number參數后可以指定失敗重試的次數 @retry
    的頭像 發表于 11-14 11:08 ?781次閱讀
    Python中retrying庫的有參數<b class='flag-5'>重試</b>

    redis的持久化方式RDB和AOF的區別

    Redis 是一個高性能的鍵值對數據庫,提供了兩種持久化方式:RDB 和 AOF。RDB 是將 Redis 的數據快照保存到磁盤上,而 AOF 則是Redis 的操作命令追加到文件
    的頭像 發表于 12-04 16:25 ?775次閱讀

    redis容器內怎么查看redis日志

    redis是一款流行的開源內存數據庫,常用于緩存、消息隊列、任務管理等場景。在使用redis時,了解如何查看redis日志對于排查問題、監控性能和分析應用程序行為非常重要。在本文中,我們將介紹在
    的頭像 發表于 12-05 10:10 ?3638次閱讀
    主站蜘蛛池模板: 久久久大香菇| 国产揄拍国产精品| 成人免费肉动漫无遮网站| 成人小视频在线观看| 国产99九九久久无码熟妇| 国产精品禁18久久久夂久| 国产色精品久久人妻无码看片软件| china chinese中国人玩| 欧美性暴力变态xxxx| 纲手胸被爆羞羞免费| 亚洲国产精品一区二区三区在线观看| 国产在线视频在线观看| 90后美女乳沟| 一区二区中文字幕在线观看| 久久精品综合电影| 成人毛片大全| 曰产无码久久久久久精品| 秋霞电影网午夜免费鲁丝片| 国产午夜免费视频片夜色| 中文字幕免费视频精品一| 少妇精油按摩| 免费无码一区二区三区蜜桃大| 国产精品高清视频在线| 2019天天射干网站| 亚洲AV午夜精品麻豆AV| 任你躁国语自产二区在线播放| 国产一区二区在线观看免费| vr亚洲成年网址在线观看| 中文字幕专区高清在线观看| 无人区尖叫之夜美女姐姐视频| 美女爱爱网站| 经典三级四虎在线观看| 999国产高清在线精品| 帅哥男男GV在线1080P| 美女搞鸡网站| 久草在在线免视频在线观看| 国产偷国产偷亚州清高| 蜜桃成人在线| 一区三区在线专区在线| 出轨的妻子在线观看| 亚洲欲色欲色XXXXX在线AV|