我正在使用connection_pool来管理我与redis的连接,目前我需要使用$redis.with {|conn| conn.set("key", 1)}
来设置密钥。
我该怎么做
redis.set("key", 1)
并具有与上述相同的效果。
或者至少
redis(set("key", 1))
答案 0 :(得分:1)
您可以使用
ConnectionPool::Wrapper
打包单个全局连接,从而可以更轻松地随时间移植连接代码:$redis = ConnectionPool::Wrapper.new(size: 5, timeout: 3) { Redis.connect } $redis.sadd('foo', 1) $redis.smembers('foo')
包装器使用method_missing检出连接,运行请求的方法,然后立即检查连接回池。它不是高性能,因此您需要尽快移植性能敏感代码。
但我怀疑这只是一种解决方法,你现在正在采用的方式似乎是图书馆的工作方式。
答案 1 :(得分:1)
虽然我认为没有理由做你所问的,但我们走了:
class << redis
def my_set key, value
$redis.with { |conn| conn.set key, value }
end
end
然后:
redis.my_set 'key', 1
对于所有感兴趣的方法:
class << redis
%i(set get foo bar).each do |m|
class_eval <<-CEEOF
def my_#{m} *args
$redis.with { |conn| conn.#{m} *args }
end
CEEOF
end
end
方法列表可能会自动从conn.instance_methods(false)
中获得。
答案 2 :(得分:1)
在Ruby中接收方法中的块的两种主要方法:
首先使用yield关键字,如:
def speak
puts yield
end
speak { "Hello" }
# Hello
# => nil
另一种方法是在方法签名中的最后一个参数前加一个&符号,然后从传入的任何块中创建一个Proc对象。
然后可以使用如下调用方法执行此对象:
def speak(&block)
puts block.call
end
speak { "Hello" }
# Hello
# => nil