go-redis 使用指南
go-redis 是一个用于 Go 语言的 Redis 客户端库,它提供了对 Redis 命令的封装,使得在 Go 程序中可以方便地与 Redis 进行交互。go-redis 支持 Redis 的所有数据结构和命令。下面是 go-redis 中常用的方法和存储的数据结构的简要说明:
1. 连接与配置
NewClient(opt *Options) *Client: 创建一个新的 Redis 客户端实例。Options: 配置 Redis 连接的选项,包括地址、密码、数据库编号等。
2. 基本命令
Set(key string, value interface{}, expiration time.Duration) *StatusCmd: 设置键值对,并可以设置过期时间。Get(key string) *StringCmd: 获取指定键的值。Del(keys ...string) *IntCmd: 删除一个或多个键。Exists(keys ...string) *IntCmd: 检查一个或多个键是否存在。Expire(key string, expiration time.Duration) *BoolCmd: 设置键的过期时间。TTL(key string) *DurationCmd: 获取键的剩余生存时间。Incr(key string) *IntCmd: 将键的值增加 1。Decr(key string) *IntCmd: 将键的值减少 1。
3. 字符串操作
Append(key string, value string) *IntCmd: 将值追加到键的现有值的末尾。GetRange(key string, start, end int64) *StringCmd: 获取键值的子字符串。SetRange(key string, offset int64, value string) *IntCmd: 从指定偏移量开始,覆盖键值的一部分。StrLen(key string) *IntCmd: 获取键值的长度。
4. 哈希操作
HSet(key string, values ...interface{}) *IntCmd: 设置哈希表中的字段和值。HGet(key, field string) *StringCmd: 获取哈希表中指定字段的值。HGetAll(key string) *StringStringMapCmd: 获取哈希表中所有字段和值。HDel(key string, fields ...string) *IntCmd: 删除哈希表中的一个或多个字段。HExists(key, field string) *BoolCmd: 检查哈希表中是否存在指定字段。HIncrBy(key, field string, incr int64) *IntCmd: 将哈希表中字段的值增加指定的整数。
5. 列表操作
LPush(key string, values ...interface{}) *IntCmd: 将一个或多个值插入到列表的头部。RPush(key string, values ...interface{}) *IntCmd: 将一个或多个值插入到列表的尾部。LPop(key string) *StringCmd: 移除并返回列表的第一个元素。RPop(key string) *StringCmd: 移除并返回列表的最后一个元素。LRange(key string, start, stop int64) *StringSliceCmd: 获取列表中指定范围的元素。LLen(key string) *IntCmd: 获取列表的长度。
6. 集合操作
SAdd(key string, members ...interface{}) *IntCmd: 向集合中添加一个或多个成员。SMembers(key string) *StringSliceCmd: 获取集合中的所有成员。SRem(key string, members ...interface{}) *IntCmd: 从集合中移除一个或多个成员。SIsMember(key string, member interface{}) *BoolCmd: 检查成员是否存在于集合中。SCard(key string) *IntCmd: 获取集合的成员数量。
7. 有序集合操作
ZAdd(key string, members ...Z) *IntCmd: 向有序集合中添加一个或多个成员。ZRange(key string, start, stop int64) *StringSliceCmd: 获取有序集合中指定范围的成员。ZRangeByScore(key string, opt ZRangeBy) *StringSliceCmd: 根据分数范围获取有序集合中的成员。ZRem(key string, members ...interface{}) *IntCmd: 从有序集合中移除一个或多个成员。ZScore(key, member string) *FloatCmd: 获取有序集合中指定成员的分数。
8. 发布/订阅
Subscribe(channels ...string) *PubSub: 订阅一个或多个频道。Publish(channel string, message interface{}) *IntCmd: 向指定频道发布消息。PSubscribe(patterns ...string) *PubSub: 订阅与指定模式匹配的频道。
9. 事务
TxPipeline() Pipeliner: 开始一个事务管道。Exec() ([]Cmder, error): 执行事务中的所有命令。
10. 管道
Pipeline() Pipeliner: 创建一个管道,允许批量执行多个命令。Pipelined(fn func(Pipeliner) error) ([]Cmder, error): 在管道中执行一系列命令。
11. 脚本
Eval(script string, keys []string, args ...interface{}) *Cmd: 执行 Lua 脚本。EvalSha(sha1 string, keys []string, args ...interface{}) *Cmd: 执行缓存的 Lua 脚本。
12. 其他
Ping() *StatusCmd: 检查与 Redis 服务器的连接是否正常。Close() error: 关闭与 Redis 服务器的连接。
存储的数据结构
- 字符串 (String): 最简单的数据类型,存储字符串或二进制数据。
- 哈希 (Hash): 类似于字典,存储字段和值的映射。
- 列表 (List): 有序的字符串列表,支持从两端插入和弹出。
- 集合 (Set): 无序的字符串集合,支持集合运算。
- 有序集合 (Sorted Set): 类似于集合,但每个成员关联一个分数,用于排序。
总结
go-redis 提供了丰富的 API 来操作 Redis 的各种数据结构和命令。通过这些方法,你可以轻松地在 Go 程序中实现缓存、队列、分布式锁等功能。
redis 数据结构详解
字符串 (String)
字符串 (String) 是最简单的数据类型,存储字符串或二进制数据。它是一对一的关系,即一个键对应一个值。
示例
// 存储字符串
err := rdb.Set(ctx, "user:1:name", "Alice", 0).Err()
if err != nil {
panic(err)
}
// 获取字符串
name, err := rdb.Get(ctx, "user:1:name").Result()
if err != nil {
panic(err)
}
fmt.Println("User Name:", name)
在这个例子中,键 user:1:name 对应值 Alice,这是一对一的关系。
哈希 (Hash)
哈希 (Hash) 类似于字典,存储字段和值的映射。它是一对多的关系,即一个键对应多个字段和值。 哈希 (Hash) 类似于字典,存储字段和值的映射。它适用于存储对象的多个属性,每个属性对应一个字段和值。
特点
-
结构化存储: 哈希适合存储结构化的数据,如用户信息、配置信息等。
-
高效读写: 对于单个字段的读写操作非常高效。
-
内存优化: Redis 对哈希的内存使用进行了优化,适合存储大量小对象。 示例
// 存储哈希
err := rdb.HSet(ctx, "user:1", "name", "Alice", "age", 30, "email", "alice@example.com").Err()
if err != nil {
panic(err)
}
// 获取哈希中的所有字段和值
userInfo, err := rdb.HGetAll(ctx, "user:1").Result()
if err != nil {
panic(err)
}
fmt.Println("User Info:", userInfo)
在这个例子中,键 user:1 对应多个字段和值(name, age, email),这是一对多的关系。
列表 (List)
列表 (List) 是有序的字符串列表,支持从两端插入和弹出。它是一对多的关系,即一个键对应多个元素。
列表 (List) 是有序的字符串列表,支持从两端插入和弹出。它适用于存储有序的元素集合,如任务队列、消息队列等。
特点
-
有序性: 列表中的元素是有序的,可以按插入顺序访问。
-
双端操作: 支持从列表的两端进行插入和弹出操作,适合实现栈和队列。
-
阻塞操作: 支持阻塞式弹出操作,适合实现消息队列。
示例
// 存储列表
err := rdb.LPush(ctx, "tasks", "task1", "task2", "task3").Err()
if err != nil {
panic(err)
}
// 获取列表中的所有元素
tasks, err := rdb.LRange(ctx, "tasks", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println("Tasks:", tasks)
在这个例子中,键 tasks 对应多个元素(task1, task2, task3),这是一对多的关系。
集合 (Set)
集合 (Set) 是无序的字符串集合,支持集合运算。它是一对多的关系,即一个键对应多个元素。
集合 (Set) 是无序的字符串集合,支持集合运算。它适用于存储不重复的元素集合,如标签、好友列表等。
特点
-
无序性: 集合中的元素是无序的,不支持按索引访问。
-
唯一性: 集合中的元素是唯一的,不会重复。
-
集合运算: 支持交集、并集、差集等集合运算,适合实现标签、好友关系等功能。 示例
// 存储集合
err := rdb.SAdd(ctx, "tags", "tag1", "tag2", "tag3").Err()
if err != nil {
panic(err)
}
// 获取集合中的所有元素
tags, err := rdb.SMembers(ctx, "tags").Result()
if err != nil {
panic(err)
}
fmt.Println("Tags:", tags)
在这个例子中,键 tags 对应多个元素(tag1, tag2, tag3),这是一对多的关系。
有序集合 (Sorted Set)
有序集合 (Sorted Set) 类似于集合,但每个成员关联一个分数,用于排序。它是一对多的关系,即一个键对应多个成员和分数。
有序集合 (Sorted Set) 类似于集合,但每个成员关联一个分数,用于排序。它适用于存储有序的元素集合,如排行榜、时间线等。
特点
-
有序性: 有序集合中的元素是按分数排序的,可以按分数范围访问。
-
唯一性: 有序集合中的元素是唯一的,不会重复。
-
分数排序: 每个元素关联一个分数,适合实现排行榜、时间线等功能。 示例
// 存储有序集合
err := rdb.ZAdd(ctx, "scores", &redis.Z{Score: 90, Member: "Alice"}, &redis.Z{Score: 85, Member: "Bob"}).Err()
if err != nil {
panic(err)
}
// 获取有序集合中的所有成员和分数
scores, err := rdb.ZRangeWithScores(ctx, "scores", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println("Scores:", scores)
在这个例子中,键 scores 对应多个成员和分数(Alice: 90, Bob: 85),这是一对多的关系。
总结
字符串 (String): 一对一的关系,一个键对应一个值。
哈希 (Hash): 一对多的关系,一个键对应多个字段和值。
列表 (List): 一对多的关系,一个键对应多个元素。
集合 (Set): 一对多的关系,一个键对应多个元素。
有序集合 (Sorted Set): 一对多的关系,一个键对应多个成员和分数。
通过这些数据结构,Redis 提供了丰富的功能来满足不同的应用需求。
go-redis 数据结构的隐式选择
在 Redis 中,数据结构的选择是隐式的,它取决于你使用的命令。Redis 不会要求你在存储数据之前显式地指定数据结构,而是根据你执行的命令自动选择合适的数据结构。
-
当你使用 SET 命令时,Redis 会自动将数据存储为字符串(String)。
-
当你使用 HSET 命令时,Redis 会自动将数据存储为哈希(Hash)。
-
当你使用 LPUSH 或 RPUSH 命令时,Redis 会自动将数据存储为列表(List)。
-
当你使用 SADD 命令时,Redis 会自动将数据存储为集合(Set)。
-
当你使用 ZADD 命令时,Redis 会自动将数据存储为有序集合(Sorted Set)。
包括但是我限于这几个方法.只要使用数据结构对应的这些方法,就能确定数据的存储结构。