Class: Memcache::Server

Inherits:
Base 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
# 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'
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



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

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)


32
33
34
# File 'lib/memcache/server.rb', line 32

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

#append(key, value) ⇒ Object



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

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



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

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



20
21
22
# File 'lib/memcache/server.rb', line 20

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

#close(error = nil) ⇒ Object



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

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



70
71
72
# File 'lib/memcache/server.rb', line 70

def count
  stats['curr_items']
end

#decr(key, amount = 1) ⇒ Object

Raises:



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

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



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

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

#flush_all(delay = nil) ⇒ Object



74
75
76
# File 'lib/memcache/server.rb', line 74

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

#get(keys, cas = nil) ⇒ Object



78
79
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
# File 'lib/memcache/server.rb', line 78

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")

    value.memcache_flags = flags.to_i
    value.memcache_cas   = cas

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

#incr(key, amount = 1) ⇒ Object

Raises:



106
107
108
109
110
# File 'lib/memcache/server.rb', line 106

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



24
25
26
# File 'lib/memcache/server.rb', line 24

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

#nameObject



28
29
30
# File 'lib/memcache/server.rb', line 28

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

#prepend(key, value) ⇒ Object



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

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



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

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



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

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



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

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)


36
37
38
# File 'lib/memcache/server.rb', line 36

def strict_reads?
  @strict_reads
end