@@ -28,6 +28,7 @@ progress in implementing the recommendations.
28
28
{{< checklist-item "#event-handling" >}}Event handling{{< /checklist-item >}}
29
29
{{< checklist-item "#timeouts" >}}Timeouts{{< /checklist-item >}}
30
30
{{< checklist-item "#exception-handling" >}}Exception handling{{< /checklist-item >}}
31
+ {{< checklist-item "#retries" >}}Retries{{< /checklist-item >}}
31
32
{{< /checklist >}}
32
33
33
34
## Recommendations
@@ -110,3 +111,68 @@ the most common Redis exceptions:
110
111
(for example, trying to access a
111
112
[ stream entry] ({{< relref "/develop/data-types/streams#entry-ids" >}})
112
113
using an invalid ID).
114
+
115
+ ### Retries
116
+
117
+ During the initial ` ConnectionMultiplexer.Connect() ` call, ` NRedisStack ` will
118
+ keep trying to connect if the first attempt fails. By default, it will make
119
+ three attempts, but you can configure the number of retries using the
120
+ ` ConnectRetry ` configuration option:
121
+
122
+ ``` cs
123
+ var muxer = ConnectionMultiplexer .Connect (new ConfigurationOptions {
124
+ ConnectRetry = 5 , // Retry up to five times.
125
+ .
126
+ .
127
+ });
128
+ ```
129
+
130
+ After the initial ` Connect() ` call is successful, ` NRedisStack ` will
131
+ automatically attempt to reconnect if the connection is lost. You can
132
+ specify a reconnection strategy with the ` ReconnectRetryPolicy ` configuration
133
+ option. ` NRedisStack ` provides two built-in classes that implement
134
+ reconnection strategies:
135
+
136
+ - ` ExponentialRetry ` : (Default) Uses an
137
+ [ exponential backoff] ( https://en.wikipedia.org/wiki/Exponential_backoff )
138
+ strategy, where you specify an increment to the delay between successive
139
+ attempts and, optionally, a maximum delay, both in milliseconds.
140
+ - ` LinearRetry ` : Uses a linear backoff strategy with a fixed delay between
141
+ attempts, in milliseconds.
142
+
143
+ The example below shows how to use the ` ExponentialRetry ` class:
144
+
145
+ ``` cs
146
+ var muxer = ConnectionMultiplexer .Connect (new ConfigurationOptions {
147
+ // 500ms increment per attempt, max 2000ms.
148
+ ReconnectRetryPolicy = new ExponentialRetry (500 , 2000 ),
149
+ .
150
+ .
151
+ });
152
+ ```
153
+
154
+ You can also implement your own custom retry policy by creating a class
155
+ that implements the ` IReconnectRetryPolicy ` interface.
156
+
157
+ ` NRedisStack ` doesn't provide an automated retry mechanism for commands, but
158
+ you can implement your own retry logic in your application code. Use
159
+ a loop with a ` try ` /` catch ` block to catch ` RedisConnectionException ` and
160
+ ` RedisTimeoutException ` exceptions and then retry the command after a
161
+ suitable delay, as shown in the example below:
162
+
163
+ ``` cs
164
+ const int MAX_RETRIES = 3 ;
165
+
166
+ for (int i = 0 ; i < MAX_RETRIES ; i ++ ) {
167
+ try {
168
+ string value = db .StringGet (" foo" );
169
+ break ;
170
+ } catch (RedisConnectionException ) {
171
+ // Wait before retrying.
172
+ Thread .Sleep (500 * (i + 1 ));
173
+ } catch (RedisTimeoutException ) {
174
+ // Wait before retrying.
175
+ Thread .Sleep (500 * (i + 1 ));
176
+ }
177
+ }
178
+ ```
0 commit comments