使用go-redis在Golang中使用键值存储

317 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第20天,点击查看活动详情

想象一下,一个电子商务网站正在进行限时抢购,每秒钟都可能收到数十亿份订单。在实现最佳购物体验的许多重要事情中,使用最合适的数据库是一个能够处理大量数据缩放和极高量状态变化的数据库,同时通过分布式处理和存储为数百万同时用户提供服务。键值存储是最适合这种需求的一种数据库。此外,它还具有内置冗余设计,允许它处理存储节点的丢失。(来源:aws.amazon.com/redis/)

在可供选择的键值存储中,Redis或远程字典服务器是软件工程师的最爱。那么,Redis到底是什么?Redis的创建者Salvatore Sanfilippo说:

Redis是一个数据库。它实现了一个字典,其中键与值相关联。这些值不局限于简单的字符串,它们也可以是列表和集,并带有许多与此数据类型相关的服务器端原子操作。

Redis将整个数据集保存在内存中,但是数据集是持久的,因为Redis会异步地将数据集转储到磁盘上。每次服务器重新启动时都会加载转储。

Redis可以配置为在给定的秒数过去后保存数据集,并对数据集进行更改。

由于数据是异步写入的,如果发生系统崩溃,最后几个查询可能会丢失。但这在许多应用程序中是可以接受的。

在本文中,我将展示实现键值存储是多么直观,特别是在Golang中。我们将使用goang常用的Redis客户端包之一go-redis。在进一步之前,我们需要先安装Redis服务器。只需在我们的终端中运行这个程序。

docker run -d -p 6379:6379 --name redis redis

为了验证安装是否正确,我们可以运行

docker exec -it redis bash
redis-cli
INFO

在其他相关信息中,它将显示已安装的Redis版本。访问Redis官方网站可以发现其他有用的命令。

在我们的Golang项目中,我们需要安装go-redis包

go get github.com/go-redis/redis/v9

如果安装的是7.x版本的Redis,则使用Go-redis v9。v8是Redis版本6.x.x。

接下来,在我们的应用程序中,我们需要创建一个Redis客户端实例,指定Redis服务的地址,创建连接的密码和数据库号。有时,我们可能还想指定一些其他选项,比如应该允许的空闲连接的最大数量是多少。在下面的例子中,我们可以使用MaxIdleCons选项设置这样的限制。

rdb := redis.NewClient(&redis.Options{
 Addr:         "localhost:6379",
 Password:     "",
 DB:           0,
 MaxIdleConns: 5,
})

在这个最小设置中,我们已经能够使用go-redis实现键值存储。在下面的例子中,我们可以设置一个字符串存储在Redis中,过期时间为一分钟,这意味着存储的值将在它创建后的下一分钟内保持可用。

if err := rdb.Set(  
someContext,  
key,  
value,  
time.Minute,  
).Err(); err != nil {  
// error handling  
}

获取存储值也很简单,

value, err := rdb.Get(someContext, key).Result()  
if err != nil {  
if err == redis.Nil {  
// error handling attributed to key not found (probably client error)  
}  
// error handling attributed to internal server error  
}