memcache-client 1.7.5 → 1.7.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/FAQ.rdoc +2 -2
 - data/History.rdoc +9 -0
 - data/Rakefile +16 -14
 - data/VERSION.yml +4 -0
 - data/lib/memcache.rb +55 -6
 - data/lib/memcache_util.rb +105 -0
 - data/performance.txt +143 -0
 - data/test/test_benchmark.rb +134 -0
 - data/test/test_mem_cache.rb +19 -0
 - metadata +16 -9
 
    
        data/FAQ.rdoc
    CHANGED
    
    | 
         @@ -27,5 +27,5 @@ You can increase the timeout or disable them completely with the following confi 
     | 
|
| 
       27 
27 
     | 
    
         | 
| 
       28 
28 
     | 
    
         
             
            The latest version of memcached-client is anywhere from 33% to 100% slower than memcached in various benchmarks.  Keep in mind this means that 10,000 get requests take 1.8 sec instead of 1.2 seconds.
         
     | 
| 
       29 
29 
     | 
    
         
             
            In practice, memcache-client is unlikely to be a bottleneck in your system but there is always going
         
     | 
| 
       30 
     | 
    
         
            -
            to be an overhead to pure Ruby.   
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
      
 30 
     | 
    
         
            +
            to be an overhead to pure Ruby.  memcache-client does have the advantage of built-in integration into 
         
     | 
| 
      
 31 
     | 
    
         
            +
            Rails and should work on non-MRI platforms: JRuby, MacRuby, etc.
         
     | 
    
        data/History.rdoc
    CHANGED
    
    | 
         @@ -1,3 +1,12 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            = 1.7.6 (2009-11-03)
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            * Reworked socket timeout code due to several customer complaints about timeouts not
         
     | 
| 
      
 4 
     | 
    
         
            +
              working 100% of the time since 1.7.3.
         
     | 
| 
      
 5 
     | 
    
         
            +
            * Add option to configure the namespace separator string, for interop with Perl
         
     | 
| 
      
 6 
     | 
    
         
            +
              which does not use a separator character:
         
     | 
| 
      
 7 
     | 
    
         
            +
                MemCache.new(servers, :namespace_separator => '')
         
     | 
| 
      
 8 
     | 
    
         
            +
            * Move to jeweler and gemcutter for RubyGem support.
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
       1 
10 
     | 
    
         
             
            = 1.7.5 (2009-09-09)
         
     | 
| 
       2 
11 
     | 
    
         | 
| 
       3 
12 
     | 
    
         
             
            * Fix ruby warnings (josh)
         
     | 
    
        data/Rakefile
    CHANGED
    
    | 
         @@ -3,22 +3,24 @@ require 'rubygems' 
     | 
|
| 
       3 
3 
     | 
    
         
             
            require 'rake/rdoctask'
         
     | 
| 
       4 
4 
     | 
    
         
             
            require 'rake/testtask'
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
      
 6 
     | 
    
         
            +
            begin
         
     | 
| 
      
 7 
     | 
    
         
            +
              require 'jeweler'
         
     | 
| 
      
 8 
     | 
    
         
            +
              Jeweler::Tasks.new do |s|
         
     | 
| 
      
 9 
     | 
    
         
            +
                s.name = "memcache-client"
         
     | 
| 
      
 10 
     | 
    
         
            +
                s.summary = s.description = "A Ruby library for accessing memcached."
         
     | 
| 
      
 11 
     | 
    
         
            +
                s.email = "mperham@gmail.com"
         
     | 
| 
      
 12 
     | 
    
         
            +
                s.homepage = "http://github.com/mperham/memcache-client"
         
     | 
| 
      
 13 
     | 
    
         
            +
                s.authors = ['Eric Hodel', 'Robert Cottrell', 'Mike Perham']
         
     | 
| 
      
 14 
     | 
    
         
            +
                s.has_rdoc = true
         
     | 
| 
      
 15 
     | 
    
         
            +
                s.files = FileList["[A-Z]*", "{lib,test}/**/*", 'performance.txt']
         
     | 
| 
      
 16 
     | 
    
         
            +
                s.test_files = FileList["test/test_*.rb"]
         
     | 
| 
      
 17 
     | 
    
         
            +
                s.rubyforge_project = 'seattlerb'
         
     | 
| 
      
 18 
     | 
    
         
            +
              end
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
            rescue LoadError
         
     | 
| 
      
 21 
     | 
    
         
            +
              puts "Jeweler not available. Install it for jeweler-related tasks with: sudo gem install jeweler"
         
     | 
| 
       8 
22 
     | 
    
         
             
            end
         
     | 
| 
       9 
23 
     | 
    
         | 
| 
       10 
     | 
    
         
            -
            task :install => [:gem] do
         
     | 
| 
       11 
     | 
    
         
            -
            	sh "sudo gem install memcache-client-*.gem"
         
     | 
| 
       12 
     | 
    
         
            -
            end
         
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
            task :clean do
         
     | 
| 
       15 
     | 
    
         
            -
            	sh "rm -f memcache-client-*.gem"
         
     | 
| 
       16 
     | 
    
         
            -
            end
         
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
            task :publish => [:clean, :gem, :install] do
         
     | 
| 
       19 
     | 
    
         
            -
            	require 'lib/memcache'
         
     | 
| 
       20 
     | 
    
         
            -
            	sh "rubyforge add_release seattlerb memcache-client #{MemCache::VERSION} memcache-client-#{MemCache::VERSION}.gem"
         
     | 
| 
       21 
     | 
    
         
            -
            end
         
     | 
| 
       22 
24 
     | 
    
         | 
| 
       23 
25 
     | 
    
         
             
            Rake::RDocTask.new do |rd|
         
     | 
| 
       24 
26 
     | 
    
         
             
            	rd.main = "README.rdoc"
         
     | 
    
        data/VERSION.yml
    ADDED
    
    
    
        data/lib/memcache.rb
    CHANGED
    
    | 
         @@ -6,6 +6,26 @@ require 'zlib' 
     | 
|
| 
       6 
6 
     | 
    
         
             
            require 'digest/sha1'
         
     | 
| 
       7 
7 
     | 
    
         
             
            require 'net/protocol'
         
     | 
| 
       8 
8 
     | 
    
         | 
| 
      
 9 
     | 
    
         
            +
            begin
         
     | 
| 
      
 10 
     | 
    
         
            +
              # Try to use the SystemTimer gem instead of Ruby's timeout library
         
     | 
| 
      
 11 
     | 
    
         
            +
              # when running on something that looks like Ruby 1.8.x. See:
         
     | 
| 
      
 12 
     | 
    
         
            +
              #   http://ph7spot.com/articles/system_timer
         
     | 
| 
      
 13 
     | 
    
         
            +
              # We don't want to bother trying to load SystemTimer on jruby and
         
     | 
| 
      
 14 
     | 
    
         
            +
              # ruby 1.9+
         
     | 
| 
      
 15 
     | 
    
         
            +
              if defined?(JRUBY_VERSION) || (RUBY_VERSION >= '1.9')
         
     | 
| 
      
 16 
     | 
    
         
            +
                require 'timeout'
         
     | 
| 
      
 17 
     | 
    
         
            +
                MemCacheTimer = Timeout
         
     | 
| 
      
 18 
     | 
    
         
            +
              else
         
     | 
| 
      
 19 
     | 
    
         
            +
                require 'system_timer'
         
     | 
| 
      
 20 
     | 
    
         
            +
                MemCacheTimer = SystemTimer
         
     | 
| 
      
 21 
     | 
    
         
            +
              end
         
     | 
| 
      
 22 
     | 
    
         
            +
            rescue LoadError => e
         
     | 
| 
      
 23 
     | 
    
         
            +
              puts "[memcache-client] Could not load SystemTimer gem, falling back to Ruby's slower/unsafe timeout library: #{e.message}"
         
     | 
| 
      
 24 
     | 
    
         
            +
              require 'timeout'
         
     | 
| 
      
 25 
     | 
    
         
            +
              MemCacheTimer = Timeout
         
     | 
| 
      
 26 
     | 
    
         
            +
            end
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
       9 
29 
     | 
    
         
             
            ##
         
     | 
| 
       10 
30 
     | 
    
         
             
            # A Ruby client library for memcached.
         
     | 
| 
       11 
31 
     | 
    
         
             
            #
         
     | 
| 
         @@ -15,7 +35,10 @@ class MemCache 
     | 
|
| 
       15 
35 
     | 
    
         
             
              ##
         
     | 
| 
       16 
36 
     | 
    
         
             
              # The version of MemCache you are using.
         
     | 
| 
       17 
37 
     | 
    
         | 
| 
       18 
     | 
    
         
            -
              VERSION =  
     | 
| 
      
 38 
     | 
    
         
            +
              VERSION = begin
         
     | 
| 
      
 39 
     | 
    
         
            +
                config = YAML.load(File.read(File.dirname(__FILE__) + '/../VERSION.yml'))
         
     | 
| 
      
 40 
     | 
    
         
            +
                "#{config[:major]}.#{config[:minor]}.#{config[:patch]}"
         
     | 
| 
      
 41 
     | 
    
         
            +
              end
         
     | 
| 
       19 
42 
     | 
    
         | 
| 
       20 
43 
     | 
    
         
             
              ##
         
     | 
| 
       21 
44 
     | 
    
         
             
              # Default options for the cache object.
         
     | 
| 
         @@ -29,7 +52,8 @@ class MemCache 
     | 
|
| 
       29 
52 
     | 
    
         
             
                :logger       => nil,
         
     | 
| 
       30 
53 
     | 
    
         
             
                :no_reply     => false,
         
     | 
| 
       31 
54 
     | 
    
         
             
                :check_size   => true,
         
     | 
| 
       32 
     | 
    
         
            -
                :autofix_keys => false
         
     | 
| 
      
 55 
     | 
    
         
            +
                :autofix_keys => false,
         
     | 
| 
      
 56 
     | 
    
         
            +
                :namespace_separator => ':',
         
     | 
| 
       33 
57 
     | 
    
         
             
              }
         
     | 
| 
       34 
58 
     | 
    
         | 
| 
       35 
59 
     | 
    
         
             
              ##
         
     | 
| 
         @@ -146,6 +170,7 @@ class MemCache 
     | 
|
| 
       146 
170 
     | 
    
         
             
                @logger       = opts[:logger]
         
     | 
| 
       147 
171 
     | 
    
         
             
                @no_reply     = opts[:no_reply]
         
     | 
| 
       148 
172 
     | 
    
         
             
                @check_size   = opts[:check_size]
         
     | 
| 
      
 173 
     | 
    
         
            +
                @namespace_separator = opts[:namespace_separator]
         
     | 
| 
       149 
174 
     | 
    
         
             
                @mutex        = Mutex.new if @multithread
         
     | 
| 
       150 
175 
     | 
    
         | 
| 
       151 
176 
     | 
    
         
             
                logger.info { "memcache-client #{VERSION} #{Array(servers).inspect}" } if logger
         
     | 
| 
         @@ -648,7 +673,7 @@ class MemCache 
     | 
|
| 
       648 
673 
     | 
    
         
             
                if namespace.nil? then
         
     | 
| 
       649 
674 
     | 
    
         
             
                  key
         
     | 
| 
       650 
675 
     | 
    
         
             
                else
         
     | 
| 
       651 
     | 
    
         
            -
                  "#{@namespace} 
     | 
| 
      
 676 
     | 
    
         
            +
                  "#{@namespace}#{@namespace_separator}#{key}"
         
     | 
| 
       652 
677 
     | 
    
         
             
                end
         
     | 
| 
       653 
678 
     | 
    
         
             
              end
         
     | 
| 
       654 
679 
     | 
    
         | 
| 
         @@ -866,7 +891,7 @@ class MemCache 
     | 
|
| 
       866 
891 
     | 
    
         | 
| 
       867 
892 
     | 
    
         
             
              def handle_error(server, error)
         
     | 
| 
       868 
893 
     | 
    
         
             
                raise error if error.is_a?(MemCacheError)
         
     | 
| 
       869 
     | 
    
         
            -
                server.close if server
         
     | 
| 
      
 894 
     | 
    
         
            +
                server.close if server && server.status == "CONNECTED"
         
     | 
| 
       870 
895 
     | 
    
         
             
                new_error = MemCacheError.new error.message
         
     | 
| 
       871 
896 
     | 
    
         
             
                new_error.set_backtrace error.backtrace
         
     | 
| 
       872 
897 
     | 
    
         
             
                raise new_error
         
     | 
| 
         @@ -1016,7 +1041,7 @@ class MemCache 
     | 
|
| 
       1016 
1041 
     | 
    
         
             
                    @sock.setsockopt Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1
         
     | 
| 
       1017 
1042 
     | 
    
         
             
                    @retry  = nil
         
     | 
| 
       1018 
1043 
     | 
    
         
             
                    @status = 'CONNECTED'
         
     | 
| 
       1019 
     | 
    
         
            -
                  rescue SocketError, SystemCallError, IOError => err
         
     | 
| 
      
 1044 
     | 
    
         
            +
                  rescue SocketError, SystemCallError, IOError, Timeout::Error => err
         
     | 
| 
       1020 
1045 
     | 
    
         
             
                    logger.warn { "Unable to open socket: #{err.class.name}, #{err.message}" } if logger
         
     | 
| 
       1021 
1046 
     | 
    
         
             
                    mark_dead err
         
     | 
| 
       1022 
1047 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -1025,8 +1050,32 @@ class MemCache 
     | 
|
| 
       1025 
1050 
     | 
    
         
             
                end
         
     | 
| 
       1026 
1051 
     | 
    
         | 
| 
       1027 
1052 
     | 
    
         
             
                def connect_to(host, port, timeout=nil)
         
     | 
| 
       1028 
     | 
    
         
            -
                   
     | 
| 
      
 1053 
     | 
    
         
            +
                  sock = nil
         
     | 
| 
      
 1054 
     | 
    
         
            +
                  if timeout
         
     | 
| 
      
 1055 
     | 
    
         
            +
                    MemCacheTimer.timeout(timeout) do
         
     | 
| 
      
 1056 
     | 
    
         
            +
                      sock = TCPSocket.new(host, port)
         
     | 
| 
      
 1057 
     | 
    
         
            +
                    end
         
     | 
| 
      
 1058 
     | 
    
         
            +
                  else
         
     | 
| 
      
 1059 
     | 
    
         
            +
                    sock = TCPSocket.new(host, port)
         
     | 
| 
      
 1060 
     | 
    
         
            +
                  end
         
     | 
| 
      
 1061 
     | 
    
         
            +
             
     | 
| 
      
 1062 
     | 
    
         
            +
                  io = MemCache::BufferedIO.new(sock)
         
     | 
| 
       1029 
1063 
     | 
    
         
             
                  io.read_timeout = timeout
         
     | 
| 
      
 1064 
     | 
    
         
            +
                  # Getting reports from several customers, including 37signals,
         
     | 
| 
      
 1065 
     | 
    
         
            +
                  # that the non-blocking timeouts in 1.7.5 don't seem to be reliable.
         
     | 
| 
      
 1066 
     | 
    
         
            +
                  # It can't hurt to set the underlying socket timeout also, if possible.
         
     | 
| 
      
 1067 
     | 
    
         
            +
                  if timeout
         
     | 
| 
      
 1068 
     | 
    
         
            +
                    secs = Integer(timeout)
         
     | 
| 
      
 1069 
     | 
    
         
            +
                    usecs = Integer((timeout - secs) * 1_000_000)
         
     | 
| 
      
 1070 
     | 
    
         
            +
                    optval = [secs, usecs].pack("l_2")
         
     | 
| 
      
 1071 
     | 
    
         
            +
                    begin
         
     | 
| 
      
 1072 
     | 
    
         
            +
                      io.setsockopt Socket::SOL_SOCKET, Socket::SO_RCVTIMEO, optval
         
     | 
| 
      
 1073 
     | 
    
         
            +
                      io.setsockopt Socket::SOL_SOCKET, Socket::SO_SNDTIMEO, optval
         
     | 
| 
      
 1074 
     | 
    
         
            +
                    rescue Exception => ex
         
     | 
| 
      
 1075 
     | 
    
         
            +
                      # Solaris, for one, does not like/support socket timeouts.
         
     | 
| 
      
 1076 
     | 
    
         
            +
                      @logger.info "[memcache-client] Unable to use raw socket timeouts: #{ex.class.name}: #{ex.message}" if @logger
         
     | 
| 
      
 1077 
     | 
    
         
            +
                    end
         
     | 
| 
      
 1078 
     | 
    
         
            +
                  end
         
     | 
| 
       1030 
1079 
     | 
    
         
             
                  io
         
     | 
| 
       1031 
1080 
     | 
    
         
             
                end
         
     | 
| 
       1032 
1081 
     | 
    
         | 
| 
         @@ -0,0 +1,105 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            ##
         
     | 
| 
      
 2 
     | 
    
         
            +
            # A utility wrapper around the MemCache client to simplify cache access.  All
         
     | 
| 
      
 3 
     | 
    
         
            +
            # methods silently ignore MemCache errors.
         
     | 
| 
      
 4 
     | 
    
         
            +
            # 
         
     | 
| 
      
 5 
     | 
    
         
            +
            # This API is deprecated, please use the Rails.cache API or your own wrapper API
         
     | 
| 
      
 6 
     | 
    
         
            +
            # around MemCache.
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            module Cache
         
     | 
| 
      
 9 
     | 
    
         
            +
              
         
     | 
| 
      
 10 
     | 
    
         
            +
              ##
         
     | 
| 
      
 11 
     | 
    
         
            +
              # Try to return a logger object that does not rely
         
     | 
| 
      
 12 
     | 
    
         
            +
              # on ActiveRecord for logging.
         
     | 
| 
      
 13 
     | 
    
         
            +
              def self.logger
         
     | 
| 
      
 14 
     | 
    
         
            +
                @logger ||= if defined? Rails.logger # Rails 2.1 +
         
     | 
| 
      
 15 
     | 
    
         
            +
                  Rails.logger
         
     | 
| 
      
 16 
     | 
    
         
            +
                elsif defined? RAILS_DEFAULT_LOGGER # Rails 1.2.2 +
         
     | 
| 
      
 17 
     | 
    
         
            +
                  RAILS_DEFAULT_LOGGER
         
     | 
| 
      
 18 
     | 
    
         
            +
                else
         
     | 
| 
      
 19 
     | 
    
         
            +
                  ActiveRecord::Base.logger # ... very old Rails.
         
     | 
| 
      
 20 
     | 
    
         
            +
                end
         
     | 
| 
      
 21 
     | 
    
         
            +
              end
         
     | 
| 
      
 22 
     | 
    
         
            +
              ##
         
     | 
| 
      
 23 
     | 
    
         
            +
              # Returns the object at +key+ from the cache if successful, or nil if either
         
     | 
| 
      
 24 
     | 
    
         
            +
              # the object is not in the cache or if there was an error attermpting to
         
     | 
| 
      
 25 
     | 
    
         
            +
              # access the cache.
         
     | 
| 
      
 26 
     | 
    
         
            +
              #
         
     | 
| 
      
 27 
     | 
    
         
            +
              # If there is a cache miss and a block is given the result of the block will
         
     | 
| 
      
 28 
     | 
    
         
            +
              # be stored in the cache with optional +expiry+, using the +add+ method rather
         
     | 
| 
      
 29 
     | 
    
         
            +
              # than +set+.
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
              def self.get(key, expiry = 0)
         
     | 
| 
      
 32 
     | 
    
         
            +
                start_time = Time.now
         
     | 
| 
      
 33 
     | 
    
         
            +
                value = CACHE.get key
         
     | 
| 
      
 34 
     | 
    
         
            +
                elapsed = Time.now - start_time
         
     | 
| 
      
 35 
     | 
    
         
            +
                logger.debug('MemCache Get (%0.6f)  %s' % [elapsed, key])
         
     | 
| 
      
 36 
     | 
    
         
            +
                if value.nil? and block_given? then
         
     | 
| 
      
 37 
     | 
    
         
            +
                  value = yield
         
     | 
| 
      
 38 
     | 
    
         
            +
                  add key, value, expiry
         
     | 
| 
      
 39 
     | 
    
         
            +
                end
         
     | 
| 
      
 40 
     | 
    
         
            +
                value
         
     | 
| 
      
 41 
     | 
    
         
            +
              rescue MemCache::MemCacheError => err
         
     | 
| 
      
 42 
     | 
    
         
            +
                logger.debug "MemCache Error: #{err.message}"
         
     | 
| 
      
 43 
     | 
    
         
            +
                if block_given? then
         
     | 
| 
      
 44 
     | 
    
         
            +
                  value = yield
         
     | 
| 
      
 45 
     | 
    
         
            +
                  put key, value, expiry
         
     | 
| 
      
 46 
     | 
    
         
            +
                end
         
     | 
| 
      
 47 
     | 
    
         
            +
                value
         
     | 
| 
      
 48 
     | 
    
         
            +
              end
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
              ##
         
     | 
| 
      
 51 
     | 
    
         
            +
              # Sets +value+ in the cache at +key+, with an optional +expiry+ time in
         
     | 
| 
      
 52 
     | 
    
         
            +
              # seconds.
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
              def self.put(key, value, expiry = 0)
         
     | 
| 
      
 55 
     | 
    
         
            +
                start_time = Time.now
         
     | 
| 
      
 56 
     | 
    
         
            +
                CACHE.set key, value, expiry
         
     | 
| 
      
 57 
     | 
    
         
            +
                elapsed = Time.now - start_time
         
     | 
| 
      
 58 
     | 
    
         
            +
                logger.debug('MemCache Set (%0.6f)  %s' % [elapsed, key])
         
     | 
| 
      
 59 
     | 
    
         
            +
                value
         
     | 
| 
      
 60 
     | 
    
         
            +
              rescue MemCache::MemCacheError => err
         
     | 
| 
      
 61 
     | 
    
         
            +
                ActiveRecord::Base.logger.debug "MemCache Error: #{err.message}"
         
     | 
| 
      
 62 
     | 
    
         
            +
                nil
         
     | 
| 
      
 63 
     | 
    
         
            +
              end
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
              ##
         
     | 
| 
      
 66 
     | 
    
         
            +
              # Sets +value+ in the cache at +key+, with an optional +expiry+ time in
         
     | 
| 
      
 67 
     | 
    
         
            +
              # seconds.  If +key+ already exists in cache, returns nil.
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
              def self.add(key, value, expiry = 0)
         
     | 
| 
      
 70 
     | 
    
         
            +
                start_time = Time.now
         
     | 
| 
      
 71 
     | 
    
         
            +
                response = CACHE.add key, value, expiry
         
     | 
| 
      
 72 
     | 
    
         
            +
                elapsed = Time.now - start_time
         
     | 
| 
      
 73 
     | 
    
         
            +
                logger.debug('MemCache Add (%0.6f)  %s' % [elapsed, key])
         
     | 
| 
      
 74 
     | 
    
         
            +
                (response == "STORED\r\n") ? value : nil
         
     | 
| 
      
 75 
     | 
    
         
            +
              rescue MemCache::MemCacheError => err
         
     | 
| 
      
 76 
     | 
    
         
            +
                ActiveRecord::Base.logger.debug "MemCache Error: #{err.message}"
         
     | 
| 
      
 77 
     | 
    
         
            +
                nil
         
     | 
| 
      
 78 
     | 
    
         
            +
              end
         
     | 
| 
      
 79 
     | 
    
         
            +
             
     | 
| 
      
 80 
     | 
    
         
            +
              ##
         
     | 
| 
      
 81 
     | 
    
         
            +
              # Deletes +key+ from the cache in +delay+ seconds.
         
     | 
| 
      
 82 
     | 
    
         
            +
             
     | 
| 
      
 83 
     | 
    
         
            +
              def self.delete(key, delay = nil)
         
     | 
| 
      
 84 
     | 
    
         
            +
                start_time = Time.now
         
     | 
| 
      
 85 
     | 
    
         
            +
                CACHE.delete key, delay
         
     | 
| 
      
 86 
     | 
    
         
            +
                elapsed = Time.now - start_time
         
     | 
| 
      
 87 
     | 
    
         
            +
                logger.debug('MemCache Delete (%0.6f)  %s' %
         
     | 
| 
      
 88 
     | 
    
         
            +
                                                [elapsed, key])
         
     | 
| 
      
 89 
     | 
    
         
            +
                nil
         
     | 
| 
      
 90 
     | 
    
         
            +
              rescue MemCache::MemCacheError => err
         
     | 
| 
      
 91 
     | 
    
         
            +
                logger.debug "MemCache Error: #{err.message}"
         
     | 
| 
      
 92 
     | 
    
         
            +
                nil
         
     | 
| 
      
 93 
     | 
    
         
            +
              end
         
     | 
| 
      
 94 
     | 
    
         
            +
             
     | 
| 
      
 95 
     | 
    
         
            +
              ##
         
     | 
| 
      
 96 
     | 
    
         
            +
              # Resets all connections to MemCache servers.
         
     | 
| 
      
 97 
     | 
    
         
            +
             
     | 
| 
      
 98 
     | 
    
         
            +
              def self.reset
         
     | 
| 
      
 99 
     | 
    
         
            +
                CACHE.reset
         
     | 
| 
      
 100 
     | 
    
         
            +
                logger.debug 'MemCache Connections Reset'
         
     | 
| 
      
 101 
     | 
    
         
            +
                nil
         
     | 
| 
      
 102 
     | 
    
         
            +
              end
         
     | 
| 
      
 103 
     | 
    
         
            +
             
     | 
| 
      
 104 
     | 
    
         
            +
            end
         
     | 
| 
      
 105 
     | 
    
         
            +
             
     | 
    
        data/performance.txt
    ADDED
    
    | 
         @@ -0,0 +1,143 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            == 1.5.0, 1.8.6 (default in Rails 2.2 and lower)
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
                                                 user     system      total        real
         
     | 
| 
      
 4 
     | 
    
         
            +
            set:plain:memcache-client       41.550000   0.590000  42.140000 ( 43.740685)
         
     | 
| 
      
 5 
     | 
    
         
            +
            set:ruby:memcache-client        41.540000   0.590000  42.130000 ( 43.733796)
         
     | 
| 
      
 6 
     | 
    
         
            +
            get:plain:memcache-client       41.920000   0.610000  42.530000 ( 44.031005)
         
     | 
| 
      
 7 
     | 
    
         
            +
            get:ruby:memcache-client        41.940000   0.600000  42.540000 ( 44.082447)
         
     | 
| 
      
 8 
     | 
    
         
            +
            multiget:ruby:memcache-client   46.120000   0.440000  46.560000 ( 47.354041)
         
     | 
| 
      
 9 
     | 
    
         
            +
            missing:ruby:memcache-client    41.490000   0.580000  42.070000 ( 43.610837)
         
     | 
| 
      
 10 
     | 
    
         
            +
            mixed:ruby:memcache-client      83.820000   1.190000  85.010000 ( 88.117077)
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            == 1.7.0, timeout, 1.8.6 (closest to default in Rails 2.3)
         
     | 
| 
      
 14 
     | 
    
         
            +
                                                 user     system      total        real
         
     | 
| 
      
 15 
     | 
    
         
            +
            set:plain:memcache-client        4.320000   2.280000   6.600000 (  7.102900)
         
     | 
| 
      
 16 
     | 
    
         
            +
            set:ruby:memcache-client         4.400000   2.300000   6.700000 (  6.856992)
         
     | 
| 
      
 17 
     | 
    
         
            +
            get:plain:memcache-client        9.890000   6.830000  16.720000 ( 16.984208)
         
     | 
| 
      
 18 
     | 
    
         
            +
            get:ruby:memcache-client        10.040000   6.890000  16.930000 ( 17.141128)
         
     | 
| 
      
 19 
     | 
    
         
            +
            multiget:ruby:memcache-client    5.350000   4.110000   9.460000 (  9.542898)
         
     | 
| 
      
 20 
     | 
    
         
            +
            missing:ruby:memcache-client     4.710000   3.180000   7.890000 (  8.030969)
         
     | 
| 
      
 21 
     | 
    
         
            +
            mixed:ruby:memcache-client      14.540000   9.200000  23.740000 ( 24.121824)
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
            == 1.7.0, timeout, system_timer, 1.8.6
         
     | 
| 
      
 24 
     | 
    
         
            +
                                                 user     system      total        real
         
     | 
| 
      
 25 
     | 
    
         
            +
            set:plain:memcache-client        3.840000   0.640000   4.480000 (  4.643790)
         
     | 
| 
      
 26 
     | 
    
         
            +
            set:ruby:memcache-client         3.930000   0.650000   4.580000 (  4.731868)
         
     | 
| 
      
 27 
     | 
    
         
            +
            get:plain:memcache-client        8.320000   1.290000   9.610000 (  9.903877)
         
     | 
| 
      
 28 
     | 
    
         
            +
            get:ruby:memcache-client         8.460000   1.310000   9.770000 (  9.986694)
         
     | 
| 
      
 29 
     | 
    
         
            +
            multiget:ruby:memcache-client    4.250000   0.560000   4.810000 (  4.935326)
         
     | 
| 
      
 30 
     | 
    
         
            +
            missing:ruby:memcache-client     3.840000   0.640000   4.480000 (  4.569696)
         
     | 
| 
      
 31 
     | 
    
         
            +
            mixed:ruby:memcache-client      12.400000   1.960000  14.360000 ( 14.857924)
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
            == 1.7.0, timeout, 1.9.1
         
     | 
| 
      
 34 
     | 
    
         
            +
                                                 user     system      total        real
         
     | 
| 
      
 35 
     | 
    
         
            +
            set:plain:memcache-client        2.130000   2.150000   4.280000 (  3.774238)
         
     | 
| 
      
 36 
     | 
    
         
            +
            set:ruby:memcache-client         2.230000   2.230000   4.460000 (  3.883686)
         
     | 
| 
      
 37 
     | 
    
         
            +
            get:plain:memcache-client        4.030000   4.250000   8.280000 (  6.702740)
         
     | 
| 
      
 38 
     | 
    
         
            +
            get:ruby:memcache-client         4.090000   4.220000   8.310000 (  6.749134)
         
     | 
| 
      
 39 
     | 
    
         
            +
            multiget:ruby:memcache-client    1.960000   1.840000   3.800000 (  3.089448)
         
     | 
| 
      
 40 
     | 
    
         
            +
            missing:ruby:memcache-client     2.110000   2.210000   4.320000 (  3.659019)
         
     | 
| 
      
 41 
     | 
    
         
            +
            mixed:ruby:memcache-client       6.400000   6.560000  12.960000 ( 11.116317)
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
            == 1.7.0, no timeout, 1.9.1
         
     | 
| 
      
 44 
     | 
    
         
            +
                                                 user     system      total        real
         
     | 
| 
      
 45 
     | 
    
         
            +
            set:plain:memcache-client        0.560000   0.320000   0.880000 (  1.849380)
         
     | 
| 
      
 46 
     | 
    
         
            +
            set:ruby:memcache-client         0.630000   0.320000   0.950000 (  1.968208)
         
     | 
| 
      
 47 
     | 
    
         
            +
            get:plain:memcache-client        0.640000   0.330000   0.970000 (  1.962473)
         
     | 
| 
      
 48 
     | 
    
         
            +
            get:ruby:memcache-client         0.690000   0.320000   1.010000 (  2.002295)
         
     | 
| 
      
 49 
     | 
    
         
            +
            multiget:ruby:memcache-client    0.460000   0.110000   0.570000 (  0.885827)
         
     | 
| 
      
 50 
     | 
    
         
            +
            missing:ruby:memcache-client     0.530000   0.320000   0.850000 (  1.721371)
         
     | 
| 
      
 51 
     | 
    
         
            +
            mixed:ruby:memcache-client       1.340000   0.660000   2.000000 (  3.973213)
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
            == 1.7.0, no timeout, 1.8.6
         
     | 
| 
      
 54 
     | 
    
         
            +
                                                 user     system      total        real
         
     | 
| 
      
 55 
     | 
    
         
            +
            set:plain:memcache-client        1.220000   0.310000   1.530000 (  2.763310)
         
     | 
| 
      
 56 
     | 
    
         
            +
            set:ruby:memcache-client         1.270000   0.300000   1.570000 (  2.806251)
         
     | 
| 
      
 57 
     | 
    
         
            +
            get:plain:memcache-client        1.400000   0.300000   1.700000 (  2.944343)
         
     | 
| 
      
 58 
     | 
    
         
            +
            get:ruby:memcache-client         1.450000   0.310000   1.760000 (  2.997234)
         
     | 
| 
      
 59 
     | 
    
         
            +
            multiget:ruby:memcache-client    1.120000   0.110000   1.230000 (  1.665716)
         
     | 
| 
      
 60 
     | 
    
         
            +
            missing:ruby:memcache-client     1.160000   0.300000   1.460000 (  2.683376)
         
     | 
| 
      
 61 
     | 
    
         
            +
            mixed:ruby:memcache-client       2.760000   0.610000   3.370000 (  5.851047)
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
            == 1.7.1, timeout, 1.8.6, raw + gets SystemTimer
         
     | 
| 
      
 64 
     | 
    
         
            +
                                                 user     system      total        real
         
     | 
| 
      
 65 
     | 
    
         
            +
            set:plain:memcache-client        2.670000   0.510000   3.180000 (  3.489509)
         
     | 
| 
      
 66 
     | 
    
         
            +
            set:ruby:memcache-client         2.810000   0.530000   3.340000 (  3.675955)
         
     | 
| 
      
 67 
     | 
    
         
            +
            get:plain:memcache-client        4.380000   0.720000   5.100000 (  5.400587)
         
     | 
| 
      
 68 
     | 
    
         
            +
            get:ruby:memcache-client         4.490000   0.730000   5.220000 (  5.477543)
         
     | 
| 
      
 69 
     | 
    
         
            +
            multiget:ruby:memcache-client    2.570000   0.310000   2.880000 (  3.034944)
         
     | 
| 
      
 70 
     | 
    
         
            +
            missing:ruby:memcache-client     2.800000   0.530000   3.330000 (  3.547073)
         
     | 
| 
      
 71 
     | 
    
         
            +
            mixed:ruby:memcache-client       7.460000   1.250000   8.710000 (  9.272177)
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
      
 73 
     | 
    
         
            +
            == 1.7.1, timeout, 1.9.1, raw + gets Timeout
         
     | 
| 
      
 74 
     | 
    
         
            +
                                                 user     system      total        real
         
     | 
| 
      
 75 
     | 
    
         
            +
            set:plain:memcache-client        1.370000   1.300000   2.670000 (  2.708669)
         
     | 
| 
      
 76 
     | 
    
         
            +
            set:ruby:memcache-client         1.400000   1.240000   2.640000 (  2.713737)
         
     | 
| 
      
 77 
     | 
    
         
            +
            get:plain:memcache-client        2.070000   2.020000   4.090000 (  3.950879)
         
     | 
| 
      
 78 
     | 
    
         
            +
            get:ruby:memcache-client         2.160000   2.090000   4.250000 (  3.924613)
         
     | 
| 
      
 79 
     | 
    
         
            +
            multiget:ruby:memcache-client    1.080000   0.820000   1.900000 (  1.744107)
         
     | 
| 
      
 80 
     | 
    
         
            +
            missing:ruby:memcache-client     1.330000   1.270000   2.600000 (  2.547597)
         
     | 
| 
      
 81 
     | 
    
         
            +
            mixed:ruby:memcache-client       3.540000   3.270000   6.810000 (  6.735349)
         
     | 
| 
      
 82 
     | 
    
         
            +
             
     | 
| 
      
 83 
     | 
    
         
            +
            == 1.7.1, timeout, 1.8.6, raw + gets SystemTimer, native binary search
         
     | 
| 
      
 84 
     | 
    
         
            +
                                                 user     system      total        real
         
     | 
| 
      
 85 
     | 
    
         
            +
            set:plain:memcache-client        1.840000   0.450000   2.290000 (  2.651285)
         
     | 
| 
      
 86 
     | 
    
         
            +
            set:ruby:memcache-client         1.960000   0.460000   2.420000 (  2.712650)
         
     | 
| 
      
 87 
     | 
    
         
            +
            get:plain:memcache-client        3.180000   0.630000   3.810000 (  4.079930)
         
     | 
| 
      
 88 
     | 
    
         
            +
            get:ruby:memcache-client         3.290000   0.640000   3.930000 (  4.242648)
         
     | 
| 
      
 89 
     | 
    
         
            +
            multiget:ruby:memcache-client    1.640000   0.250000   1.890000 (  2.003687)
         
     | 
| 
      
 90 
     | 
    
         
            +
            missing:ruby:memcache-client     1.940000   0.450000   2.390000 (  2.619675)
         
     | 
| 
      
 91 
     | 
    
         
            +
            mixed:ruby:memcache-client       5.360000   1.100000   6.460000 (  7.040998)
         
     | 
| 
      
 92 
     | 
    
         
            +
             
     | 
| 
      
 93 
     | 
    
         
            +
            == 1.7.2, timeout, 1.8.6, SystemTimer, native binary search
         
     | 
| 
      
 94 
     | 
    
         
            +
                                                 user     system      total        real
         
     | 
| 
      
 95 
     | 
    
         
            +
            set:plain:memcache-client        3.260000   0.590000   3.850000 (  4.067382)
         
     | 
| 
      
 96 
     | 
    
         
            +
            set:ruby:memcache-client         3.370000   0.590000   3.960000 (  4.364004)
         
     | 
| 
      
 97 
     | 
    
         
            +
            get:plain:memcache-client        6.740000   1.240000   7.980000 (  8.586676)
         
     | 
| 
      
 98 
     | 
    
         
            +
            get:ruby:memcache-client         6.780000   1.210000   7.990000 (  8.423400)
         
     | 
| 
      
 99 
     | 
    
         
            +
            multiget:ruby:memcache-client    3.480000   0.540000   4.020000 (  4.288633)
         
     | 
| 
      
 100 
     | 
    
         
            +
            missing:ruby:memcache-client     3.250000   0.590000   3.840000 (  4.043602)
         
     | 
| 
      
 101 
     | 
    
         
            +
            mixed:ruby:memcache-client      10.150000   1.810000  11.960000 ( 12.372054)
         
     | 
| 
      
 102 
     | 
    
         
            +
             
     | 
| 
      
 103 
     | 
    
         
            +
            == 1.7.4, 1.8.6, buffered and non-blocking IO
         
     | 
| 
      
 104 
     | 
    
         
            +
                                                 user     system      total        real
         
     | 
| 
      
 105 
     | 
    
         
            +
            set:plain:memcache-client        2.450000   0.790000   3.240000 (  3.397091)
         
     | 
| 
      
 106 
     | 
    
         
            +
            set:ruby:memcache-client         2.490000   0.790000   3.280000 (  3.555436)
         
     | 
| 
      
 107 
     | 
    
         
            +
            get:plain:memcache-client        2.840000   0.810000   3.650000 (  3.759695)
         
     | 
| 
      
 108 
     | 
    
         
            +
            get:ruby:memcache-client         2.890000   0.790000   3.680000 (  3.778011)
         
     | 
| 
      
 109 
     | 
    
         
            +
            multiget:ruby:memcache-client    1.380000   0.280000   1.660000 (  1.695290)
         
     | 
| 
      
 110 
     | 
    
         
            +
            missing:ruby:memcache-client     2.380000   0.780000   3.160000 (  3.251136)
         
     | 
| 
      
 111 
     | 
    
         
            +
            mixed:ruby:memcache-client       5.360000   1.600000   6.960000 (  7.189314)
         
     | 
| 
      
 112 
     | 
    
         
            +
             
     | 
| 
      
 113 
     | 
    
         
            +
            == memcached 0.13 + libmemcached 0.25.4 versus memcache-client 1.7.4
         
     | 
| 
      
 114 
     | 
    
         
            +
             
     | 
| 
      
 115 
     | 
    
         
            +
                                                 user     system      total        real
         
     | 
| 
      
 116 
     | 
    
         
            +
            set:plain:noblock:memcached      0.090000   0.030000   0.120000 (  0.277929)
         
     | 
| 
      
 117 
     | 
    
         
            +
            set:plain:memcached              0.220000   0.270000   0.490000 (  1.251547)
         
     | 
| 
      
 118 
     | 
    
         
            +
            set:plain:memcache-client        0.610000   0.270000   0.880000 (  1.670718)
         
     | 
| 
      
 119 
     | 
    
         
            +
            set:ruby:noblock:memcached       0.150000   0.020000   0.170000 (  0.309201)
         
     | 
| 
      
 120 
     | 
    
         
            +
            set:ruby:memcached               0.300000   0.290000   0.590000 (  1.390354)
         
     | 
| 
      
 121 
     | 
    
         
            +
            set:ruby:memcache-client         0.670000   0.270000   0.940000 (  1.713558)
         
     | 
| 
      
 122 
     | 
    
         
            +
            get:plain:memcached              0.240000   0.270000   0.510000 (  1.169909)
         
     | 
| 
      
 123 
     | 
    
         
            +
            get:plain:memcache-client        0.850000   0.270000   1.120000 (  1.885270)
         
     | 
| 
      
 124 
     | 
    
         
            +
            get:ruby:memcached               0.270000   0.280000   0.550000 (  1.229705)
         
     | 
| 
      
 125 
     | 
    
         
            +
            get:ruby:memcache-client         0.890000   0.260000   1.150000 (  1.861660)
         
     | 
| 
      
 126 
     | 
    
         
            +
            multiget:ruby:memcached          0.190000   0.090000   0.280000 (  0.396264)
         
     | 
| 
      
 127 
     | 
    
         
            +
            multiget:ruby:memcache-client    0.530000   0.100000   0.630000 (  0.901016)
         
     | 
| 
      
 128 
     | 
    
         
            +
            missing:ruby:memcached           0.280000   0.290000   0.570000 (  1.254400)
         
     | 
| 
      
 129 
     | 
    
         
            +
            missing:ruby:memcached:inline    0.300000   0.290000   0.590000 (  1.235122)
         
     | 
| 
      
 130 
     | 
    
         
            +
            missing:ruby:memcache-client     0.570000   0.250000   0.820000 (  1.461293)
         
     | 
| 
      
 131 
     | 
    
         
            +
            mixed:ruby:noblock:memcached     0.540000   0.620000   1.160000 (  2.429200)
         
     | 
| 
      
 132 
     | 
    
         
            +
            mixed:ruby:memcached             0.580000   0.570000   1.150000 (  2.610819)
         
     | 
| 
      
 133 
     | 
    
         
            +
            mixed:ruby:memcache-client       1.580000   0.540000   2.120000 (  3.632775)
         
     | 
| 
      
 134 
     | 
    
         
            +
             
     | 
| 
      
 135 
     | 
    
         
            +
            == 1.7.6, 1.8.7 64-bit (Snow Leopard), SystemTimer
         
     | 
| 
      
 136 
     | 
    
         
            +
                                                 user     system      total        real
         
     | 
| 
      
 137 
     | 
    
         
            +
            set:plain:memcache-client        3.070000   0.380000   3.450000 (  3.643275)
         
     | 
| 
      
 138 
     | 
    
         
            +
            set:ruby:memcache-client         3.140000   0.370000   3.510000 (  3.698602)
         
     | 
| 
      
 139 
     | 
    
         
            +
            get:plain:memcache-client        3.480000   0.360000   3.840000 (  3.983941)
         
     | 
| 
      
 140 
     | 
    
         
            +
            get:ruby:memcache-client         3.540000   0.360000   3.900000 (  4.034308)
         
     | 
| 
      
 141 
     | 
    
         
            +
            multiget:ruby:memcache-client    1.690000   0.140000   1.830000 (  1.889290)
         
     | 
| 
      
 142 
     | 
    
         
            +
            missing:ruby:memcache-client     3.070000   0.360000   3.430000 (  3.571754)
         
     | 
| 
      
 143 
     | 
    
         
            +
            mixed:ruby:memcache-client       6.720000   0.750000   7.470000 (  7.838771)
         
     | 
| 
         @@ -0,0 +1,134 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            HERE = File.dirname(__FILE__)
         
     | 
| 
      
 2 
     | 
    
         
            +
            $LOAD_PATH.unshift "#{HERE}/../lib"
         
     | 
| 
      
 3 
     | 
    
         
            +
            #$LOAD_PATH << "/Library/Ruby/Gems/1.8/gems/activesupport-2.2.2/lib/active_support/vendor/memcache-client-1.5.1"
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            require 'benchmark'
         
     | 
| 
      
 6 
     | 
    
         
            +
            require 'rubygems'
         
     | 
| 
      
 7 
     | 
    
         
            +
            require 'test/unit'
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            $TESTING = true
         
     | 
| 
      
 10 
     | 
    
         
            +
            require 'memcache' if not defined?(MemCache)
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            class TestBenchmark < Test::Unit::TestCase
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
              def setup
         
     | 
| 
      
 15 
     | 
    
         
            +
                puts "Testing #{MemCache::VERSION}"
         
     | 
| 
      
 16 
     | 
    
         
            +
                # We'll use a simple @value to try to avoid spending time in Marshal,
         
     | 
| 
      
 17 
     | 
    
         
            +
                # which is a constant penalty that both clients have to pay
         
     | 
| 
      
 18 
     | 
    
         
            +
                @value = []
         
     | 
| 
      
 19 
     | 
    
         
            +
                @marshalled = Marshal.dump(@value)
         
     | 
| 
      
 20 
     | 
    
         
            +
                
         
     | 
| 
      
 21 
     | 
    
         
            +
                @opts = [
         
     | 
| 
      
 22 
     | 
    
         
            +
                  ['127.0.0.1:11211', 'localhost:11211'],
         
     | 
| 
      
 23 
     | 
    
         
            +
                  {
         
     | 
| 
      
 24 
     | 
    
         
            +
                    :namespace => "namespace",
         
     | 
| 
      
 25 
     | 
    
         
            +
            #        :no_reply => true,
         
     | 
| 
      
 26 
     | 
    
         
            +
            #        :timeout => nil,
         
     | 
| 
      
 27 
     | 
    
         
            +
                  }
         
     | 
| 
      
 28 
     | 
    
         
            +
                ]
         
     | 
| 
      
 29 
     | 
    
         
            +
                @key1 = "Short"
         
     | 
| 
      
 30 
     | 
    
         
            +
                @key2 = "Sym1-2-3::45"*8
         
     | 
| 
      
 31 
     | 
    
         
            +
                @key3 = "Long"*40
         
     | 
| 
      
 32 
     | 
    
         
            +
                @key4 = "Medium"*8
         
     | 
| 
      
 33 
     | 
    
         
            +
                # 5 and 6 are only used for multiget miss test
         
     | 
| 
      
 34 
     | 
    
         
            +
                @key5 = "Medium2"*8 
         
     | 
| 
      
 35 
     | 
    
         
            +
                @key6 = "Long3"*40 
         
     | 
| 
      
 36 
     | 
    
         
            +
              end
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
              def test_benchmark
         
     | 
| 
      
 39 
     | 
    
         
            +
                Benchmark.bm(31) do |x|
         
     | 
| 
      
 40 
     | 
    
         
            +
                
         
     | 
| 
      
 41 
     | 
    
         
            +
                  n = 2500
         
     | 
| 
      
 42 
     | 
    
         
            +
            #      n = 1000
         
     | 
| 
      
 43 
     | 
    
         
            +
                
         
     | 
| 
      
 44 
     | 
    
         
            +
                  @m = MemCache.new(*@opts)
         
     | 
| 
      
 45 
     | 
    
         
            +
                  x.report("set:plain:memcache-client") do
         
     | 
| 
      
 46 
     | 
    
         
            +
                    n.times do
         
     | 
| 
      
 47 
     | 
    
         
            +
                      @m.set @key1, @marshalled, 0, true
         
     | 
| 
      
 48 
     | 
    
         
            +
                      @m.set @key2, @marshalled, 0, true
         
     | 
| 
      
 49 
     | 
    
         
            +
                      @m.set @key3, @marshalled, 0, true
         
     | 
| 
      
 50 
     | 
    
         
            +
                      @m.set @key1, @marshalled, 0, true
         
     | 
| 
      
 51 
     | 
    
         
            +
                      @m.set @key2, @marshalled, 0, true
         
     | 
| 
      
 52 
     | 
    
         
            +
                      @m.set @key3, @marshalled, 0, true
         
     | 
| 
      
 53 
     | 
    
         
            +
                    end
         
     | 
| 
      
 54 
     | 
    
         
            +
                  end
         
     | 
| 
      
 55 
     | 
    
         
            +
                
         
     | 
| 
      
 56 
     | 
    
         
            +
                  @m = MemCache.new(*@opts)
         
     | 
| 
      
 57 
     | 
    
         
            +
                  x.report("set:ruby:memcache-client") do
         
     | 
| 
      
 58 
     | 
    
         
            +
                    n.times do
         
     | 
| 
      
 59 
     | 
    
         
            +
                      @m.set @key1, @value
         
     | 
| 
      
 60 
     | 
    
         
            +
                      @m.set @key2, @value
         
     | 
| 
      
 61 
     | 
    
         
            +
                      @m.set @key3, @value
         
     | 
| 
      
 62 
     | 
    
         
            +
                      @m.set @key1, @value
         
     | 
| 
      
 63 
     | 
    
         
            +
                      @m.set @key2, @value
         
     | 
| 
      
 64 
     | 
    
         
            +
                      @m.set @key3, @value
         
     | 
| 
      
 65 
     | 
    
         
            +
                    end
         
     | 
| 
      
 66 
     | 
    
         
            +
                  end
         
     | 
| 
      
 67 
     | 
    
         
            +
                
         
     | 
| 
      
 68 
     | 
    
         
            +
                  @m = MemCache.new(*@opts)
         
     | 
| 
      
 69 
     | 
    
         
            +
                  x.report("get:plain:memcache-client") do
         
     | 
| 
      
 70 
     | 
    
         
            +
                    n.times do
         
     | 
| 
      
 71 
     | 
    
         
            +
                      @m.get @key1, true
         
     | 
| 
      
 72 
     | 
    
         
            +
                      @m.get @key2, true
         
     | 
| 
      
 73 
     | 
    
         
            +
                      @m.get @key3, true
         
     | 
| 
      
 74 
     | 
    
         
            +
                      @m.get @key1, true
         
     | 
| 
      
 75 
     | 
    
         
            +
                      @m.get @key2, true
         
     | 
| 
      
 76 
     | 
    
         
            +
                      @m.get @key3, true
         
     | 
| 
      
 77 
     | 
    
         
            +
                    end
         
     | 
| 
      
 78 
     | 
    
         
            +
                  end
         
     | 
| 
      
 79 
     | 
    
         
            +
                
         
     | 
| 
      
 80 
     | 
    
         
            +
                  @m = MemCache.new(*@opts)
         
     | 
| 
      
 81 
     | 
    
         
            +
                  x.report("get:ruby:memcache-client") do
         
     | 
| 
      
 82 
     | 
    
         
            +
                    n.times do
         
     | 
| 
      
 83 
     | 
    
         
            +
                      @m.get @key1
         
     | 
| 
      
 84 
     | 
    
         
            +
                      @m.get @key2
         
     | 
| 
      
 85 
     | 
    
         
            +
                      @m.get @key3
         
     | 
| 
      
 86 
     | 
    
         
            +
                      @m.get @key1
         
     | 
| 
      
 87 
     | 
    
         
            +
                      @m.get @key2
         
     | 
| 
      
 88 
     | 
    
         
            +
                      @m.get @key3
         
     | 
| 
      
 89 
     | 
    
         
            +
                    end
         
     | 
| 
      
 90 
     | 
    
         
            +
                  end
         
     | 
| 
      
 91 
     | 
    
         
            +
             
     | 
| 
      
 92 
     | 
    
         
            +
                  @m = MemCache.new(*@opts)
         
     | 
| 
      
 93 
     | 
    
         
            +
                  x.report("multiget:ruby:memcache-client") do
         
     | 
| 
      
 94 
     | 
    
         
            +
                    n.times do
         
     | 
| 
      
 95 
     | 
    
         
            +
                      # We don't use the keys array because splat is slow
         
     | 
| 
      
 96 
     | 
    
         
            +
                      @m.get_multi @key1, @key2, @key3, @key4, @key5, @key6
         
     | 
| 
      
 97 
     | 
    
         
            +
                    end
         
     | 
| 
      
 98 
     | 
    
         
            +
                  end
         
     | 
| 
      
 99 
     | 
    
         
            +
                
         
     | 
| 
      
 100 
     | 
    
         
            +
                  @m = MemCache.new(*@opts)
         
     | 
| 
      
 101 
     | 
    
         
            +
                  x.report("missing:ruby:memcache-client") do
         
     | 
| 
      
 102 
     | 
    
         
            +
                    n.times do
         
     | 
| 
      
 103 
     | 
    
         
            +
                      begin @m.delete @key1; rescue; end
         
     | 
| 
      
 104 
     | 
    
         
            +
                      begin @m.get @key1; rescue; end
         
     | 
| 
      
 105 
     | 
    
         
            +
                      begin @m.delete @key2; rescue; end
         
     | 
| 
      
 106 
     | 
    
         
            +
                      begin @m.get @key2; rescue; end
         
     | 
| 
      
 107 
     | 
    
         
            +
                      begin @m.delete @key3; rescue; end
         
     | 
| 
      
 108 
     | 
    
         
            +
                      begin @m.get @key3; rescue; end
         
     | 
| 
      
 109 
     | 
    
         
            +
                    end
         
     | 
| 
      
 110 
     | 
    
         
            +
                  end
         
     | 
| 
      
 111 
     | 
    
         
            +
                      
         
     | 
| 
      
 112 
     | 
    
         
            +
                  @m = MemCache.new(*@opts)
         
     | 
| 
      
 113 
     | 
    
         
            +
                  x.report("mixed:ruby:memcache-client") do
         
     | 
| 
      
 114 
     | 
    
         
            +
                    n.times do
         
     | 
| 
      
 115 
     | 
    
         
            +
                      @m.set @key1, @value
         
     | 
| 
      
 116 
     | 
    
         
            +
                      @m.set @key2, @value
         
     | 
| 
      
 117 
     | 
    
         
            +
                      @m.set @key3, @value
         
     | 
| 
      
 118 
     | 
    
         
            +
                      @m.get @key1
         
     | 
| 
      
 119 
     | 
    
         
            +
                      @m.get @key2
         
     | 
| 
      
 120 
     | 
    
         
            +
                      @m.get @key3
         
     | 
| 
      
 121 
     | 
    
         
            +
                      @m.set @key1, @value
         
     | 
| 
      
 122 
     | 
    
         
            +
                      @m.get @key1
         
     | 
| 
      
 123 
     | 
    
         
            +
                      @m.set @key2, @value
         
     | 
| 
      
 124 
     | 
    
         
            +
                      @m.get @key2
         
     | 
| 
      
 125 
     | 
    
         
            +
                      @m.set @key3, @value
         
     | 
| 
      
 126 
     | 
    
         
            +
                      @m.get @key3
         
     | 
| 
      
 127 
     | 
    
         
            +
                    end
         
     | 
| 
      
 128 
     | 
    
         
            +
                  end
         
     | 
| 
      
 129 
     | 
    
         
            +
             
     | 
| 
      
 130 
     | 
    
         
            +
                  assert true
         
     | 
| 
      
 131 
     | 
    
         
            +
                end
         
     | 
| 
      
 132 
     | 
    
         
            +
             
     | 
| 
      
 133 
     | 
    
         
            +
              end
         
     | 
| 
      
 134 
     | 
    
         
            +
            end
         
     | 
    
        data/test/test_mem_cache.rb
    CHANGED
    
    | 
         @@ -1100,6 +1100,25 @@ class TestMemCache < Test::Unit::TestCase 
     | 
|
| 
       1100 
1100 
     | 
    
         
             
                assert_match(/test value/, output)
         
     | 
| 
       1101 
1101 
     | 
    
         
             
              end
         
     | 
| 
       1102 
1102 
     | 
    
         | 
| 
      
 1103 
     | 
    
         
            +
              def test_namespace_separator
         
     | 
| 
      
 1104 
     | 
    
         
            +
                cache = MemCache.new :namespace => 'ns', :namespace_separator => ''
         
     | 
| 
      
 1105 
     | 
    
         
            +
             
     | 
| 
      
 1106 
     | 
    
         
            +
                server = FakeServer.new
         
     | 
| 
      
 1107 
     | 
    
         
            +
                server.socket.data.write "STORED\r\n"
         
     | 
| 
      
 1108 
     | 
    
         
            +
                server.socket.data.rewind
         
     | 
| 
      
 1109 
     | 
    
         
            +
             
     | 
| 
      
 1110 
     | 
    
         
            +
                cache.servers = []
         
     | 
| 
      
 1111 
     | 
    
         
            +
                cache.servers << server
         
     | 
| 
      
 1112 
     | 
    
         
            +
             
     | 
| 
      
 1113 
     | 
    
         
            +
                assert_nothing_raised do
         
     | 
| 
      
 1114 
     | 
    
         
            +
                  cache.set "test", "test value"
         
     | 
| 
      
 1115 
     | 
    
         
            +
                end
         
     | 
| 
      
 1116 
     | 
    
         
            +
             
     | 
| 
      
 1117 
     | 
    
         
            +
                output = server.socket.written.string
         
     | 
| 
      
 1118 
     | 
    
         
            +
                assert_match(/set nstest/, output)
         
     | 
| 
      
 1119 
     | 
    
         
            +
                assert_match(/test value/, output)
         
     | 
| 
      
 1120 
     | 
    
         
            +
              end
         
     | 
| 
      
 1121 
     | 
    
         
            +
             
     | 
| 
       1103 
1122 
     | 
    
         
             
              def test_basic_unthreaded_operations_should_work
         
     | 
| 
       1104 
1123 
     | 
    
         
             
                cache = MemCache.new :multithread => false,
         
     | 
| 
       1105 
1124 
     | 
    
         
             
                                     :namespace => 'my_namespace',
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification 
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: memcache-client
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version 
         
     | 
| 
       4 
     | 
    
         
            -
              version: 1.7. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 1.7.6
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors: 
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Eric Hodel
         
     | 
| 
         @@ -11,7 +11,7 @@ autorequire: 
     | 
|
| 
       11 
11 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       12 
12 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       13 
13 
     | 
    
         | 
| 
       14 
     | 
    
         
            -
            date: 2009- 
     | 
| 
      
 14 
     | 
    
         
            +
            date: 2009-11-03 00:00:00 -06:00
         
     | 
| 
       15 
15 
     | 
    
         
             
            default_executable: 
         
     | 
| 
       16 
16 
     | 
    
         
             
            dependencies: []
         
     | 
| 
       17 
17 
     | 
    
         | 
| 
         @@ -21,23 +21,29 @@ executables: [] 
     | 
|
| 
       21 
21 
     | 
    
         | 
| 
       22 
22 
     | 
    
         
             
            extensions: []
         
     | 
| 
       23 
23 
     | 
    
         | 
| 
       24 
     | 
    
         
            -
            extra_rdoc_files:  
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
      
 24 
     | 
    
         
            +
            extra_rdoc_files: 
         
     | 
| 
      
 25 
     | 
    
         
            +
            - LICENSE.txt
         
     | 
| 
      
 26 
     | 
    
         
            +
            - README.rdoc
         
     | 
| 
       26 
27 
     | 
    
         
             
            files: 
         
     | 
| 
       27 
28 
     | 
    
         
             
            - FAQ.rdoc
         
     | 
| 
       28 
     | 
    
         
            -
            - README.rdoc
         
     | 
| 
       29 
     | 
    
         
            -
            - LICENSE.txt
         
     | 
| 
       30 
29 
     | 
    
         
             
            - History.rdoc
         
     | 
| 
      
 30 
     | 
    
         
            +
            - LICENSE.txt
         
     | 
| 
      
 31 
     | 
    
         
            +
            - README.rdoc
         
     | 
| 
       31 
32 
     | 
    
         
             
            - Rakefile
         
     | 
| 
       32 
     | 
    
         
            -
            -  
     | 
| 
      
 33 
     | 
    
         
            +
            - VERSION.yml
         
     | 
| 
       33 
34 
     | 
    
         
             
            - lib/continuum_native.rb
         
     | 
| 
      
 35 
     | 
    
         
            +
            - lib/memcache.rb
         
     | 
| 
      
 36 
     | 
    
         
            +
            - lib/memcache_util.rb
         
     | 
| 
      
 37 
     | 
    
         
            +
            - performance.txt
         
     | 
| 
      
 38 
     | 
    
         
            +
            - test/test_benchmark.rb
         
     | 
| 
      
 39 
     | 
    
         
            +
            - test/test_mem_cache.rb
         
     | 
| 
       34 
40 
     | 
    
         
             
            has_rdoc: true
         
     | 
| 
       35 
41 
     | 
    
         
             
            homepage: http://github.com/mperham/memcache-client
         
     | 
| 
       36 
42 
     | 
    
         
             
            licenses: []
         
     | 
| 
       37 
43 
     | 
    
         | 
| 
       38 
44 
     | 
    
         
             
            post_install_message: 
         
     | 
| 
       39 
     | 
    
         
            -
            rdoc_options:  
     | 
| 
       40 
     | 
    
         
            -
             
     | 
| 
      
 45 
     | 
    
         
            +
            rdoc_options: 
         
     | 
| 
      
 46 
     | 
    
         
            +
            - --charset=UTF-8
         
     | 
| 
       41 
47 
     | 
    
         
             
            require_paths: 
         
     | 
| 
       42 
48 
     | 
    
         
             
            - lib
         
     | 
| 
       43 
49 
     | 
    
         
             
            required_ruby_version: !ruby/object:Gem::Requirement 
         
     | 
| 
         @@ -60,4 +66,5 @@ signing_key: 
     | 
|
| 
       60 
66 
     | 
    
         
             
            specification_version: 3
         
     | 
| 
       61 
67 
     | 
    
         
             
            summary: A Ruby library for accessing memcached.
         
     | 
| 
       62 
68 
     | 
    
         
             
            test_files: 
         
     | 
| 
      
 69 
     | 
    
         
            +
            - test/test_benchmark.rb
         
     | 
| 
       63 
70 
     | 
    
         
             
            - test/test_mem_cache.rb
         
     |