Class: Memcache::Server

Inherits:
Base
  • Object
show all
Defined in:
lib/memcache/server.rb

Direct Known Subclasses

SegmentedServer

Constant Summary collapse

CONNECT_TIMEOUT =
1.0
READ_RETRY_DELAY =
5.0
DEFAULT_PORT =
11211

Instance Attribute Summary collapse

Attributes inherited from Base

#prefix

Instance Method Summary collapse

Methods inherited from Base

#clear, #gets

Constructor Details

#initialize(opts) ⇒ Server

Returns a new instance of Server.



13
14
15
16
17
18
19
20
# File 'lib/memcache/server.rb', line 13

def initialize(opts)
  @host         = opts[:host]
  @port         = opts[:port] || DEFAULT_PORT
  @strict_reads = opts[:strict_reads]
  @status       = 'NOT CONNECTED'
  @retry_at     = nil
  @socket       = nil
end

Instance Attribute Details

#hostObject (readonly)

Returns the value of attribute host.



11
12
13
# File 'lib/memcache/server.rb', line 11

def host
  @host
end

#portObject (readonly)

Returns the value of attribute port.



11
12
13
# File 'lib/memcache/server.rb', line 11

def port
  @port
end

#retry_atObject (readonly)

Returns the value of attribute retry_at.



11
12
13
# File 'lib/memcache/server.rb', line 11

def retry_at
  @retry_at
end

#statusObject (readonly)

Returns the value of attribute status.



11
12
13
# File 'lib/memcache/server.rb', line 11

def status
  @status
end

Instance Method Details

#add(key, value, expiry = 0, flags = 0) ⇒ Object



138
139
140
141
# File 'lib/memcache/server.rb', line 138

def add(key, value, expiry = 0, flags = 0)
  response = write_command("add #{cache_key(key)} #{flags.to_i} #{expiry.to_i} #{value.to_s.size}", value)
  response == "STORED\r\n" ? value : nil
end

#alive?Boolean

Returns:

  • (Boolean)


34
35
36
# File 'lib/memcache/server.rb', line 34

def alive?
  @retry_at.nil? or @retry_at < Time.now
end

#append(key, value) ⇒ Object



148
149
150
151
# File 'lib/memcache/server.rb', line 148

def append(key, value)
  response = write_command("append #{cache_key(key)} 0 0 #{value.to_s.size}", value)
  response == "STORED\r\n"
end

#cas(key, value, cas, expiry = 0, flags = 0) ⇒ Object



133
134
135
136
# File 'lib/memcache/server.rb', line 133

def cas(key, value, cas, expiry = 0, flags = 0)
  response = write_command("cas #{cache_key(key)} #{flags.to_i} #{expiry.to_i} #{value.to_s.size} #{cas.to_i}", value)
  response == "STORED\r\n" ? value : nil
end

#cloneObject



22
23
24
# File 'lib/memcache/server.rb', line 22

def clone
  self.class.new(:host => host, :port => port, :strict_reads => strict_reads?)
end

#close(error = nil) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/memcache/server.rb', line 42

def close(error = nil)
  # Close the socket. If there is an error, mark the server dead.
  @socket.close if @socket and not @socket.closed?
  @socket = nil

  if error
    @retry_at = Time.now + READ_RETRY_DELAY
    @status   = "DEAD: %s: %s, will retry at %s" % [error.class, error.message, @retry_at]
  else
    @retry_at = nil
    @status   = "NOT CONNECTED"
  end
end

#countObject



72
73
74
# File 'lib/memcache/server.rb', line 72

def count
  stats['curr_items']
end

#decr(key, amount = 1) ⇒ Object

Raises:



117
118
119
120
121
# File 'lib/memcache/server.rb', line 117

def decr(key, amount = 1)
  raise Error, "decr requires unsigned value" if amount < 0
  response = write_command("decr #{cache_key(key)} #{amount}")
  response == "NOT_FOUND\r\n" ? nil : response.slice(0..-3).to_i
end

#delete(key) ⇒ Object



123
124
125
# File 'lib/memcache/server.rb', line 123

def delete(key)
  write_command("delete #{cache_key(key)}") == "DELETED\r\n" ? true : nil
end

#flush_all(delay = nil) ⇒ Object



76
77
78
# File 'lib/memcache/server.rb', line 76

def flush_all(delay = nil)
  write_command("flush_all #{delay}")
end

#get(keys, cas = nil) ⇒ Object



80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/memcache/server.rb', line 80

def get(keys, cas = nil)
  return get([keys], cas)[keys.to_s] unless keys.kind_of?(Array)
  return {} if keys.empty?

  method = cas ? 'gets' : 'get'

  results = {}
  keys = keys.collect {|key| cache_key(key)}

  read_command("#{method} #{keys.join(' ')}") do |response|
    if cas
      key, flags, length, cas = match_response!(response, /^VALUE ([^\s]+) ([^\s]+) ([^\s]+) ([^\s]+)/)
    else
      key, flags, length = match_response!(response, /^VALUE ([^\s]+) ([^\s]+) ([^\s]+)/)
    end

    value = socket.read(length.to_i)
    match_response!(socket.read(2), "\r\n")

    result = {
      :value => value,
      :flags => flags.to_i,
    }
    result[:cas] = cas if cas

    key = input_key(key)
    results[key] = result
  end
  results
end

#incr(key, amount = 1) ⇒ Object

Raises:



111
112
113
114
115
# File 'lib/memcache/server.rb', line 111

def incr(key, amount = 1)
  raise Error, "incr requires unsigned value" if amount < 0
  response = write_command("incr #{cache_key(key)} #{amount}")
  response == "NOT_FOUND\r\n" ? nil : response.slice(0..-3).to_i
end

#inspectObject



26
27
28
# File 'lib/memcache/server.rb', line 26

def inspect
  "<#{self.class.name}: %s:%d (%s)>" % [@host, @port, @status]
end

#nameObject



30
31
32
# File 'lib/memcache/server.rb', line 30

def name
  "#{host}:#{port}"
end

#prepend(key, value) ⇒ Object



153
154
155
156
# File 'lib/memcache/server.rb', line 153

def prepend(key, value)
  response = write_command("prepend #{cache_key(key)} 0 0 #{value.to_s.size}", value)
  response == "STORED\r\n"
end

#replace(key, value, expiry = 0, flags = 0) ⇒ Object



143
144
145
146
# File 'lib/memcache/server.rb', line 143

def replace(key, value, expiry = 0, flags = 0)
  response = write_command("replace #{cache_key(key)} #{flags.to_i} #{expiry.to_i} #{value.to_s.size}", value)
  response == "STORED\r\n" ? value : nil
end

#set(key, value, expiry = 0, flags = 0) ⇒ Object



127
128
129
130
131
# File 'lib/memcache/server.rb', line 127

def set(key, value, expiry = 0, flags = 0)
  return delete(key) if value.nil?
  write_command("set #{cache_key(key)} #{flags.to_i} #{expiry.to_i} #{value.to_s.size}", value)
  value
end

#statsObject



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/memcache/server.rb', line 56

def stats
  stats = {}
  read_command('stats') do |response|
    key, value = match_response!(response, /^STAT ([\w]+) (-?[\w\.\:]+)/)

    if ['rusage_user', 'rusage_system'].include?(key)
      seconds, microseconds = value.split(/:/, 2)
      microseconds ||= 0
      stats[key] = Float(seconds) + (Float(microseconds) / 1_000_000)
    else
      stats[key] = (value =~ /^-?\d+$/ ? value.to_i : value)
    end
  end
  stats
end

#strict_reads?Boolean

Returns:

  • (Boolean)


38
39
40
# File 'lib/memcache/server.rb', line 38

def strict_reads?
  @strict_reads
end