当前位置: 首页 > 面试题库 >

在多线程Rails环境中使用Redis的最佳方法是什么?(彪马/ Sidekiq)

端木明贤
2023-03-14
问题内容

我在应用程序中使用Redis,既用于Sidekiq队列,也用于模型缓存。

考虑到将要在Redis上使用的模型将同时从我的Web应用程序(通过Puma运行)和Sidekiq内部的后台作业中被调用,使模型具有Redis连接的最佳方法是什么?

我目前正在初始化程序中执行此操作:

Redis.current = Redis.new(host: 'localhost', port: 6379)

然后在整个代码中简单地使用Redis.current.get/ Redis.current.set(和类似的代码)…

据我了解,这应该是线程安全的,因为Redis客户端一次只能使用Monitor运行一个命令。

现在,Sidekiq有自己的Redis连接池,建议您这样做

Sidekiq.redis do |conn|
   conn.get
   conn.set
end

据我了解,这比仅使用Redis.current的方法要好,因为当多个线程遇到Redis时,它们没有多个线程在单个连接上互相等待。

但是,如何使从Sidekiq.redis获得的此连接对我的模型可用?(无需在每个方法调用中将其作为参数传递)

我无法在该块中设置Redis.current,因为它是全局的,并且我返回使用相同连接的每个人(加上它们之间的随机切换,这甚至可能是非线程安全的)

我应该将从Sidekiq.Redis获得的连接存储到线程局部变量中,并在各处使用该线程局部变量吗?

在这种情况下,在“ Puma”环境中我该怎么办?如何设置线程局部变量?

任何对此的想法都将不胜感激。

谢谢!


问题答案:

您为应用程序代码使用单独的全局连接池。在您的redis.rb初始值设定项中输入以下内容:

require 'connection_pool'
REDIS = ConnectionPool.new(size: 10) { Redis.new }

现在,您可以在任何地方的应用程序代码中执行以下操作:

REDIS.with do |conn|
  # some redis operations
end

您最多可以有10个连接在您的puma /
sidekiq工作人员之间共享。如您所正确指出的那样,这将导致更好的性能,因为您不会让所有线程都争用单个Redis连接。

所有这些都记录在这里:https : //github.com/mperham/sidekiq/wiki/Advanced-
Options#connection-pooling



 类似资料:
  • 问题内容: 一段时间以来,我一直在多线程环境中使用HttpClient。对于每个线程,当它启动连接时,它将创建一个全新的HttpClient实例。 最近,我发现使用这种方法可能导致用户打开太多端口,并且大多数连接处于TIME_WAIT状态。 http://www.opensubscriber.com/message/commons-httpclient- dev@jakarta.apache.or

  • 问题内容: 我目前正在Jenkins管道上进行POC,以弄清楚如何在CI环境中配置我的产品。管道的要求是: SVN的签出代码 编译程序 部署到服务器上的预定义位置 更改数据库配置(甚至可能尚未识别其他配置)以指向适当的数据库 执行程序 执行质量检查流程以验证输出 我目前难以达到上述第4点。每个程序的所有与DB相关的配置都驻留在database.xml文件中,并且一个程序可以连接到1个或多个DB。

  • 我的程序使用ZMQ进行通信。也就是说,服务器(C、linux)创建一个XPUB套接字,然后在一个线程中读取它,在另一个线程中发布数据(写入)。 客户端(java、jzmq、linux)创建一个SUB套接字,并订阅使用它。 一段时间后,服务器端在读取线程中接收SIGABRT。 什么可能是问题的根源?在不同的线程中读/写或创建XPUB/SUB对? 如果问题是在多线程中,那么使用XPUB套接字的正确范例

  • 问题内容: 我想在程序执行其他操作时监听服务器,但是从服务器收到消息后,我想对其进行解释。 我知道线程,但是不能完全确定它是如何工作的。如果我有一个线程正在监听服务器,如何将数据传递到主线程进行解释?主线程将数据发送到服务器的最佳方法是什么?同步修饰符的用途是什么? 问题答案: 如果我有一个线程正在监听服务器,如何将数据传递到主线程进行解释?主线程将数据发送到服务器的最佳方法是什么? 我会为此使用

  • 问题内容: 我在Rails应用程序中优化了一些缓慢的事务,并且看到了花费大量时间渲染JSON视图: 假设API调用恰好返回了需要返回的数据, 那么在rails中呈现JSON的最快方法是什么? 我们之所以使用Rabl是因为能够轻松共享代码,但是我们并不局限于此。 问题答案: Rabl 用于跨平台的兼容性,默认情况下不使用速度非常快的Yajl库。Rabl的配置文档解释了该解决方案: 如果仍然无法提供足

  • 问题内容: 我有一个程序,可以执行大量计算并经常将其报告到文件中。我知道频繁的写入操作会大大降低程序的速度,因此,为了避免出现这种情况,我希望有一个专门用于写入操作的线程。 现在,我正在用我写的这堂课(不耐烦的可以跳到问题的结尾): 然后我通过以下方式使用它: 尽管此方法运行良好,但我想知道: 是否有更好的方法来实现这一目标? 问题答案: 您的基本方法看起来不错。我将代码结构如下: 如果你不希望在