写在前面
作为最常用的分布式缓存中间件——Redis,了解运作原理和如何使用是十分有必要的。前几天大致明白了Redis的基本工作原理,今天来学习如何通过Go来操作Redis实现基本的读写操作,主要操作值的类型包括string
、list
和hashtable
。
为什么要使用Redis
?
对于这个问题,最近看到有种比较清晰的说法,想要记录下来:
-
在微服务的场景下,我们有多台服务器。这多台的服务器需要去并发地操作同一个变量。在这种情况下,显然不能只存放在单个的服务器上面,而应该存放在一个公共的地方——分布式缓存。
-
我们有时候需要加载大量的数据放入缓存。如果说在每台服务器上面,都开辟一个很大的内存空间来存放这些数据的话,显然非常消耗内存。此时我们应该也把它们挪到一个公共的地方——分布式缓存
导入对应的包
go get github.com/redis/go-redis/v9
创建一个操作Redis的一个客户端
client := redis.NewClient(&redis.Options{
Addr:"127.0.0.1:6379", //地址,这里使用本地服务器的默认端口
Password:"123456", //访问Redis的密码
DB:0, //使用默认的0号DB
})
ctx :=conetxt.TODO() //创建一个默认的context
写入和读写string
类型的值
func string(ctx context.Context, client *redis.Client) {
key := "name"
value := "大脸猫"
err := client.Set(ctx, key, value, 1*time.Second).Err() //1秒后失效。0表示永不失效
//错误处理
if err != nil {
if err == redis.Nil {
fmt.Println("key不存在")
} else {
fmt.Println(err)
os.Exit(1)
}
}
//通过Expire设置3秒后失效
client.Expire(ctx, key, 3*time.Second)
v2, err := client.Get(ctx, key).Result()
//错误处理
if err != nil {
if err == redis.Nil {
fmt.Println("key不存在")
} else {
fmt.Println(err)
os.Exit(1)
}
}
fmt.Println(v2)
//删除键
client.Del(ctx, key)
}
string
函数展示了如何与Redis数据库进行交互,包括设置键值对、设置过期时间、获取值以及删除键的操作。下面是详细的解释:
-
func string(ctx context.Context, client *redis.Client)
该函数接受两个参数:ctx
是一个类型为context.Context
的上下文对象,client
是与Redis服务器建立连接的redis.Client
实例。 -
key := "name"
value := "大脸猫"
定义一个键(key
)和一个值(value
)。在这里,键被设置为 "name",而值被设置为 "大脸猫"。这些将作为数据存储在Redis中。 -
err := client.Set(ctx, key, value, 1*time.Second).Err()
这一行代码使用client.Set
方法来设置键值对的参数到Redis中。它接受四个参数:ctx
:上下文对象,用于处理操作的超时和取消。key
:要设置的键。value
:要设置的值。1*time.Second
:过期时间,这里设置为1秒,表示在1秒后键值对会失效。如果将过期时间设置为0,键值对将永不失效。
-
client.Expire(ctx, key, 3*time.Second)
这是一种另外的方式来设置键的过期时间:通过client.Expire
方法设置键 "name" 在3秒后过期失效。 -
v2, err := client.Get(ctx, key).Result()
通过使用client.Get
方法来获取键"name"对应的值。 -
client.Del(ctx, key)
使用client.Del
方法删除键"name",从而把这个键值对从Redis中删除。
写入和读取list
类型的值
func list(ctx context.Context, client *redis.Client) {
key := "ids"
values := []interface{}{1, "中", 3, 4}
err := client.RPush(ctx, key, values...).Err() //向List右侧插入。如果List不存在会先创建
if err != nil {
if err == redis.Nil {
fmt.Println("key不存在")
} else {
fmt.Println(err)
os.Exit(1)
}
}
v2, err := client.LRange(ctx, key, 0, -1).Result() //截取。双闭区间
if err != nil {
if err == redis.Nil {
fmt.Println("key不存在")
} else {
fmt.Println(err)
os.Exit(1)
}
}
fmt.Println(v2)
client.Del(ctx, key)
}
list
函数展示了Redis的列表(List)数据结构的操作,包括向列表右侧插入值、获取列表元素以及删除列表。下面是详细的解释:
-
func list(ctx context.Context, client *redis.Client)
该函数接受两个参数:ctx
是一个类型为context.Context
的上下文对象,client
是与Redis服务器建立连接的redis.Client
实例。 -
key := "ids"
values := []interface{}{1, "中", 3, 4}
定义了一个键(key
)和一个值的切片(values
)。在这里,键被设置为 "ids",而值的切片包含了多个元素,包括整数1、字符串 "中"、整数3和整数4。这些将作为列表存储在Redis中。 -
err := client.RPush(ctx, key, values...).Err()
RPush
方法用于将值添加到列表的右侧,如果列表不存在,它会先创建一个新的列表。在这里,我们将值1、"中"、3和4依次插入到列表 "ids" 中。
这里的client.RPush
方法向名为 "ids" 的列表右侧插入多个值。它接受三个参数:ctx
:上下文对象,用于处理操作的超时和取消。key
:要插入值的列表的键。values...
:要插入的多个值。在这里,我们使用了values...
来将切片values
的元素展开作为参数。
-
v2, err := client.LRange(ctx, key, 0, -1).Result()
LRange
方法用于获取列表中的元素,返回一个字符串切片。在这里,我们将获取到的元素存储在v2
变量中。这里使用client.LRange
方法来获取列表 "ids" 中的所有元素。它接受三个参数:ctx
:上下文对象,用于处理操作的超时和取消。key
:要获取元素的列表的键。0
和-1
:表示要获取的元素范围,这里是从列表的第一个元素(下标0)到最后一个元素(-1)。这相当于获取整个列表。
-
client.Del(ctx, key)
使用client.Del
方法删除了键为 "ids" 的列表,从而把这个列表从Redis中删除。
写入和读取hashtable
类型的值
func hashtable(ctx context.Context, client *redis.Client) {
//key field1 value1 field2 value2 ...
err := client.HSet(ctx, "学生1", "Name", "张三", "Age", 18, "Height", 173.5).Err()
//错误处理
if err != nil {
if err == redis.Nil {
fmt.Println("key不存在")
} else {
fmt.Println(err)
os.Exit(1)
}
}
err = client.HSet(ctx, "学生2", "Name", "李四", "Age", 20, "Height", 180.0).Err()
//错误处理
if err != nil {
if err == redis.Nil {
fmt.Println("key不存在")
} else {
fmt.Println(err)
os.Exit(1)
}
}
age, err := client.HGet(ctx, "学生2", "Age").Result()
//错误处理
if err != nil {
if err == redis.Nil {
fmt.Println("key不存在")
} else {
fmt.Println(err)
os.Exit(1)
}
}
fmt.Println(age)
for field, value := range client.HGetAll(ctx, "学生1").Val() {
fmt.Println(field, value)
}
client.Del(ctx, "学生1")
client.Del(ctx, "学生2")
}
hashtable
函数具体展示了Redis的哈希表(Hash)数据结构的操作,包括设置字段和值、获取字段的值、获取所有字段-值对以及删除哈希表。下面是详细的解释:
-
func hashtable(ctx context.Context, client *redis.Client)
该函数接受两个参数:ctx
是一个类型为context.Context
的上下文对象,client
是与Redis服务器建立连接的redis.Client
实例。 -
err := client.HSet(ctx, "学生1", "Name", "张三", "Age", 18, "Height", 173.5).Err()
使用client.HSet
方法向名为 "学生1" 的哈希表中设置多个字段(field)和对应的值(value)。哈希表是一种键值对存储结构,类似于字典。在这里,我们设置了三对字段和值: "Name" 和 "张三"、"Age" 和 18、"Height" 和 173.5。换言之,就是在 "学生1" 哈希表中存储了学生的姓名、年龄和身高信息。 -
age, err := client.HGet(ctx, "学生2", "Age").Result()
使用client.HGet
方法获取名为 "学生2" 的哈希表中的 "Age" 字段对应的值。在这里,我们获取了学生的年龄信息,并将其存储在age
变量中。 -
for field, value := range client.HGetAll(ctx, "学生1").Val() { fmt.Println(field, value) }
使用
client.HGetAll
方法获取名为 "学生1" 的哈希表中的所有字段和对应的值,并将它们以字段-值 对的形式遍历并打印出来。这样可以获取并显示学生1的所有信息。 -
client.Del(ctx, "学生1")
client.Del(ctx, "学生2")
使用client.Del
方法删除了 "学生1" 和 "学生2" 两个哈希表。这将从Redis中删除这两个哈希表,清除了示例中使用的数据。
主要参考资料
www.bilibili.com/video/BV1nP…