Golang如何连接redis哨兵模式,项目案例,模块化客户端
发布时间:2022-01-26 编辑:jiaochengji.com
教程集为您提供Golang如何连接redis哨兵模式,项目案例,模块化客户端等资源,欢迎您收藏本站,我们将为您提供最新的Golang如何连接redis哨兵模式,项目案例,模块化客户端资源
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"/></svg><h3>一、go环境说明</h3>
<pre><code class="lang-go hljs">D<span class="token punctuation">:</span>\dev\demo<span class="token operator">></span><span class="token keyword">go</span> env
set GO111MODULE<span class="token operator">=</span>on
set GOARCH<span class="token operator">=</span>amd64
set GOBIN<span class="token operator">=</span>
set GOCACHE<span class="token operator">=</span>C<span class="token punctuation">:</span>\Users\username\AppData\Local\<span class="token keyword">go</span><span class="token operator">-</span>build
set GOENV<span class="token operator">=</span>C<span class="token punctuation">:</span>\Users\username\AppData\Roaming\<span class="token keyword">go</span>\env
set GOEXE<span class="token operator">=</span><span class="token punctuation">.</span>exe
set GOFLAGS<span class="token operator">=</span>
set GOHOSTARCH<span class="token operator">=</span>amd64
set GOHOSTOS<span class="token operator">=</span>windows
set GOINSECURE<span class="token operator">=</span>
set GONOPROXY<span class="token operator">=</span>
set GONOSUMDB<span class="token operator">=</span>
set GOOS<span class="token operator">=</span>windows
set GOPATH<span class="token operator">=</span>C<span class="token punctuation">:</span>\Users\username\<span class="token keyword">go</span>
set GOPRIVATE<span class="token operator">=</span>
set GOPROXY<span class="token operator">=</span>https<span class="token punctuation">:</span><span class="token operator">/</span><span class="token operator">/</span>goproxy<span class="token punctuation">.</span>io
set GOROOT<span class="token operator">=</span>C<span class="token punctuation">:</span>\Go
set GOSUMDB<span class="token operator">=</span>off
set GOTMPDIR<span class="token operator">=</span>
set GOTOOLDIR<span class="token operator">=</span>C<span class="token punctuation">:</span>\Go\pkg\tool\windows_amd64
set GCCGO<span class="token operator">=</span>gccgo
set AR<span class="token operator">=</span>ar
set CC<span class="token operator">=</span>gcc
set CXX<span class="token operator">=</span>g<span class="token operator"> </span>
set CGO_ENABLED<span class="token operator">=</span><span class="token number">1</span>
set GOMOD<span class="token operator">=</span>D<span class="token punctuation">:</span>\dev\demo\<span class="token keyword">go</span><span class="token punctuation">.</span>mod
set CGO_CFLAGS<span class="token operator">=</span><span class="token operator">-</span>g <span class="token operator">-</span>O2
set CGO_CPPFLAGS<span class="token operator">=</span>
set CGO_CXXFLAGS<span class="token operator">=</span><span class="token operator">-</span>g <span class="token operator">-</span>O2
set CGO_FFLAGS<span class="token operator">=</span><span class="token operator">-</span>g <span class="token operator">-</span>O2
set CGO_LDFLAGS<span class="token operator">=</span><span class="token operator">-</span>g <span class="token operator">-</span>O2
set PKG_CONFIG<span class="token operator">=</span>pkg<span class="token operator">-</span>config
set GOGCCFLAGS<span class="token operator">=</span><span class="token operator">-</span>m64 <span class="token operator">-</span>mthreads <span class="token operator">-</span>fno<span class="token operator">-</span>caret<span class="token operator">-</span>diagnostics <span class="token operator">-</span>Qunused<span class="token operator">-</span>arguments <span class="token operator">-</span>fmessage<span class="token operator">-</span>length<span class="token operator">=</span><span class="token number">0</span> <span class="token operator">-</span>fdebug<span class="token operator">-</span>prefix<span class="token operator">-</span><span class="token keyword">map</span><span class="token operator">=</span>C<span class="token punctuation">:</span>\Users\YULIAN~<span class="token number">1</span>\AppData\Local\Temp\<span class="token keyword">go</span><span class="token operator">-</span>build461750494<span class="token operator">=</span><span class="token operator">/</span>tmp<span class="token operator">/</span><span class="token keyword">go</span><span class="token operator">-</span>build <span class="token operator">-</span>gno<span class="token operator">-</span>record<span class="token operator">-</span>gcc<span class="token operator">-</span>switches
D<span class="token punctuation">:</span>\dev\v3\ncloud<span class="token operator">></span>
</code></pre>
<h4>二、哨兵客户端</h4>
<pre><code class="lang-go hljs"><span class="token keyword">package</span> redis
<span class="token keyword">import</span> <span class="token punctuation">(</span>
<span class="token string">"context"</span>
<span class="token string">"fmt"</span>
<span class="token string">"github.com/go-redis/redis/v8"</span>
<span class="token punctuation">)</span>
<span class="token keyword">type</span> SentinelConn <span class="token keyword">struct</span> <span class="token punctuation">{</span>
MasterName <span class="token builtin">string</span>
SentinelAddrs <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">string</span>
Password <span class="token builtin">string</span>
DB <span class="token builtin">int</span>
Client <span class="token operator">*</span>redis<span class="token punctuation">.</span>Client
<span class="token punctuation">}</span>
<span class="token keyword">func</span> <span class="token punctuation">(</span>sentinel <span class="token operator">*</span>SentinelConn<span class="token punctuation">)</span> <span class="token function">GetConn</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">(</span><span class="token operator">*</span>redis<span class="token punctuation">.</span>Client<span class="token punctuation">,</span> <span class="token builtin">error</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">if</span> sentinel<span class="token punctuation">.</span>Client <span class="token operator">==</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token boolean">nil</span><span class="token punctuation">,</span> fmt<span class="token punctuation">.</span><span class="token function">Errorf</span><span class="token punctuation">(</span><span class="token string">"redis Client connect is nil"</span><span class="token punctuation">)</span>
<span class="token punctuation">}</span>
ctx <span class="token operator">:=</span> context<span class="token punctuation">.</span><span class="token function">Background</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
err <span class="token operator">:=</span> sentinel<span class="token punctuation">.</span>Client<span class="token punctuation">.</span><span class="token function">Ping</span><span class="token punctuation">(</span>ctx<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Err</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">if</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token boolean">nil</span><span class="token punctuation">,</span> err
<span class="token punctuation">}</span>
<span class="token keyword">return</span> sentinel<span class="token punctuation">.</span>Client<span class="token punctuation">,</span> <span class="token boolean">nil</span>
<span class="token punctuation">}</span>
<span class="token keyword">func</span> <span class="token punctuation">(</span>sentinel <span class="token operator">*</span>SentinelConn<span class="token punctuation">)</span> <span class="token function">InitSentinelRedis</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">*</span>redis<span class="token punctuation">.</span>Client <span class="token punctuation">{</span>
sf <span class="token operator">:=</span> <span class="token operator">&</span>redis<span class="token punctuation">.</span>FailoverOptions<span class="token punctuation">{</span>
MasterName<span class="token punctuation">:</span> sentinel<span class="token punctuation">.</span>MasterName<span class="token punctuation">,</span>
SentinelAddrs<span class="token punctuation">:</span> sentinel<span class="token punctuation">.</span>SentinelAddrs<span class="token punctuation">,</span>
Password<span class="token punctuation">:</span> sentinel<span class="token punctuation">.</span>Password<span class="token punctuation">,</span>
DB<span class="token punctuation">:</span> sentinel<span class="token punctuation">.</span>DB<span class="token punctuation">,</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> redis<span class="token punctuation">.</span><span class="token function">NewFailoverClient</span><span class="token punctuation">(</span>sf<span class="token punctuation">)</span>
<span class="token punctuation">}</span>
<span class="token keyword">func</span> <span class="token function">NewRedisSentinel</span><span class="token punctuation">(</span>mastername<span class="token punctuation">,</span> password <span class="token builtin">string</span><span class="token punctuation">,</span> addrs <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">string</span><span class="token punctuation">,</span> db <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token operator">*</span>SentinelConn <span class="token punctuation">{</span>
sentinel <span class="token operator">:=</span> SentinelConn<span class="token punctuation">{</span>
MasterName<span class="token punctuation">:</span> mastername<span class="token punctuation">,</span>
SentinelAddrs<span class="token punctuation">:</span> addrs<span class="token punctuation">,</span>
Password<span class="token punctuation">:</span> password<span class="token punctuation">,</span>
DB<span class="token punctuation">:</span> db<span class="token punctuation">,</span>
<span class="token punctuation">}</span>
sentinel<span class="token punctuation">.</span>Client <span class="token operator">=</span> sentinel<span class="token punctuation">.</span><span class="token function">InitSentinelRedis</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">return</span> <span class="token operator">&</span>sentinel
<span class="token punctuation">}</span>
</code></pre>
<h4>三、初始化哨兵客户端</h4>
<pre><code class="lang-go hljs"><span class="token keyword">package</span> handler
<span class="token keyword">import</span> <span class="token punctuation">(</span>
<span class="token string">"context"</span>
<span class="token string">"fmt"</span>
<span class="token string">"net/http"</span>
<span class="token string">"strings"</span>
<span class="token string">"time"</span>
<span class="token string">"pkg/utils/redis"</span>
<span class="token punctuation">)</span>
<span class="token keyword">var</span> <span class="token punctuation">(</span>
MASTER_NAME <span class="token operator">=</span> <span class="token string">"mymaster"</span>
SENTINEL_ADDRS <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">string</span><span class="token punctuation">{</span><span class="token string">"192.168.55.219:26379"</span><span class="token punctuation">,</span> <span class="token string">"192.168.55.227:26379"</span><span class="token punctuation">,</span> <span class="token string">"192.168.55.230:26379"</span><span class="token punctuation">}</span>
SENTINEL_PASSWORD <span class="token operator">=</span> <span class="token string">"redis@123.com"</span>
SENTINEL_DB <span class="token operator">=</span> <span class="token number">1</span>
<span class="token punctuation">)</span>
<span class="token keyword">var</span> redSentinelConn <span class="token operator">*</span>redis<span class="token punctuation">.</span>SentinelConn
<span class="token keyword">func</span> <span class="token function">init</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">if</span> redSentinelConn <span class="token operator">==</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span>
redSentinelConn <span class="token operator">=</span> redis<span class="token punctuation">.</span><span class="token function">NewRedisSentinel</span><span class="token punctuation">(</span>MASTER_NAME<span class="token punctuation">,</span> SENTINEL_PASSWORD<span class="token punctuation">,</span> SENTINEL_ADDRS<span class="token punctuation">,</span> SENTINEL_DB<span class="token punctuation">)</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre>
<h5>四、使用示例</h5>
<pre><code class="lang-go hljs"><span class="token comment">// field : count,token_count</span>
<span class="token comment">// ctx := context.Background()</span>
<span class="token comment">// 登录次数计数器</span>
<span class="token keyword">func</span> <span class="token function">getLoginErrorCount</span><span class="token punctuation">(</span>ctx context<span class="token punctuation">.</span>Context<span class="token punctuation">,</span> uname <span class="token punctuation">,</span>field <span class="token builtin">string</span><span class="token punctuation">)</span> <span class="token punctuation">(</span><span class="token builtin">int</span><span class="token punctuation">,</span> <span class="token builtin">error</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
count <span class="token operator">:=</span> <span class="token number">0</span> <span class="token comment">// 默认是没有登录错误次数</span>
conn<span class="token punctuation">,</span> err <span class="token operator">:=</span> redSentinelConn<span class="token punctuation">.</span><span class="token function">GetConn</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">if</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> count<span class="token punctuation">,</span> err
<span class="token punctuation">}</span>
bExist<span class="token punctuation">,</span> err <span class="token operator">:=</span> conn<span class="token punctuation">.</span><span class="token function">HExists</span><span class="token punctuation">(</span>ctx<span class="token punctuation">,</span> uname<span class="token punctuation">,</span> field<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Result</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">if</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> count<span class="token punctuation">,</span> err
<span class="token punctuation">}</span>
<span class="token keyword">if</span> bExist <span class="token operator">==</span> <span class="token boolean">false</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> count<span class="token punctuation">,</span> <span class="token boolean">nil</span>
<span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
valmap <span class="token punctuation">,</span>err <span class="token operator">:=</span> conn<span class="token punctuation">.</span><span class="token function">HGetAll</span><span class="token punctuation">(</span>ctx<span class="token punctuation">,</span> uname<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Result</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">if</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span>
log<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"###### HGetAll err"</span><span class="token punctuation">,</span> err<span class="token punctuation">)</span>
<span class="token keyword">return</span> count<span class="token punctuation">,</span> <span class="token boolean">nil</span>
<span class="token punctuation">}</span>
log<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"###### HGetAll valmap"</span><span class="token punctuation">,</span> valmap<span class="token punctuation">)</span>
val<span class="token punctuation">,</span> err <span class="token operator">:=</span> conn<span class="token punctuation">.</span><span class="token function">HGet</span><span class="token punctuation">(</span>ctx<span class="token punctuation">,</span> uname<span class="token punctuation">,</span> field<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Int</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">if</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span>
log<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"###### HMGet hmget err"</span><span class="token punctuation">,</span> err<span class="token punctuation">)</span>
<span class="token keyword">return</span> count<span class="token punctuation">,</span> <span class="token boolean">nil</span>
<span class="token punctuation">}</span>
log<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"###### HMGet hmget Val"</span><span class="token punctuation">,</span> val<span class="token punctuation">)</span>
<span class="token keyword">return</span> val<span class="token punctuation">,</span> <span class="token boolean">nil</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">func</span> <span class="token function">loginErrorCount</span><span class="token punctuation">(</span>ctx context<span class="token punctuation">.</span>Context<span class="token punctuation">,</span> uname <span class="token punctuation">,</span>field <span class="token builtin">string</span><span class="token punctuation">)</span> <span class="token punctuation">(</span><span class="token builtin">int</span><span class="token punctuation">,</span> <span class="token builtin">error</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
conn<span class="token punctuation">,</span> err <span class="token operator">:=</span> redSentinelConn<span class="token punctuation">.</span><span class="token function">GetConn</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">if</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">,</span> err
<span class="token punctuation">}</span>
count<span class="token punctuation">,</span> err <span class="token operator">:=</span> <span class="token function">getLoginErrorCount</span><span class="token punctuation">(</span>ctx<span class="token punctuation">,</span> uname<span class="token punctuation">,</span>field<span class="token punctuation">)</span>
log<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"###### getDoLoginErrorCount count"</span><span class="token punctuation">,</span> count<span class="token punctuation">)</span>
<span class="token keyword">if</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span>
log<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"doLoginErrorCount err"</span><span class="token punctuation">,</span> err<span class="token punctuation">)</span>
<span class="token keyword">return</span> count<span class="token punctuation">,</span> <span class="token boolean">nil</span>
<span class="token punctuation">}</span>
count<span class="token operator"> </span>
<span class="token keyword">if</span> count <span class="token operator"><=</span> <span class="token number">5</span> <span class="token punctuation">{</span>
err <span class="token operator">:=</span> conn<span class="token punctuation">.</span><span class="token function">HSet</span><span class="token punctuation">(</span>ctx<span class="token punctuation">,</span> uname<span class="token punctuation">,</span> field<span class="token punctuation">,</span> count<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Err</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">if</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span>
log<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"redis set error:"</span><span class="token punctuation">,</span> err<span class="token punctuation">)</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
conn<span class="token punctuation">.</span><span class="token function">Expire</span><span class="token punctuation">(</span>ctx<span class="token punctuation">,</span> uname<span class="token punctuation">,</span> <span class="token number">10</span><span class="token operator">*</span>time<span class="token punctuation">.</span>Minute<span class="token punctuation">)</span>
<span class="token keyword">return</span> count<span class="token punctuation">,</span> <span class="token boolean">nil</span>
<span class="token punctuation">}</span>
</code></pre>
您可能感兴趣的文章:
redis基础问答
Redis主从复制及高可用部署(哨兵模式)
Redis主从及哨兵模式
Golang如何连接redis哨兵模式,项目案例,模块化客户端
安装redis和phpredis模块一例
订阅redis接收的json字符串斜杠_用 Golang 实现基于 Redis 的安全高效 RPC 通信
NOSQL - Redis 基础
API接口之安全篇
Redis安装配置教程
三分钟读懂redis数据库
[关闭]