Golang 通过开源库 go-redis 操作 NoSQL 缓存服务器

news/2024/7/10 21:11:43 标签: 缓存, golang, 开源

前置条件:

1、导入库:

import (

"github.com/go-redis/redis/v8"

)

2、搭建哨兵模式集群

具体可以百度、谷歌搜索,网上现成配置教程太多了,不行还可以搜教程视频,跟着视频博主一步一个慢动作,慢慢整。

本文只介绍通过 “主从架构 / 哨兵模式” 访问的形式,这是因为,单个 redis 服务器在线上正式服务器,真实的生产环境之中是不太现实的。

好的:

1、首先定义一个 RedisClient 结构

type RedisClient struct {
	MasterName    string
	SentinelAddrs []string
	Password      string
	DB            int
	Client        *redis.Client
}

2、其次实现一个 FailoverClient(Redis 哨兵客户端)

func (my *RedisClient) NewFailoverClient() *redis.Client {
	sf := &redis.FailoverOptions{
		MasterName:    my.MasterName,       // 主节点名称
		SentinelAddrs: my.SentinelAddrs,    // 哨兵服务器地址列
		Password:      my.Password,         // 登入密码
		DB:            my.DB,               // 访问那一个DB(从0开始,缺省为0)
	}

	return redis.NewFailoverClient(sf)
}

Redis 哨兵服务器地址列表: 

    SentinelAddrs := []string{"172.31.109.138:20000",

        "172.31.109.138:20001",

        "172.31.109.138:20002"}

注意:

不是 Redis Master / Slaves 服务器地址,是哨兵服务器地址,即通过指定 --sentinel 运行的 redis-server 服务器绑定侦听的 IPEndPoint 地址。

这是因为,哨兵客户端通过链接哨兵服务器来获取当前的 redis-server 信息,如当前的 master 节点地址端点。

同样的主观下线、客观下线,我们并不需要单独进行处理,go-redis 库会自动为我们进行切换,当然,若希望在 go 程式之中捕获 master 节点主观下线事件,可以适用 AddHook 添加钩子方法。

package main

import (
	"fmt"
	"github.com/go-redis/redis/v8"
)

func main() {
	sentinelClient := redis.NewSentinelClient(&redis.Options{
		Addr: "sentinel-ip:port",
	})

	sentinelClient.AddHook(redis.NewFailoverHook(func(oldMaster, newMaster *redis.Client) {
		// 处理主观下线事件
		fmt.Printf("Master changed from %s to %s\n", oldMaster.Options().Addr, newMaster.Options().Addr)
	}))

	masterClient := sentinelClient.MasterFor("mymaster", nil)

	val, err := masterClient.Get(ctx, "key").Result()
	if err != nil {
		fmt.Println("Error:", err)
		return
	}

	fmt.Println("Value:", val)
}

3、构造 RedisClient 结构体

func NewRedisClient(master_name, password string, addresses []string, db int) *RedisClient {
	sentinel := RedisClient{
		MasterName:    master_name,
		SentinelAddrs: addresses,
		Password:      password,
		DB:            db,
	}

	sentinel.Client = sentinel.NewFailoverClient()
	return &sentinel
}

4、实现关闭 Redis 客户端接口

func (my *RedisClient) Close() {
	client := my.Client
	if client != nil {
		client.Close()
	}
}

5、实现 Ping 函数,测试服务器节点在线与否,但需要注意:多个节点之中若有一个节点反馈OK,都算是成功,所以不要过于信任该函数提供的服务器正常的反馈。

func (my *RedisClient) Close() {
	client := my.Client
	if client != nil {
		client.Close()
	}
}

6、Pipeline(管线)

func (my *RedisClient) Pipeline() (redis.Pipeliner, error) {
	client := my.Client
	if client == nil {
		return nil, fmt.Errorf("redis client connect is nil")
	}

	pipe := client.Pipeline()
	return pipe, nil
}

如何调用 Pipeline 管线?它是 Redis 之中一种批量执行写数据操作的机制,即人们可以一次性执行多个SET数据命令,并通过 Pipeline 一次性提交到 redis 服务器进行执行。

例:

	// 创建管线
	pipeline, err := my.redis.Pipeline()
	if err != nil {
		return err
	}
    
    ctx := context.Background()
	err := pipeline.Set(ctx, key, json, time.Second*time.Duration(USER_CACHE_TIMEOUT)).Err()
    if err != nil {
		return err
	}

    // 如果设置了命令则执行,否则可以忽略。
    bant := true
	if bany {
		_, err = pipeline.Exec(context.Background())
		if err != nil {
			return err
		}
	}


http://www.niftyadmin.cn/n/5340441.html

相关文章

【GitHub项目推荐--基于 Flutter 的游戏引擎】【转载】

Flame 引擎的目的是为使用 Flutter 开发的游戏会遇到的常见问题提供一套完整的解决方案。 目前 Flame 提供了以下功能: 游戏循环 (game loop) 组件/对象系统 (FCS) 特效与粒子效果 碰撞检测 手势和输入支持 图片、动画、精灵图 (sprite) 以及精灵图组 一些简化…

FPGA之分布式RAM(2)

1) 128 X1 Single Port Distributed RAM 下图中可以看出来,通过2个LUT的组合使用可以串联实现更大深度的分布式RAM.下图中出现了F7BMUX的加入, F7BMUX可以用于LUT输出的选通. 原语调用: RAM128XIS#(INIT(128h00000000000000000000000000000000) // Initial conten…

笨蛋学设计模式行为型模式-状态模式【20】

行为型模式-状态模式 8.7状态模式8.7.1概念8.7.2场景8.7.3优势 / 劣势8.7.4状态模式可分为8.7.5状态模式8.7.6实战8.7.6.1题目描述8.7.6.2输入描述8.7.6.3输出描述8.7.6.4代码 8.7.7总结 8.7状态模式 8.7.1概念 ​ 状态模式是指对象在运行时可以根据内部状态的不同而改变它们…

vue3前端开发,如何引入element-plus前端框架及配置参数

vue3前端开发,如何引入element-plus前端框架及配置参数!这是一个简单的教程,帮助大家快速在自己的项目中引入element-plus框架。 主要是介绍的引入流程和参数的配置情况。 如图,这个就是elment-plus前端框架里面的一个主按钮展示。表示我们配…

常用的gpt-4 prompt words收集4

1. it poses a certain risk to my work 这对我来说是一个风险点 2. one point to note is that 需要说的一个问题是 3. What is the English phonetic transcription of ‘emoji’? emoji的音标是什么? 4. it would be best if you can insert some proper …

从零开始:Ubuntu Server中MySQL 8.0的安装与Django数据库配置详解

Ubuntu系统纯净安装MySQL8.0 1、安装Mysql8.0 sudo apt install mysql-server2、检查MySQL状态 sudo systemctl status mysql如下所示看见Active: active (running)说明mysql状态正常 ● mysql.service - MySQL Community ServerLoaded: loaded (/lib/systemd/system/mysql…

【笔记】Disable APN 禁用数据连接的逻辑(Android KaiOS)

简介 通过OTA/OMADM 运营商服务器可以下发消息实现disable APN,从而影响Data PDN建立。APN被disable了会导致无法正常上网。 在Android 和 KaiOS 系统实现上有区别,不过都是通过carrier_enabled 这类字段实现判断控制。 Android:上层 Tele…

多维时序 | Matlab实现CNN-GRU-Mutilhead-Attention卷积门控循环单元融合多头注意力机制多变量时间序列预测

多维时序 | Matlab实现CNN-GRU-Mutilhead-Attention卷积门控循环单元融合多头注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现CNN-GRU-Mutilhead-Attention卷积门控循环单元融合多头注意力机制多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍…