一、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 mod init github.com/my/repo
安装 go-redis/v9 (支持所有的 redis 版本):
go get github.com/redis/go-redis/v9
参考链接:GO REDIS快速入门
然后导包即可使用redis:import "github.com/redis/go-redis/v9"
GO链接redis分为以下几步:
1.配置链接信息
opts := redis.Options{
Addr: "localhost:6379", // Redis 服务器地址和端口
Password: "", // Redis 密码,默认为空
DB: 0, // Redis 数据库编号,默认为 0
}
2.创建客户端
rdb := redis.NewClient(&opts)
3.创建上下文
ctx := context.Background()
4.测试连接
_, err := rdb.Ping(ctx).Result()
if err != nil {
fmt.Println("连接 Redis 失败!")
return
}
fmt.Println("连接 Redis 成功!")
操作2-4都已被本人封装在一个函数中:
// 创建 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的完整代码如下:
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("用户信息删除成功")
}