首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Dalli连接到memcached

使用Dalli连接到memcached
EN

Code Review用户
提问于 2012-12-24 20:35:35
回答 3查看 586关注 0票数 5

我似乎总是难以重构我的代码。我可以查看任何其他代码,并且确切地知道发生了什么,但是当涉及到清理我的代码时,我会让编写人员阻塞。

下面的代码可以工作,但我知道是否可以做得更好,并且只需要几行代码。我只是想包装一个memcache客户机,以便使用一个服务器进行测试,另一个服务器用于dev/prod,或者在无法连接到服务器的情况下获取值。

任何关于重构等的技巧都非常感谢。

代码语言:javascript
复制
require 'dalli'
class Cache
    def self.fetch(key, ttl, &block)
        if memcache
            memcache.fetch(key, ttl, &block)
        else
            block.call
        end
    end

    def self.memcache
        begin
        if(ENV['RACK_ENV'] == :production or ENV['RACK_ENV'] == :development)
            @memcache ||= Dalli::Client.new('cache.amazonaws.com:11211')    
        else
            @memcache ||= Dalli::Client.new('localhost:11211')  
        end
        rescue Exception => e
            false
        end
    end
end
EN

回答 3

Code Review用户

发布于 2012-12-24 23:20:18

这是self.memcache中的代码,只需为self.fetch使用一个三元操作符。

代码语言:javascript
复制
require 'dalli'
class Cache
  def self.fetch(key, ttl, &block)
    memcache ? memcache.fetch(key, ttl, &block) : block.call
  end

  def self.memcache
    @memcache ||= Dalli::Client.new((ENV['RACK_ENV'] == :production or ENV['RACK_ENV'] == :development) ?
                                    'cache.amazonaws.com:11211' :
                                    'localhost:11211')
  rescue Exception
    false
  end
end
票数 3
EN

Code Review用户

发布于 2012-12-29 03:53:02

如果我真的想把fetch作为类方法,我会这样写它。如果这不是强制性的,我将使fetch成为唯一的公共实例方法,以及rest私有实例方法。

代码语言:javascript
复制
 require 'dalli'

 class Cache
   def self.fetch(key, ttl, &block)
     memcache ? memcache.fetch(key, ttl, &block) : block.call
   end

   def self.memcache
     @memcache ||= new_client
   end

   def self.new_client
     begin
       Dalli::Client.new(memcache_host)
     rescue StandardError
       false
     end
   end

   def self.memcache_host
     (production? || development?) ? 'cache.amazonaws.com:11211' : 'localhost:11211'    
   end

   def self.production?
     environment == :production
   end

   def self.development?
     environment == :development
   end

   def self.environment
     ENV['RACK_ENV']
   end
 end
票数 2
EN

Code Review用户

发布于 2015-01-22 22:21:50

我会这样做:

代码语言:javascript
复制
require 'dalli'
class Cache
    def self.fetch(key, ttl, &block)
        memcache and
            memcache.fetch(key, ttl, &block) or
            block.call
    end

    def self.host
        @host ||= (ENV['RACK_ENV'] == :production || ENV['RACK_ENV'] == :development) ?
            'cache.amazonaws.com:11211' :
            'localhost:11211'
    end

    def self.memcache   
        @memcache ||= Dalli::Client.new(host)
    rescue StandardError
        nil
    end
end

我更喜欢在方法上返回nil而不是false,否则这些方法会在成功时返回一个对象。如果它在失败时返回false,那么它应该在成功时返回true,但是这会将该方法的名称更改为memcache

票数 0
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/19904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档