一、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("用户信息删除成功")
}