Tag: redis

在multithreadingRails环境中使用Redis的最佳方法是什么? (Puma / Sidekiq)

我在我的应用程序中使用Redis,包括Sidekiq队列和模型缓存。 考虑到将从我的Web应用程序(通过Puma运行)和Sidekiq内部的后台作业调用将要访问Redis的模型,我的模型可以使用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获得的连接存储到Thread-local变量中,并在任何地方使用该线程局部变量吗? 在那种情况下,我在“Puma”环境中做了什么? 如何设置线程局部变量? 对此有任何想法非常感谢。 谢谢!

Redis或Mongo确定一个数字是否在范围内?

我需要一种快速检查IP地址是否属于许多禁用IP范围之一的方法。 我目前使用iptables来检查IP是否属于指定范围。 这适用于几千个范围,但这个数字将急剧增加到几十万,并将继续增长。 我目前简单地向iptables添加新规则的方法的另一个问题是重复数量的增加。 我需要一种有效的方法来检查IP或范围在添加到规则集之前是否属于现有(更大)范围。 Ruby是我最熟悉的语言,但对于越来越多的范围,哪种数据结构是最佳选择? 我想出的一个解决方案是使用Redis集或MongoDB将各个IP存储为整数,然后只需检查集合中是否存在IP ……但我的直觉告诉我必须有一个更聪明的方法。 如果我要将IP转换为整数并存储范围,那么运行范围以查看新IP或范围是否已经包含在现有更大范围内的最佳方式是什么? 最后要注意:速度比内存成本更重要。

在初始化程序中设置cache_store

我正在尝试使用redis-store作为我的Rails 3 cache_store。 我还有一个初始化器/ app_config.rb,它为配置设置加载一个yaml文件。 在我的初始化程序/ redis.rb中,我有: MyApp::Application.config.cache_store = :redis_store, APP_CONFIG[‘redis’] 但是,这似乎不起作用。 如果我做: Rails.cache 在我的rails控制台中,我可以清楚地看到它正在使用 ActiveSupport.Cache.FileStore 作为缓存存储而不是redis-store。 但是,如果我在application.rb文件中添加配置,如下所示: config.cache_store = :redis_store 它运行得很好,除了在app.rb之后加载app config初始化程序,所以我没有访问APP_CONFIG。 有没有人经历过这个? 我似乎无法在初始化程序中设置缓存存储。