Redis数据库与GO完结篇:redis操作总结与GO使用redis

一、redis操作总结

由于写redis命令的时候有提示符,所以下表只给出命令名称

数据类型 操作 简介
字符串 GET, SET, MGET, MSET, SETEX,DEL 最基本的数据类型,存储任意二进制数据,支持简单操作和原子计数。适合存储重复数据。
哈希 HSET, HGET, HDEL, HMSET, HMGET, HEXISTS,HGETALL,HLEN 键值对集合,适合存储对象,支持字段操作。可存储重复字段。
列表 LPUSH, RPUSH, LPOP, RPOP, LRANGE, LSET, LREM 有序字符串集合,支持双向操作,适合实现消息队列,允许重复元素。
集合 SADD, SREM, SMEMBERS, SISMEMBER 无序唯一元素集合,不允许重复,支持集合运算,适合实现标签和用户兴趣。
有序集合 ZADD, ZREM, ZRANGE 带分数的有序集合,不允许重复,支持范围查询和排序,适合实现排行榜等。

二、GO连接redis

go-redis 支持 2 个最新的 go 版本且依赖Go modules,如果你还没有 go mod,你需要首先初始化:

go 复制代码
go mod init github.com/my/repo

安装 go-redis/v9 (支持所有的 redis 版本):

go 复制代码
go get github.com/redis/go-redis/v9

参考链接:GO REDIS快速入门

然后导包即可使用redis:import "github.com/redis/go-redis/v9"

GO链接redis分为以下几步:

1.配置链接信息

go 复制代码
opts := redis.Options{
	Addr:     "localhost:6379", // Redis 服务器地址和端口
	Password: "",               // Redis 密码,默认为空
	DB:       0,                // Redis 数据库编号,默认为 0
}

2.创建客户端

go 复制代码
rdb := redis.NewClient(&opts)

3.创建上下文

go 复制代码
ctx := context.Background()

4.测试连接

go 复制代码
_, err := rdb.Ping(ctx).Result()
if err != nil {
	fmt.Println("连接 Redis 失败!")
	return
}
fmt.Println("连接 Redis 成功!")

操作2-4都已被本人封装在一个函数中:

go 复制代码
// 创建 Redis 客户端并返回客户端和上下文
func ConnectRedis(opts *redis.Options) (*redis.Client, context.Context, error) {
	// 创建 Redis 客户端
	rdb := redis.NewClient(opts)

	// 创建上下文
	ctx := context.Background()

	// 测试连接
	_, err := rdb.Ping(ctx).Result()
	if err != nil {
		fmt.Println("连接 Redis 失败!")
		return nil, nil, err
	}
	fmt.Println("连接 Redis 成功!")

	return rdb, ctx, nil
}

本人已在自定义包中定义此函数,这样,用户无需每次手动测试链接。自定义包已部署在gitee上,读者可通过go get+本人的项目地址获取,项目地址:my_gopkg。使用前建议阅读README。

三、GO操作redis

go-redis封装的函数名和redis语句是一样的,传参除了传入上下文变量也是一样的,只是调用函数时多了Err()和Result()。Result()用于获取 Redis 命令的返回值。Err()用于获取命令执行的错误信息。

数据类型以哈希表为例,GO链接,操作redis的完整代码如下:

go 复制代码
package main

import (
	"context"
	"fmt"
	"time"

	"github.com/redis/go-redis/v9"
)

// ConnectRedis 创建 Redis 客户端并返回客户端和上下文
func ConnectRedis(opts *redis.Options) (*redis.Client, context.Context, error) {
	// 创建 Redis 客户端
	rdb := redis.NewClient(opts)

	// 创建上下文
	ctx := context.Background()

	// 测试连接
	_, err := rdb.Ping(ctx).Result()
	if err != nil {
		fmt.Println("连接 Redis 失败!")
		return nil, nil, err
	}
	fmt.Println("连接 Redis 成功!")

	return rdb, ctx, nil
}
func main() {
	// 配置链接信息
	opts := redis.Options{
		Addr:     "localhost:6379", // Redis 服务器地址和端口
		Password: "",               // Redis 密码,默认为空
		DB:       0,                // Redis 数据库编号,默认为 0
	}
	rdb, ctx, err := ConnectRedis(&opts)
	if err != nil {
		return
	}
	// 创建用户
	err = rdb.HSet(ctx, "myhash", "name", "张三", "age", 30).Err()
	if err != nil {
		fmt.Println("创建用户失败:", err)
		return
	}
	fmt.Println("用户创建成功")

	// 获取用户信息
	userInfo, err := rdb.HGetAll(ctx, "myhash").Result()
	if err != nil {
		fmt.Println("获取用户信息失败:", err)
		return
	}
	fmt.Println("用户信息:", userInfo)

	// 更新用户信息
	err = rdb.HSet(ctx, "myhash", "name", "李四", "age", 25).Err()
	if err != nil {
		fmt.Println("更新用户信息失败:", err)
		return
	}
	fmt.Println("用户信息更新成功")

	// 再次获取用户信息以查看更新效果
	updatedInfo, err := rdb.HGetAll(ctx, "myhash").Result()
	if err != nil {
		fmt.Println("获取更新后的用户信息失败:", err)
		return
	}
	fmt.Println("更新后的用户信息:", updatedInfo)

	// 设置键的过期时间为5秒
	err = rdb.Expire(ctx, "myhash", 5*time.Second).Err()
	if err != nil {
		fmt.Println("设置过期时间失败:", err)
		return
	}
	fmt.Println("设置过期时间成功")

	// 等待6秒
	time.Sleep(6 * time.Second)

	// 再次尝试获取哈希值(预期为空,因为键已过期)
	result, err := rdb.HGetAll(ctx, "myhash").Result()
	if err != nil {
		fmt.Println("获取用户信息失败:", err)
		return
	}
	if len(result) == 0 {
		fmt.Println("键已过期,无法获取用户信息")
	} else {
		fmt.Println("用户信息:", result)
	}

	// 删除用户信息
	err = rdb.Del(ctx, "myhash").Err()
	if err != nil {
		fmt.Println("删除用户信息失败:", err)
		return
	}
	fmt.Println("用户信息删除成功")
}
相关推荐
我命由我123451 小时前
Derby - Derby 服务器(Derby 概述、Derby 服务器下载与启动、Derby 连接数据库与创建数据表、Derby 数据库操作)
java·运维·服务器·数据库·后端·java-ee·后端框架
好学且牛逼的马2 小时前
Redisson 的分布式锁机制&幽默笑话理解
redis·分布式
RestCloud3 小时前
达梦数据库到Greenplum:用ETL工具实现数据仓库迁移
数据库·数据仓库·etl·达梦数据库·数据传输·greenplum
Boilermaker19923 小时前
【Redis】集群与分布式缓存
java·数据库·redis·1024程序员节
千码君20163 小时前
Go语言:解决 “package xxx is not in std”的思路
开发语言·后端·golang
Ypuyu4 小时前
【GoLang】【框架学习】【GORM】4. 使用 BeforeUpdate hook 操作时,出现反射报错
开发语言·学习·golang
武子康4 小时前
Java-163 MongoDB 生产安全加固实战:10 分钟完成认证、最小权限、角色详解
java·数据库·分布式·mongodb·性能优化·系统架构·nosql
zhangyifang_0094 小时前
PostgreSQL 的表继承与分区
数据库·postgresql
金仓拾光集4 小时前
国产化转型实战:制造业供应链物流系统从MongoDB至金仓数据库迁移全指南
数据库·mongodb·数据库平替用金仓·金仓数据库
脚踏实地的大梦想家4 小时前
【Go】P17 Go语言并发编程核心:深入理解 Goroutine (从入门到实战)
java·开发语言·golang