redis在Go项目中的使用

redis安装

windows docker 安装 史上最详细Docker安装Redis (含每一步的图解)实战_docker redis_宁在春的博客-优快云博客

ifconfig | grep "inet " | grep -v 127.0.0.1

redis mac docker 安装 mac系统Docker安装Redis教程

docker run -d --name redis -p 6379:6379 redis:6.2.4 redis-server --appendonly yes --requirepass "zxcv123"

  • docker run -d :后台运行
  • --name redis:服务名
  • -p 6379:6379    : 将容器6379端口映射到主机6379端口
  • redis-server --appendonly yes:在容器执行redis-server启动命令,并打开redis持久化配置
  • --requirepass "你的密码" :设置密码

docker exec -ti 95b40 redis-cli

127.0.0.1:6379

发现提示(error) NOAUTH Authentication required.这是因为需要输入密码进行验证。解决方案:auth 你的密码

quit 退出

Tips:远程连接时,如果不知道容器运行的地址,可以通过这个命令查看:

docker inspect redis | grep IPAddress

docker inspect --format '{{ .NetworkSettings.IPAddress}}' id

docker inspect

Redis的基本使用

说明:Redis安装好后,默认有16个数据库,初始默认使用0号库,标号是0…15

1.添加key-val[set]

2.查看当前redis的所有key [keys*]

3.获取key对应的值.[get key]

4.切换redis数据库[select index]

5.如何查看当前数据库的key-val数量[dbsize]

6.清空当前数据库的key-val和清空所有数据库的key-val[flushdb flushall]

Go链接到Redis

cache/common.go  初始化

var RedisClient *redis.Client   设定全局变量

package cache

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

var RedisClient *redis.Client

func RedisInit() {
	rConfig := config.Config.Redis
	client := redis.NewClient(&redis.Options{
		Addr:     fmt.Sprintf("%s:%s", rConfig.RedisHost, rConfig.RedisPort),
		Password: rConfig.RedisPassword,
		DB:       rConfig.RedisDbName,
	})
	_, err := client.Ping().Result()
	if err != nil {
		panic(err)

	}
	RedisClient = client
}

config/local/ config.yaml


system:
  domain: Todolist
  version: 1.0
  appEnv: "test"
  HttpPort: ":4000"
  Host: "localhost"

mysql:
  default:
    dialect: "mysql"
    dbhost: "你的host"
    dbport: "你的端口"
    dbName: "你的数据库名字"
    userName: ""
    password: "你的密码"
    charset: "utf8mb4"

redis:
  redisDbName: 1    使用的哪一个数据库  0-15  一共16个
  redisHost: 你的host  这里不用引号
  redisPort: 端口
  redisPassword: 密码
  redisNetwork: tcp

config/config.go

package config

import (
	"github.com/spf13/viper"
	"os"
)

var Config *Conf

type Conf struct {
	System *System           `yaml:"system"`
	MySql  map[string]*MySql `yaml:"mysql"`
	Redis  *Redis            `yaml:"redis"`
}

type MySql struct {
	Dialect  string `yaml:"dialect"`
	DbHost   string `yaml:"dbHost"`
	DbPort   string `yaml:"dbPort"`
	DbName   string `yaml:"dbName"`
	UserName string `yaml:"userName"`
	Password string `yaml:"password"`
	Charset  string `yaml:"charset"`
}

type Redis struct {
	RedisHost     string `yaml:"redisHost"`
	RedisPort     string `yaml:"redisPort"`
	RedisPassword string `yaml:"redisPassword"`
	RedisDbName   int    `yaml:"redisDbName"`
	RedisNetwork  string `yaml:"redisNetwork"`
}

type System struct {
	AppEnv   string `yaml:"appEnv"`
	Domain   string `yaml:"domain"`
	Version  string `yaml:"version"`
	HttpPort string `yaml:"httpPort"`
	Host     string `yaml:"host"`
}

func InitConfig() {
	workDir, _ := os.Getwd()
	viper.SetConfigName("config")
	viper.SetConfigType("yaml")
	viper.AddConfigPath(workDir + "/config/local")
	viper.AddConfigPath(workDir)
	err := viper.ReadInConfig()
	if err != nil {
		panic(err)
	}
	err = viper.Unmarshal(&Config)
	if err != nil {
		panic(err)
	}
}

这里这个InitConfig 方法 一般都是在main 中初始化使用

cache/key.go  KEY

package cache

import (
	"fmt"
	"strconv"
)

const (
	RankKey = "rank"
)

// TaskViewKey 点击数的key
func TaskViewKey(id uint) string {
	//key ="view:task:%s"   s为id  get key 可查找 对应的value
	return fmt.Sprintf("view:task:%s", strconv.Itoa(int(id)))
}

model/task.go

  1. View() 方法:

    • 这个方法用于获取任务的点击数。
    • 它首先尝试从 Redis 缓存中使用任务的 ID 作为缓存键获取点击数。
    • 如果成功从 Redis 获取到点击数的字符串表示 (countStr),然后使用 strconv.ParseUint 将其转换为无符号 64 位整数 (count)。
    • 最后,它将点击数作为返回值返回。
  2. AddView() 方法:

    • 这个方法用于增加任务的点击数。
    • 它使用 cache.RedisClient.Incr 方法递增任务的点击数,这意味着它会将点击数加一。
    • 接着,它使用 cache.RedisClient.ZIncrBy 方法,通过指定一个排行榜的键 (cache.RankKey) 和任务的 ID,来递增排行榜中的点击数。这可能用于跟踪任务的热门程度或排名。

总之,这两个方法共同用于管理任务的点击数,将点击数存储在 Redis 缓存中,以便快速检索和更新。

绑定了只有task model模型才能使用的方法

func (Task *Task) View() uint64 {
	// 增加点击数
    
	countStr, _ := cache.RedisClient.Get(cache.TaskViewKey(Task.ID)).Result()
	count, _ := strconv.ParseUint(countStr, 10, 64)
	return count
}

func (Task *Task) AddView() {
	cache.RedisClient.Incr(cache.TaskViewKey(Task.ID))                      // 增加视频点击数
	cache.RedisClient.ZIncrBy(cache.RankKey, 1, strconv.Itoa(int(Task.ID))) // 增加排行点击数
}

逻辑

func (s *TaskSrv) ShowTask(ctx context.Context, req *types.ShowTaskReq) (resp interface{}, err error) {
	u, err := ctl.GetUserInfo(ctx)
	if err != nil {
		utils.LogrusObj.Info(err)
		return
	}
	task, err := dao.NewTaskDao(ctx).FindTaskByIdAndUserId(req.Id, u.Id)
	if err != nil {
		utils.LogrusObj.Info(err)
		return
	}
	task.AddView()
	tResp := &types.ListTaskResp{
		Id:        task.ID,
		Title:     task.Title,
		Content:   task.Content,
		View:      task.View(), //放在内存中 定时写入数据库
		Status:    task.Status,
		CreatedAt: task.CreatedAt.Unix(),
		StartTime: task.StartTime,
		EndTime:   task.EndTime,
	}

	return ctl.RespSuccessWithData(tResp), nil

}

Go 语言中使用 Redis,通常会借助 Redis 客户端库来实现。目前较为流行的是 `go-redis` 库,它不仅性能高效,而且支持 Redis 的多种功能,包括基本数据结构操作、事务、流水线等[^3]。以下是一个完整的使用指南和示例代码,涵盖基础操作和 Lua 脚本执行。 ### 连接 Redis 数据库 首先,需要导入 `go-redis` 库,并建立与 Redis 服务器的连接。以下是一个基本的连接示例: ```go package main import ( "context" "fmt" "github.com/redis/go-redis/v9" ) func main() { ctx := context.Background() rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", // Redis 服务器地址 Password: "", // 无密码 DB: 0, // 使用默认数据库 }) // 检查是否连接成功 _, err := rdb.Ping(ctx).Result() if err != nil { fmt.Println("Failed to connect to Redis:", err) return } fmt.Println("Connected to Redis") } ``` ### 基本操作 Redis 支持多种数据结构,包括字符串、哈希、列表、集合等。以下是一些常见的操作示例: #### 设置和获取键值 ```go // 设置键值 err := rdb.Set(ctx, "key", "value", 0).Err() if err != nil { fmt.Println("Failed to set key:", err) return } // 获取键值 val, err := rdb.Get(ctx, "key").Result() if err != nil { fmt.Println("Failed to get key:", err) return } fmt.Println("key:", val) ``` #### 操作哈希表 ```go // 设置哈希字段 err = rdb.HSet(ctx, "hashKey", map[string]interface{}{ "field1": "value1", "field2": "value2", }).Err() if err != nil { fmt.Println("Failed to set hash:", err) return } // 获取哈希字段 hashVal, err := rdb.HGetAll(ctx, "hashKey").Result() if err != nil { fmt.Println("Failed to get hash:", err) return } fmt.Println("hashKey:", hashVal) ``` ### 使用 Lua 脚本 Redis 支持使用 Lua 脚本来执行复杂的操作。以下是一个使用 `go-redis` 执行 Lua 脚本的示例: ```go // 定义 Lua 脚本 script := ` redis.call('SET', KEYS[1], ARGV[1]) local value = redis.call('GET', KEYS[1]) return value ` // 执行 Lua 脚本 result, err := rdb.Eval(ctx, script, []string{"mykey"}, "myvalue").Result() if err != nil { fmt.Println("Failed to execute Lua script:", err) return } fmt.Println("Script execution result:", result) ``` ### 使用连接池 `go-redis` 提供了内置的连接池功能,可以有效地管理和复用连接,从而提高性能。以下是一个配置连接池的示例: ```go rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", DB: 0, PoolSize: 10, // 设置连接池大小 MinIdleConns: 5, // 最小空闲连接数 }) ``` ### 错误处理 在实际应用中,必须对可能出现的错误进行处理。例如,当 Redis 服务器不可用或操作超时时,应有相应的容错机制。 ```go val, err := rdb.Get(ctx, "nonexistentKey").Result() if err == redis.Nil { fmt.Println("Key does not exist") } else if err != nil { fmt.Println("Error:", err) } else { fmt.Println("Value:", val) } ``` ### 总结 通过 `go-redis` 库,开发者可以方便地在 Go 语言中集成 Redis,实现高性能的数据存储和访问。无论是基础的键值操作,还是更复杂的 Lua 脚本执行,`go-redis` 都提供了简单易用的 API。此外,其内置的连接池机制和活跃的社区支持,使得它成为 Go 项目中首选的 Redis 客户端库[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值