导航

go实现本地 redis 的增删改查

Posted on 2025-06-03 19:19  Zyeah  阅读(38)  评论(0)    收藏  举报

主要参考文章:https://www.oryoy.com/news/golang-shi-xian-redis-shu-ju-ku-de-zeng-shan-gai-cha-cao-zuo-xiang-jie-yu-shi-jian-an-li.html
写的比较简单

一、连接数据库

因为启用了gomodule,所以直接import库,然后修正缺乏依赖,就会自动装了

import (
	"context"
	"fmt"
	"github.com/go-redis/redis/v8"
)
func main() {
	rdb := redis.NewClient(&redis.Options{
		Addr:     "localhost:6379",
		Password: "", // no password 没设密码就为空
		DB:       0,  // use default DB
	})
	pong, err := rdb.Ping(ctx).Result()
	if err != nil {
		fmt.Println("Error connecting to Redis:", err)
		return
	}
	fmt.Println("Redis connected:", pong)
}

ping查看是否成功
Redis 支持 多个逻辑数据库(默认 16 个,编号从 0 到 15),通过 DB 编号区分。
DB: 0 是 默认数据库,即代码中 Options.DB: 0 指定的数据库。

其中的context

Context 简介
context.Context 是 Go 语言中用于处理请求生命周期的核心接口,主要用于:
控制 请求的取消 / 超时(如设置操作的超时时间)。
传递 请求范围内的元数据(如用户认证信息)。
跨 goroutine 传递 取消信号,避免资源泄漏。
context.Background()
这是一个 空的 Context,作为所有 Context 的 根节点,通常用于 程序入口(如 main 函数)或 没有父 Context 可用的场景。
它 不可取消、没有截止时间、也没有携带任何值,仅作为 Context 链的起点。

二、增删查改

2.0 数据格式

redies一定是key和value,其中key固定为字符串类型。
值(Value) 支持五种基本类型:
字符串(String)
哈希(Hash)
列表(List)
集合(Set)
有序集合(Sorted Set)

所以对于结构体,可以把它:

  • 拼接成字符串
  • 用哈希hset存储
  • 用json字符串

2.1 本身redis

基本是通过get、set、delete方法去实现。
对于修改即update基本上是用set覆盖key的对应键值

简单的学生管理系统代码:

// 学生信息管理
var ctx = context.Background()

type Student struct {
	ID   string
	Name string
	Age  int
}

func addStudent(rdb *redis.Client, student Student) {
	key := "student:" + student.ID
	value := fmt.Sprintf("%s:%d", student.Name, student.Age)
	err := rdb.Set(ctx, key, value, 0).Err()
	if err != nil {
		fmt.Println("添加学生失败:", err)
		return
	}
	fmt.Println("添加学生成功")
}
func getStudent(rdb *redis.Client, studentID string) {
	key := "student:" + studentID
	value, err := rdb.Get(ctx, key).Result()
	if err != nil {
		fmt.Println("获取失败", err)
		return
	}
	fmt.Println("获取学生信息成功:", studentID, "值:", value)
}
func updateStudent(rdb *redis.Client, student Student) {
	key := "student:" + student.ID
	value := fmt.Sprintf("%s:%d", student.Name, student.Age)
	err := rdb.Set(ctx, key, value, 0).Err()
	if err != nil {
		fmt.Println("更新学生信息失败:", err)
		return
	}
	fmt.Println("更新学生信息成功")
}
func deleteStudent(rdb *redis.Client, studentID string) {
	key := "student:" + studentID
	err := rdb.Del(ctx, key).Err()
	if err != nil {
		fmt.Println("删除学生信息失败:", err)
		return
	}
	fmt.Println("删除学生信息成功:", studentID)
}
func main() {
	rdb := redis.NewClient(&redis.Options{
		Addr:     "localhost:6379",
		Password: "", // no password
		DB:       0,  // use default D
	})
	student := Student{ID: "2", Name: "bob", Age: 30}

	addStudent(rdb, student)
	getStudent(rdb, "1")
	updateStudent(rdb, Student{ID: "1", Name: "Alice", Age: 25})
	getStudent(rdb, "1")
}