зеркало из https://github.com/github/memcached.git
Speed up multiget. Don't cast types on unmarshalled set.
This commit is contained in:
Родитель
982dc730d2
Коммит
b616594434
|
@ -308,7 +308,7 @@ Please note that when <tt>:no_block => true</tt>, update methods do not raise on
|
|||
# Also accepts a <tt>marshal</tt> value, which defaults to <tt>true</tt>. Set <tt>marshal</tt> to <tt>false</tt> if you want the <tt>value</tt> to be set directly.
|
||||
#
|
||||
def set(key, value, ttl=@default_ttl, marshal=true, flags=FLAGS)
|
||||
value = marshal ? Marshal.dump(value) : value.to_s
|
||||
value = marshal ? Marshal.dump(value) : value
|
||||
begin
|
||||
check_return_code(
|
||||
Lib.memcached_set(@struct, key, value, ttl, flags),
|
||||
|
@ -325,7 +325,7 @@ Please note that when <tt>:no_block => true</tt>, update methods do not raise on
|
|||
|
||||
# Add a key/value pair. Raises <b>Memcached::NotStored</b> if the key already exists on the server. The parameters are the same as <tt>set</tt>.
|
||||
def add(key, value, ttl=@default_ttl, marshal=true, flags=FLAGS)
|
||||
value = marshal ? Marshal.dump(value) : value.to_s
|
||||
value = marshal ? Marshal.dump(value) : value
|
||||
begin
|
||||
check_return_code(
|
||||
Lib.memcached_add(@struct, key, value, ttl, flags),
|
||||
|
@ -374,7 +374,7 @@ Please note that when <tt>:no_block => true</tt>, update methods do not raise on
|
|||
|
||||
# Replace a key/value pair. Raises <b>Memcached::NotFound</b> if the key does not exist on the server. The parameters are the same as <tt>set</tt>.
|
||||
def replace(key, value, ttl=@default_ttl, marshal=true, flags=FLAGS)
|
||||
value = marshal ? Marshal.dump(value) : value.to_s
|
||||
value = marshal ? Marshal.dump(value) : value
|
||||
begin
|
||||
check_return_code(
|
||||
Lib.memcached_replace(@struct, key, value, ttl, flags),
|
||||
|
@ -504,14 +504,14 @@ Please note that when <tt>:no_block => true</tt>, update methods do not raise on
|
|||
check_return_code(ret, keys)
|
||||
|
||||
hash = {}
|
||||
keys.each do
|
||||
value, key, flags, ret = Lib.memcached_fetch_rvalue(@struct)
|
||||
break if ret == Lib::MEMCACHED_END
|
||||
if ret != Lib::MEMCACHED_NOTFOUND
|
||||
check_return_code(ret, key)
|
||||
# Assign the value
|
||||
value, key, flags, ret = Lib.memcached_fetch_rvalue(@struct)
|
||||
while ret != 21 do # Lib::MEMCACHED_END
|
||||
if ret == 0 # Lib::MEMCACHED_SUCCESS
|
||||
hash[key] = (marshal ? Marshal.load(value) : value)
|
||||
elsif ret != 16 # Lib::MEMCACHED_NOTFOUND
|
||||
check_return_code(ret, key)
|
||||
end
|
||||
value, key, flags, ret = Lib.memcached_fetch_rvalue(@struct)
|
||||
end
|
||||
hash
|
||||
else
|
||||
|
@ -592,10 +592,10 @@ Please note that when <tt>:no_block => true</tt>, update methods do not raise on
|
|||
# Checks the return code from Rlibmemcached against the exception list. Raises the corresponding exception if the return code is not Memcached::Success or Memcached::ActionQueued. Accepts an integer return code and an optional key, for exception messages.
|
||||
def check_return_code(ret, key = nil) #:doc:
|
||||
if ret == 0 # Memcached::Success
|
||||
elsif ret == Lib::MEMCACHED_BUFFERED # Memcached::ActionQueued
|
||||
elsif ret == Lib::MEMCACHED_NOTFOUND and @not_found
|
||||
elsif ret == 32 # Lib::MEMCACHED_BUFFERED # Memcached::ActionQueued
|
||||
elsif ret == 16 # Lib::MEMCACHED_NOTFOUND and @not_found
|
||||
raise @not_found
|
||||
elsif ret == Lib::MEMCACHED_NOTSTORED and @not_stored
|
||||
elsif ret == 14 # Lib::MEMCACHED_NOTSTORED and @not_stored
|
||||
raise @not_stored
|
||||
else
|
||||
message = "Key #{inspect_keys(key, (detect_failure if ret == Lib::MEMCACHED_SERVER_MARKED_DEAD)).inspect}"
|
||||
|
|
|
@ -120,8 +120,12 @@ class Bench
|
|||
end
|
||||
|
||||
def benchmark_clients(test_name, populate_keys = true)
|
||||
return if ENV["TEST"] and !test_name.include?(ENV["TEST"])
|
||||
|
||||
@clients.keys.sort.each do |client_name|
|
||||
next if ENV["CLIENT"] and !client_name.include?(ENV["CLIENT"])
|
||||
next if client_name == "stash" and test_name == "set-large" # Don't let stash break the world
|
||||
|
||||
client = @clients[client_name]
|
||||
begin
|
||||
if populate_keys
|
||||
|
|
|
@ -177,9 +177,8 @@ class MemcachedTest < Test::Unit::TestCase
|
|||
end
|
||||
|
||||
def test_initialize_with_backtraces
|
||||
cache = Memcached.new @servers,
|
||||
:show_backtraces => true
|
||||
cache.delete key rescue
|
||||
cache = Memcached.new @servers, :show_backtraces => true
|
||||
cache.delete key rescue nil
|
||||
begin
|
||||
cache.get key
|
||||
rescue Memcached::NotFound => e
|
||||
|
@ -404,9 +403,21 @@ class MemcachedTest < Test::Unit::TestCase
|
|||
assert_equal @marshalled_value, result
|
||||
end
|
||||
|
||||
def test_set_unmarshalled_and_get_unmarshalled
|
||||
@cache.set key, @marshalled_value, 0, false
|
||||
result = @cache.get key, false
|
||||
assert_equal @marshalled_value, result
|
||||
end
|
||||
|
||||
def test_set_unmarshalled_error
|
||||
assert_raises(TypeError) do
|
||||
@cache.set key, @value, 0, false
|
||||
end
|
||||
end
|
||||
|
||||
def test_get_multi_unmarshalled
|
||||
@cache.set "#{key}_1", 1, 0, false
|
||||
@cache.set "#{key}_2", 2, 0, false
|
||||
@cache.set "#{key}_1", "1", 0, false
|
||||
@cache.set "#{key}_2", "2", 0, false
|
||||
assert_equal(
|
||||
{"#{key}_1" => "1", "#{key}_2" => "2"},
|
||||
@cache.get(["#{key}_1", "#{key}_2"], false)
|
||||
|
@ -415,7 +426,7 @@ class MemcachedTest < Test::Unit::TestCase
|
|||
|
||||
def test_get_multi_mixed_marshalling
|
||||
@cache.set "#{key}_1", 1
|
||||
@cache.set "#{key}_2", 2, 0, false
|
||||
@cache.set "#{key}_2", "2", 0, false
|
||||
assert_nothing_raised do
|
||||
@cache.get(["#{key}_1", "#{key}_2"], false)
|
||||
end
|
||||
|
@ -566,12 +577,12 @@ class MemcachedTest < Test::Unit::TestCase
|
|||
# Increment and decrement
|
||||
|
||||
def test_increment
|
||||
@cache.set key, 10, 0, false
|
||||
@cache.set key, "10", 0, false
|
||||
assert_equal 11, @cache.increment(key)
|
||||
end
|
||||
|
||||
def test_increment_offset
|
||||
@cache.set key, 10, 0, false
|
||||
@cache.set key, "10", 0, false
|
||||
assert_equal 15, @cache.increment(key, 5)
|
||||
end
|
||||
|
||||
|
@ -583,12 +594,12 @@ class MemcachedTest < Test::Unit::TestCase
|
|||
end
|
||||
|
||||
def test_decrement
|
||||
@cache.set key, 10, 0, false
|
||||
@cache.set key, "10", 0, false
|
||||
assert_equal 9, @cache.decrement(key)
|
||||
end
|
||||
|
||||
def test_decrement_offset
|
||||
@cache.set key, 10, 0, false
|
||||
@cache.set key, "10", 0, false
|
||||
assert_equal 5, @cache.decrement(key, 5)
|
||||
end
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче