go-redis的简单使用

Redis是什么?

在 Go 语言中,Redis 是一个流行的开源内存数据库(In-Memory Database),它可以用作缓存、消息代理、会话存储和多种其他用途。Redis 以键值对的形式存储数据,具有高性能、支持丰富的数据类型和灵活的持久化选项等特点,因此被广泛应用于构建实时应用、缓存系统、队列等场景。

在 Go 语言中,可以使用第三方的 Redis 客户端库与 Redis 服务器进行交互,实现数据的读取、写入、更新和删除等操作。这些库通常提供了简单易用的 API,方便开发者与 Redis 进行集成。

为什么要使用Redis?

在微服务的场景下,我们有多台服务器。这多台的服务器需要去并发地操作同一个变量。在这种情况下,显然不能只存放在单个的服务器上面,而应该存放在一个公共的地方——分布式缓存。 我们有时候需要加载大量的数据放入缓存。如果说在每台服务器上面,都开辟一个很大的内存空间来存放这些数据的话,显然非常消耗内存。此时我们应该也把它们挪到一个公共的地方——分布式缓存

go-redis有什么优点?

API友好,命令名称和参数与Redis原生命令一致,使用简单方便。支持完整的Redis命令集,覆盖了字符串、哈希、列表、集合、有序集合、HyperLogLog等数据结构。支持连接池,可以有效控制连接数,避免频繁创建连接。支持Pipeline和事务,可以打包多个命令减少网络开销。支持发布订阅Pub/Sub和键空间通知等功能。支持哨兵和集群模式,提供高可用能力。代码维护活跃,持续有新功能加入。

总之,go-redis是一个功能完备、易用性高的Redis客户端库,它覆盖了Redis的绝大部分功能,是Go语言连接Redis的首选方案

go-redis 客户端库连接 Redis 并进行简单操作

package main

import (

"fmt"

"github.com/go-redis/redis/v8"

"context"

)

func main() {

// 创建 Redis 客户端

rdb := redis.NewClient(&redis.Options{

Addr: "localhost:6379", // Redis 服务器地址

Password: "", // Redis 访问密码,如果有的话

DB: 0, // 使用默认的数据库

})

// 使用 Ping 方法检查是否成功连接到 Redis 服务器

pong, err := rdb.Ping(context.Background()).Result()

fmt.Println(pong, err)

// 设置键值对

err = rdb.Set(context.Background(), "key", "value", 0).Err()

if err != nil {

panic(err)

}

// 获取键值对的值

val, err := rdb.Get(context.Background(), "key").Result()

if err != nil {

panic(err)

}

fmt.Println("key", val)

}

导包:go get github.com/go-redis/redis/v8。 在上面的示例中,使用了 github.com/go-redis/redis/v8 包提供的客户端库。首先,创建了一个 Redis 客户端并连接到本地 Redis 服务器。然后,通过 Ping 方法检查连接是否成功。接着,设置了一个键值对,然后获取了该键的值并输出。

pipeline访问

Redis Pipeline实现了一种批量发送请求和响应的模式,它允许客户端在单次网络交互中缓冲并发送多个命令,然后再次单次接收所有响应。这种方式极大地减少了客户端和服务器之间的网络往返次数,优化了网络传输开销,显著提升Redis的总体吞吐量和命令处理性能。测试结果表明,Pipeline模式可以使Redis命令处理的TPS吞吐量提升数倍。同时它也减轻了客户端等待响应的时间,有效隐藏了网络通信时延。

此外,Pipeline模式下可轻松传输更大的数据包,避免小包命令多次网络传输的资源消耗。它还可以减少客户端和服务器端的CPU和内存占用。

总之,Redis Pipeline通过优化网络传输、批量命令执行等手段,极大地提升了Redis的性能,是非常重要的客户端访问优化方式。它尤其适合用于高负载、低延迟的Redis访问场景。

func pipelineDemo(client *redis.Client) {

// 创建pipeline

pipe := client.Pipeline()

// 添加多个命令到pipeline

setCmd := pipe.Set("key1", "value1", 0)

getCmd := pipe.Get("key1")

incrCmd := pipe.Incr("counter")

pipe.Expire("key1", time.Hour)

// 执行pipeline

_, err := pipe.Exec()

if err != nil {

panic(err)

}

fmt.Println("setCmd:", setCmd.Val())

fmt.Println("getCmd:", getCmd.Val())

fmt.Println("incrCmd:", incrCmd.Val())

}

pipeline通过redis.Pipeline() 创建,使用管道对象添加命令,最后调用Exec() 执行。返回的cmds包含每个命令的响应,可以依次处理。这样就可以批量的发送多个命令,优化访问Redis服务器。

推荐阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: