为可扩展go应用程序提供redis客户端的最佳方式

为可扩展go应用程序提供redis客户端的最佳方式,go,redis,redigo,Go,Redis,Redigo,我在应用程序中使用redigo,我想知道我的服务应该如何与Redis交互 Wikipedia对线程安全有这样的说法: 线程安全是一种适用于多线程代码的计算机编程概念。线程安全代码仅以确保所有线程正常运行并满足其设计规范的方式操纵共享数据结构,而不会发生意外交互 我的意思是,如果一个数据结构需要由多个客户端访问(在当今的微服务世界中,成百上千,甚至上百万),线程安全就是我们确保在系统中正确保存状态的方式,而不管哪个客户端何时访问数据。这意味着要解决访问优先级(哪个客户端首先到达),确保锁定变异(一

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

Wikipedia对线程安全有这样的说法:

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

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

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

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

我会这样做:

  • main
    函数调用
    init
    中,返回redigo

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

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


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

    注释中已经提供了正确答案,尽管我仍然想添加5美分

    您的问题混淆了两个概念—并发和

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

    并发代码应缩写为使用DB连接和打开/关闭连接(如有必要)

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

    • 有人可以为每个请求创建DB连接,代码是 同时发生
    • 有人可以使用一些共享数据库连接 只要多个请求不相互干扰,代码就是并发的 彼此之间。通常通过内存锁实现的功能
    另一方面,连接池是一种模式,它提供了处理DB连接的有效方法。 为什么管理连接生命周期很重要:

  • 打开连接的费用很高
  • 在不使用as数据库的情况下保持活动连接的代价很高,只能保持有限数量的打开连接
  • 使用连接池,您可以控制:

  • 有多少连接始终处于打开状态-预热慢速资源
  • 最大打开连接数-防止打开过多连接
  • 连接超时-连接重用和释放未使用资源之间的平衡
  • 维护每个请求的连接或连接池不允许高效的连接重用。每个请求都会因连接打开开销而变慢,流量峰值会导致打开太多连接等

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


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

    注释中已经提供了正确的答案,尽管我仍然想增加5美分

    您的问题混淆了两个概念—并发和

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

    并发代码应缩写为使用DB连接和打开/关闭连接(如有必要)

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

    • 有人可以为每个请求创建DB连接,代码是 同时发生
    • 有人可以使用一些共享数据库连接 只要多个请求不相互干扰,代码就是并发的 彼此之间。通常通过内存锁实现的功能
    另一方面,连接池是一种模式,它提供了处理DB连接的有效方法。 为什么管理连接生命周期很重要:

  • 打开连接的费用很高
  • 在不使用as数据库的情况下保持活动连接的代价很高,只能保持有限数量的打开连接
  • 使用连接池,您可以控制:

  • 有多少连接始终处于打开状态-预热慢速资源
  • 最大打开连接数-防止打开过多连接
  • 联系