登录
首页 >  Golang >  Go问答

最佳的 Go 应用程序中集成 Redis 客户端的方法

来源:stackoverflow

时间:2024-03-04 17:51:25 145浏览 收藏

Golang小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《最佳的 Go 应用程序中集成 Redis 客户端的方法》带大家来了解一下##content_title##,希望对大家的知识积累有所帮助,从而弥补自己的不足,助力实战开发!


问题内容

我在应用程序中使用 redigo,我想知道我的服务应如何与 Redis 交互。

维基百科对线程安全有这样的说法:

线程安全是适用于多线程代码的计算机编程概念。线程安全代码仅以确保所有线程正常运行并满足其设计规范而不会发生意外交互的方式操作共享数据结构。

我对此的解释是,如果一个数据结构需要被多个客户端(在当今的微服务世界中,数百、数千甚至数百万)访问,那么线程安全就是我们确保状态的方式无论哪个客户端何时访问数据,都正确地保存在系统中。这意味着解决访问优先级(哪个客户端首先到达那里),确保锁定突变(一次只有一个客户端可以写入),同时提高并发性(如果没有更改,许多客户端可以读取数据)。

据我所知,redigo 客户端可以由多个“goroutines”(或线程)同时使用。这让我相信像我熟悉的 Java 中的单例实现就足够了。

我看到了示例,例如,这里和这里,其中 Redis 连接(pools)只是在 main 方法中创建并传递给各种 redigo 函数。尽管它们似乎确实遵循单例模式,但这似乎并不是完成任务的最可靠的方法。 (可以理解的是,第二篇文章实际上只是一个快速而肮脏的 API。)

我会这样做:

  1. main 函数中调用 init,它返回 redigo pool

  2. 创建接受 pool 作为参数(一种“脏”依赖注入)的处理程序函数(控制器)。

这将(我认为)确保只创建一个 pool

或者,是否有任何原因导致我每次想要访问数据存储时都无法创建 pool(客户端)?如果客户端在事务完成后被终止,那么每次处理程序收到请求时旋转一个新的 pool 是否有任何问题?


解决方案


评论中已经提供了正确答案,但我仍然想添加我的 5 美分。

您的问题混淆了两个概念 - 并发和 resource pool

并发代码可确保多个执行流在使用共享内存的同一应用程序中安全地工作。 在我们的示例中,我们有来自用户的多个 http 请求以及并发执行的这些请求的处理程序代码。数据库连接是该流程的一部分,并且是请求执行所必需的。

并发代码应该能够使用数据库连接并在必要时打开/关闭连接。

尽管如此,并发性与定义在任何给定时间应打开多少连接以及应如何重用/共享这些连接的规则无关:

  • 有人可以为每个请求创建数据库连接,代码是 同时。
  • 某人可以使用一些共享数据库连接,并且 只要多个请求不干扰,代码就是并发的 与彼此。通常通过内存锁实现什么目的。

从另一方面来说,连接池是一种提供有效方式处理数据库连接的模式。 为什么管理连接生命周期很重要:

  1. 打开连接的成本很高
  2. 如果不使用数据库,连接的保持活动成本会很高,因为数据库只能保留有限数量的打开连接。

通过连接池,您可以控制:

  1. 有多少连接始终处于打开状态 - 预热慢速资源
  2. 打开连接的最大数量 - 防止打开太多连接
  3. 连接超时 - 连接重用和释放未使用的资源之间的平衡

维护每个请求的连接或连接池不允许有效的连接重用。每个请求都会因连接打开开销而减慢,流量峰值会导致打开过多连接等。

通常,应用程序有一个在所有请求之间共享的连接池。

有时,开发人员会为不同类型的连接创建多个池。例如,一个用于事务操作的池,一个用于报告的池。

今天关于《最佳的 Go 应用程序中集成 Redis 客户端的方法》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>