vinted-memcached 1.8.4 → 1.8.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/build_release_pipeline.yaml +53 -0
- data/.gitignore +33 -0
- data/BENCHMARKS +130 -126
- data/CHANGELOG +1 -6
- data/Gemfile +8 -1
- data/Gemfile.lock +25 -38
- data/README.md +144 -0
- data/Rakefile +21 -93
- data/ext/rlibmemcached/extconf.rb +76 -0
- data/ext/{rlibmemcached.i → rlibmemcached/rlibmemcached.i} +48 -69
- data/ext/{rlibmemcached_wrap.c → rlibmemcached/rlibmemcached_wrap.c} +146 -320
- data/lib/memcached/exceptions.rb +1 -12
- data/lib/memcached/experimental.rb +1 -33
- data/lib/memcached/memcached.rb +41 -34
- data/lib/memcached/version.rb +1 -1
- data/lib/memcached.rb +9 -4
- data/memcached.gemspec +0 -0
- data/memcached.pem +21 -0
- data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_connect.c +23 -13
- data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_io.c +18 -13
- data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_purge.c +1 -1
- metadata +192 -246
- data/Manifest +0 -209
- data/README.rdoc +0 -124
- data/ext/extconf-make.rb +0 -25
- data/ext/extconf.rb +0 -78
- data/lib/memcached/auth.rb +0 -16
- data/test/profile/benchmark.rb +0 -280
- data/test/profile/c_profiler.rb +0 -14
- data/test/profile/exercise.rb +0 -185
- data/test/profile/rb_profiler.rb +0 -21
- data/test/profile/valgrind.rb +0 -10
- data/test/setup.rb +0 -30
- data/test/teardown.rb +0 -0
- data/test/test_helper.rb +0 -18
- data/test/unit/binding_test.rb +0 -8
- data/test/unit/memcached_experimental_test.rb +0 -272
- data/test/unit/memcached_test.rb +0 -1487
- data/test/unit/rails_test.rb +0 -330
- /data/{ext → vendor}/libmemcached-0.32/AUTHORS +0 -0
- /data/{ext → vendor}/libmemcached-0.32/COPYING +0 -0
- /data/{ext → vendor}/libmemcached-0.32/ChangeLog +0 -0
- /data/{ext → vendor}/libmemcached-0.32/INSTALL +0 -0
- /data/{ext → vendor}/libmemcached-0.32/Makefile.am +0 -0
- /data/{ext → vendor}/libmemcached-0.32/Makefile.in +0 -0
- /data/{ext → vendor}/libmemcached-0.32/NEWS +0 -0
- /data/{ext → vendor}/libmemcached-0.32/README +0 -0
- /data/{ext → vendor}/libmemcached-0.32/THANKS +0 -0
- /data/{ext → vendor}/libmemcached-0.32/TODO +0 -0
- /data/{ext → vendor}/libmemcached-0.32/aclocal.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/clients/Makefile.am +0 -0
- /data/{ext → vendor}/libmemcached-0.32/clients/Makefile.in +0 -0
- /data/{ext → vendor}/libmemcached-0.32/clients/client_options.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/clients/execute.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/clients/execute.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/clients/generator.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/clients/generator.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/clients/memcat.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/clients/memcp.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/clients/memdump.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/clients/memerror.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/clients/memflush.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/clients/memrm.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/clients/memslap.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/clients/memstat.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/clients/utilities.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/clients/utilities.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/config/compile +0 -0
- /data/{ext → vendor}/libmemcached-0.32/config/config.guess +0 -0
- /data/{ext → vendor}/libmemcached-0.32/config/config.rpath +0 -0
- /data/{ext → vendor}/libmemcached-0.32/config/config.sub +0 -0
- /data/{ext → vendor}/libmemcached-0.32/config/depcomp +0 -0
- /data/{ext → vendor}/libmemcached-0.32/config/install-sh +0 -0
- /data/{ext → vendor}/libmemcached-0.32/config/ltmain.sh +0 -0
- /data/{ext → vendor}/libmemcached-0.32/config/missing +0 -0
- /data/{ext → vendor}/libmemcached-0.32/config.h.in +0 -0
- /data/{ext → vendor}/libmemcached-0.32/configure +0 -0
- /data/{ext → vendor}/libmemcached-0.32/configure.ac +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/Makefile.am +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/Makefile.in +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/byteorder.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/common.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/crc.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/hsieh_hash.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/jenkins_hash.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/libmemcached.ver +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/libmemcached_probes.d +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/libmemcached_probes.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/md5.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached/README.txt +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached/protocol_binary.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached.hpp +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_allocators.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_analyze.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_auto.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_behavior.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_callback.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_configure.h.in +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_constants.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_delete.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_do.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_dump.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_exist.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_exist.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_fetch.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_flush.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_flush_buffers.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_get.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_get.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_hash.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_hosts.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_internal.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_io.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_key.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_parse.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_pool.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_quit.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_response.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_result.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_result.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_sasl.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_sasl.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_server.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_server.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_stats.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_storage.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_storage.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_strerror.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_string.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_string.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_touch.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_touch.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_types.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_util.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_verbosity.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_version.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_watchpoint.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/murmur_hash.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/visibility.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcachedutil/Makefile.am +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcachedutil/Makefile.in +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcachedutil/libmemcachedutil.ver +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcachedutil/memcached_pool.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/ac_cxx_compile_stdcxx_0x.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/ac_cxx_header_stdcxx_98.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/acx_pthread.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/byteorder.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/deprecated.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/enable_utillib.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/extensions.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/hsieh.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/lib-prefix.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/libtool.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/ltoptions.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/ltsugar.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/ltversion.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/lt~obsolete.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/memcached.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/pandora_64bit.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/pandora_canonical.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/pandora_check_compiler_version.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/pandora_check_cxx_standard.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/pandora_enable_dtrace.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/pandora_ensure_gcc_version.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/pandora_have_better_malloc.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/pandora_have_sasl.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/pandora_header_assert.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/pandora_libtool.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/pandora_optimize.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/pandora_shared_ptr.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/pandora_vc_build.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/pandora_warnings.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/pod2man.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/protocol_binary.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/setsockopt.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/visibility.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/support/Makefile.am +0 -0
- /data/{ext → vendor}/libmemcached-0.32/support/Makefile.in +0 -0
- /data/{ext → vendor}/libmemcached-0.32/support/libmemcached-fc.spec.in +0 -0
- /data/{ext → vendor}/libmemcached-0.32/support/libmemcached.pc.in +0 -0
- /data/{ext → vendor}/libmemcached-0.32/support/libmemcached.spec +0 -0
- /data/{ext → vendor}/libmemcached-0.32/support/libmemcached.spec.in +0 -0
- /data/{ext → vendor}/libmemcached-0.32/support/set_benchmark.sh +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/Makefile.am +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/Makefile.in +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/atomsmasher.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/function.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/ketama_test_cases.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/output.cmp +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/output.res +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/output2.res +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/plus.cpp +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/r/memcat.res +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/r/memcp.res +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/r/memrm.res +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/r/memslap.res +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/r/memstat.res +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/server.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/server.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/start.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/t/memcat.test +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/t/memcp.test +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/t/memrm.test +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/t/memslap.test +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/t/memstat.test +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/test.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/test.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/udp.c +0 -0
data/README.md
ADDED
@@ -0,0 +1,144 @@
|
|
1
|
+
# memcached
|
2
|
+
|
3
|
+
An interface to the libmemcached C client.
|
4
|
+
[![Build Status](https://github.com/arthurnn/memcached/workflows/CI/badge.svg?branch=1-0-stable)](https://github.com/arthurnn/memcached/actions?query=branch%3A1-0-stable)
|
5
|
+
|
6
|
+
## License
|
7
|
+
|
8
|
+
Copyright 2009-2013 Cloudburst, LLC. Licensed under the AFL 3. See the
|
9
|
+
included LICENSE file. Portions copyright 2007-2009 TangentOrg, Brian Aker,
|
10
|
+
licensed under the BSD license, and used with permission.
|
11
|
+
|
12
|
+
## Features
|
13
|
+
|
14
|
+
* clean API
|
15
|
+
* robust access to all memcached features
|
16
|
+
* SASL support for the binary protocol
|
17
|
+
* multiple hashing modes, including consistent hashing
|
18
|
+
* ludicrous speed, including optional pipelined IO with no_reply
|
19
|
+
|
20
|
+
|
21
|
+
The **memcached** library wraps the pure-C libmemcached client via SWIG.
|
22
|
+
|
23
|
+
## Installation
|
24
|
+
|
25
|
+
You need Ruby 1.8.7 or Ruby 1.9.2. Other versions may work, but are not
|
26
|
+
guaranteed. You also need the `libsasl2-dev` and `gettext` libraries, which
|
27
|
+
should be provided through your system's package manager.
|
28
|
+
|
29
|
+
Install the gem:
|
30
|
+
sudo gem install memcached --no-rdoc --no-ri
|
31
|
+
|
32
|
+
## Usage
|
33
|
+
|
34
|
+
Start a local networked memcached server:
|
35
|
+
$ memcached -p 11211 &
|
36
|
+
|
37
|
+
Now, in Ruby, require the library and instantiate a Memcached object at a
|
38
|
+
global level:
|
39
|
+
|
40
|
+
require 'memcached'
|
41
|
+
$cache = Memcached.new("localhost:11211")
|
42
|
+
|
43
|
+
Now you can set things and get things:
|
44
|
+
|
45
|
+
value = 'hello'
|
46
|
+
$cache.set 'test', value
|
47
|
+
$cache.get 'test' #=> "hello"
|
48
|
+
|
49
|
+
You can set with an expiration timeout:
|
50
|
+
|
51
|
+
value = 'hello'
|
52
|
+
$cache.set 'test', value, 1
|
53
|
+
sleep(2)
|
54
|
+
$cache.get 'test' #=> raises Memcached::NotFound
|
55
|
+
|
56
|
+
You can get multiple values at once:
|
57
|
+
|
58
|
+
value = 'hello'
|
59
|
+
$cache.set 'test', value
|
60
|
+
$cache.set 'test2', value
|
61
|
+
$cache.get ['test', 'test2', 'missing']
|
62
|
+
#=> {"test" => "hello", "test2" => "hello"}
|
63
|
+
|
64
|
+
You can set a counter and increment it. Note that you must initialize it with
|
65
|
+
an integer, encoded as an unmarshalled ASCII string:
|
66
|
+
|
67
|
+
start = 1
|
68
|
+
$cache.set 'counter', start.to_s, 0, false
|
69
|
+
$cache.increment 'counter' #=> 2
|
70
|
+
$cache.increment 'counter' #=> 3
|
71
|
+
$cache.get('counter', false).to_i #=> 3
|
72
|
+
|
73
|
+
You can get some server stats:
|
74
|
+
|
75
|
+
$cache.stats #=> {..., :bytes_written=>[62], :version=>["1.2.4"] ...}
|
76
|
+
|
77
|
+
Note that the API is not the same as that of **Ruby-MemCache** or
|
78
|
+
**memcache-client**. In particular, `nil` is a valid record value.
|
79
|
+
Memcached#get does not return `nil` on failure, rather it raises
|
80
|
+
**Memcached::NotFound**. This is consistent with the behavior of memcached
|
81
|
+
itself. For example:
|
82
|
+
|
83
|
+
$cache.set 'test', nil
|
84
|
+
$cache.get 'test' #=> nil
|
85
|
+
$cache.delete 'test'
|
86
|
+
$cache.get 'test' #=> raises Memcached::NotFound
|
87
|
+
|
88
|
+
## Rails 3 and 4
|
89
|
+
|
90
|
+
Use [memcached_store gem](https://github.com/Shopify/memcached_store) to
|
91
|
+
integrate ActiveSupport cache store and memcached gem
|
92
|
+
|
93
|
+
## Pipelining
|
94
|
+
|
95
|
+
Pipelining updates is extremely effective in **memcached**, leading to more
|
96
|
+
than 25x write throughput than the default settings. Use the following options
|
97
|
+
to enable it:
|
98
|
+
|
99
|
+
:no_block => true,
|
100
|
+
:buffer_requests => true,
|
101
|
+
:noreply => true,
|
102
|
+
:binary_protocol => false
|
103
|
+
|
104
|
+
Currently #append, #prepend, #set, and #delete are pipelined. Note that when
|
105
|
+
you perform a read, all pending writes are flushed to the servers.
|
106
|
+
|
107
|
+
## Threading
|
108
|
+
|
109
|
+
**memcached** is threadsafe, but each thread requires its own Memcached
|
110
|
+
instance. Create a global Memcached, and then call Memcached#clone each time
|
111
|
+
you spawn a thread.
|
112
|
+
|
113
|
+
thread = Thread.new do
|
114
|
+
cache = $cache.clone
|
115
|
+
# Perform operations on cache, not $cache
|
116
|
+
cache.set 'example', 1
|
117
|
+
cache.get 'example'
|
118
|
+
end
|
119
|
+
|
120
|
+
# Join the thread so that exceptions don't get lost
|
121
|
+
thread.join
|
122
|
+
|
123
|
+
## Legacy applications
|
124
|
+
|
125
|
+
There is a compatibility wrapper for legacy applications called
|
126
|
+
Memcached::Rails.
|
127
|
+
|
128
|
+
## Benchmarks
|
129
|
+
|
130
|
+
**memcached**, correctly configured, is at least twice as fast as
|
131
|
+
**memcache-client** and **dalli**. See link:BENCHMARKS for details.
|
132
|
+
|
133
|
+
## Reporting problems
|
134
|
+
|
135
|
+
The support forum is [here](http://github.com/evan/memcached/issues).
|
136
|
+
|
137
|
+
Patches and contributions are very welcome. Please note that contributors are
|
138
|
+
required to assign copyright for their additions to Cloudburst, LLC.
|
139
|
+
|
140
|
+
## Further resources
|
141
|
+
|
142
|
+
* [Memcached wiki](https://github.com/memcached/memcached/wiki)
|
143
|
+
* [Libmemcached homepage](libmemcached.org)
|
144
|
+
|
data/Rakefile
CHANGED
@@ -1,58 +1,26 @@
|
|
1
|
-
require '
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
require 'rake/testtask'
|
3
|
+
require 'rake/extensiontask'
|
2
4
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
"ext/Makefile.in",
|
19
|
-
"ext/libmemcached-*/autom4te.cache",
|
20
|
-
"ext/libmemcached-*/clients/memcat",
|
21
|
-
"ext/libmemcached-*/clients/memcp",
|
22
|
-
"ext/libmemcached-*/clients/memdump",
|
23
|
-
"ext/libmemcached-*/clients/memerror",
|
24
|
-
"ext/libmemcached-*/clients/memflush",
|
25
|
-
"ext/libmemcached-*/clients/memrm",
|
26
|
-
"ext/libmemcached-*/clients/memslap",
|
27
|
-
"ext/libmemcached-*/clients/memstat",
|
28
|
-
"ext/libmemcached-*/tests/atomsmasher",
|
29
|
-
"ext/libmemcached-*/tests/startservers",
|
30
|
-
"ext/libmemcached-*/tests/testapp",
|
31
|
-
"ext/libmemcached-*/tests/testplus",
|
32
|
-
"ext/libmemcached-*/tests/udptest",
|
33
|
-
"ext/libmemcached-*/config.h",
|
34
|
-
"ext/libmemcached-*/config.log",
|
35
|
-
"ext/libmemcached-*/config.status",
|
36
|
-
"ext/libmemcached-*/docs/*.[1,3]",
|
37
|
-
"ext/libmemcached-*/libmemcached/memcached_configure.h",
|
38
|
-
"ext/libmemcached-*/libtool",
|
39
|
-
"ext/libmemcached-*/stamp*",
|
40
|
-
"ext/libmemcached-*/support/libmemcached.pc",
|
41
|
-
"ext/libmemcached-*/support/libmemcached-fc.spec",
|
42
|
-
"ext/libmemcached-*/**/*.s[oa]",
|
43
|
-
"ext/libmemcached-*/**/*.l[oa]",
|
44
|
-
"ext/conftest.dSYM",
|
45
|
-
"lib/rlibmemcached*",
|
46
|
-
"**/*.rbc"]
|
5
|
+
spec = Gem::Specification.load('memcached.gemspec')
|
6
|
+
Rake::ExtensionTask.new('rlibmemcached', spec) do |ext|
|
7
|
+
ext.lib_dir = 'lib'
|
8
|
+
end
|
9
|
+
|
10
|
+
Rake::TestTask.new do |t|
|
11
|
+
t.libs << 'lib' << 'test'
|
12
|
+
t.pattern = 'test/**/*_test.rb'
|
13
|
+
t.verbose = false
|
14
|
+
t.warning = true
|
15
|
+
end
|
16
|
+
task :default => [:compile, :test]
|
17
|
+
|
18
|
+
Rake::Task[:clean].enhance do
|
19
|
+
FileUtils.rm_rf(File.read(".gitignore").lines.flat_map { |l| Dir["**/#{l.chomp}"] })
|
47
20
|
end
|
48
21
|
|
49
22
|
task :swig do
|
50
|
-
run("swig -DLIBMEMCACHED_WITH_SASL_SUPPORT -
|
51
|
-
swig_patches = {
|
52
|
-
"#ifndef RUBY_INIT_STACK" => "#ifdef __NEVER__" # Patching SWIG output for JRuby.
|
53
|
-
}.map{|pair| "s/#{pair.join('/')}/"}.join(';')
|
54
|
-
# sed has different syntax for inplace switch in BSD and GNU version, so using intermediate file
|
55
|
-
run("sed '#{swig_patches}' ext/rlibmemcached_wrap.c.in > ext/rlibmemcached_wrap.c", "Apply patches to SWIG output")
|
23
|
+
run("swig -DLIBMEMCACHED_WITH_SASL_SUPPORT -Ivendor/libmemcached-0.32 -ruby -autorename -o ext/rlibmemcached/rlibmemcached_wrap.c ext/rlibmemcached/rlibmemcached.i", "Running SWIG")
|
56
24
|
end
|
57
25
|
|
58
26
|
task :exceptions do
|
@@ -83,47 +51,7 @@ task :valgrind do
|
|
83
51
|
exec("ruby #{File.dirname(__FILE__)}/test/profile/valgrind.rb")
|
84
52
|
end
|
85
53
|
|
86
|
-
|
87
|
-
bindir = vm.split("/")[0..-2].join("/")
|
88
|
-
puts "#{vm} #{cmd} started"
|
89
|
-
if !File.exist?("#{bindir}/rake")
|
90
|
-
puts "#{vm} not found"
|
91
|
-
exit(1)
|
92
|
-
elsif system("bash --norc --noprofile -c 'export PATH=#{bindir}:/bin:/usr/bin && which rake && #{bindir}/rake clean && #{bindir}/rake compile'")
|
93
|
-
puts "#{vm} compiled"
|
94
|
-
if system("bash --norc --noprofile -c 'export PATH=#{bindir}:/bin:/usr/bin && #{bindir}/rake #{cmd}'")
|
95
|
-
puts "#{vm} #{cmd} success (1st try)"
|
96
|
-
elsif system("bash --norc --noprofile -c 'export PATH=#{bindir}:/bin:/usr/bin && #{bindir}/rake #{cmd}'")
|
97
|
-
puts "#{vm} #{cmd} success (2nd try)"
|
98
|
-
else
|
99
|
-
puts "#{vm} #{cmd} failed"
|
100
|
-
exit(1)
|
101
|
-
end
|
102
|
-
else
|
103
|
-
puts "#{vm} compilation failed"
|
104
|
-
exit(1)
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
task :test_20 do
|
109
|
-
with_vm("/usr/bin/ruby", "test")
|
110
|
-
end
|
111
|
-
|
112
|
-
task :test_19 do
|
113
|
-
with_vm("/opt/local/bin/ruby1.9", "test")
|
114
|
-
end
|
115
|
-
|
116
|
-
task :test_rbx do
|
117
|
-
with_vm("/usr/local/rubinius/1.2.4/bin/rbx", "test")
|
118
|
-
end
|
119
|
-
|
120
|
-
task :test_all => [:test_20, :test_19, :test_rbx]
|
121
|
-
|
122
|
-
task :prerelease => [:manifest, :test_all, :install]
|
123
|
-
|
124
|
-
task :benchmark_all do
|
125
|
-
with_vms("benchmark CLIENT=libm")
|
126
|
-
end
|
54
|
+
task :prerelease => [:manifest, :test, :install]
|
127
55
|
|
128
56
|
def run(cmd, reason)
|
129
57
|
puts reason
|
@@ -131,7 +59,7 @@ def run(cmd, reason)
|
|
131
59
|
raise "'#{cmd}' failed" unless system(cmd)
|
132
60
|
end
|
133
61
|
|
134
|
-
task :version do
|
62
|
+
task :version do
|
135
63
|
require 'memcached/version'
|
136
64
|
puts Memcached::VERSION
|
137
65
|
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'mkmf'
|
2
|
+
require 'rbconfig'
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
unless find_header('sasl/sasl.h')
|
6
|
+
abort 'Please install SASL to continue. The package is called libsasl2-dev on Ubuntu and cyrus-sasl on Gentoo.'
|
7
|
+
end
|
8
|
+
|
9
|
+
HERE = File.expand_path(File.dirname(__FILE__))
|
10
|
+
LIBMEMCACHED_DIR = Dir.glob(File.join(HERE, '..', '..', 'vendor',"libmemcached-*")).first
|
11
|
+
|
12
|
+
SOLARIS_32 = RbConfig::CONFIG['target'] == "i386-pc-solaris2.10"
|
13
|
+
BSD = RbConfig::CONFIG['host_os'].downcase =~ /bsd/
|
14
|
+
|
15
|
+
$CFLAGS = "#{RbConfig::CONFIG['CFLAGS']} #{$CFLAGS}".gsub("$(cflags)", "").gsub("-fno-common", "").gsub("-Werror=declaration-after-statement", "").gsub("-Werror=shorten-64-to-32", "").gsub("-Werror=deprecated-declarations", "")
|
16
|
+
$CFLAGS << " -Os"
|
17
|
+
$CFLAGS << " -std=gnu99" if SOLARIS_32
|
18
|
+
$CFLAGS << " -I/usr/local/include" if BSD
|
19
|
+
$EXTRA_CONF = " --disable-64bit" if SOLARIS_32
|
20
|
+
$LDFLAGS = "#{RbConfig::CONFIG['LDFLAGS']} #{$LDFLAGS} -L#{RbConfig::CONFIG['libdir']}".gsub("$(ldflags)", "").gsub("-fno-common", "")
|
21
|
+
$CXXFLAGS = "#{RbConfig::CONFIG['CXXFLAGS']} -std=gnu++98"
|
22
|
+
$CC = "CC=#{RbConfig::MAKEFILE_CONFIG["CC"].inspect}"
|
23
|
+
|
24
|
+
LIBM_CFLAGS = $CFLAGS
|
25
|
+
LIBM_LDFLAGS = $LDFLAGS
|
26
|
+
|
27
|
+
GMAKE_CMD = RbConfig::CONFIG['host_os'].downcase =~ /bsd|solaris/ ? "gmake" : "make"
|
28
|
+
TAR_CMD = SOLARIS_32 ? 'gtar' : 'tar'
|
29
|
+
PATCH_CMD = SOLARIS_32 ? 'gpatch' : 'patch'
|
30
|
+
|
31
|
+
if ENV['DEBUG']
|
32
|
+
puts "Setting debug flags."
|
33
|
+
$CFLAGS << " -O0 -ggdb -DHAVE_DEBUG"
|
34
|
+
$EXTRA_CONF = ""
|
35
|
+
end
|
36
|
+
|
37
|
+
def check_libmemcached
|
38
|
+
return if ENV["EXTERNAL_LIB"]
|
39
|
+
|
40
|
+
Dir.chdir(LIBMEMCACHED_DIR) do
|
41
|
+
# Cleanup any previously built files since the following touch all files command
|
42
|
+
# could make them seem rebuilt when there are changes that require recompiling them.
|
43
|
+
FileUtils.rm_rf("build")
|
44
|
+
run("#{GMAKE_CMD} clean 2>&1") if File.exist?("Makefile")
|
45
|
+
ts_now=Time.now.strftime("%Y%m%d%H%M.%S")
|
46
|
+
run("find . | xargs touch -t #{ts_now}", "Touching all files so autoconf doesn't run.")
|
47
|
+
|
48
|
+
Dir.mkdir("build")
|
49
|
+
build_folder = File.join(LIBMEMCACHED_DIR, "build")
|
50
|
+
run("env CFLAGS='-fPIC #{LIBM_CFLAGS}' LDFLAGS='-fPIC #{LIBM_LDFLAGS}' ./configure --prefix=#{build_folder} --libdir=#{build_folder}/lib --without-memcached --disable-shared --disable-utils --disable-dependency-tracking #{$CC} #{$EXTRA_CONF} 2>&1", "Configuring libmemcached.")
|
51
|
+
run("#{GMAKE_CMD} CXXFLAGS='#{$CXXFLAGS}' 2>&1")
|
52
|
+
run("#{GMAKE_CMD} install 2>&1")
|
53
|
+
|
54
|
+
|
55
|
+
pcfile = File.join(LIBMEMCACHED_DIR, "build", "lib", "pkgconfig", "libmemcached.pc")
|
56
|
+
$LDFLAGS << " -lsasl2 " + `pkg-config --libs --static #{pcfile}`.strip
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
$DEFLIBPATH.unshift("#{LIBMEMCACHED_DIR}/build")
|
61
|
+
dir_config('memcached', "#{LIBMEMCACHED_DIR}/build/include", "#{LIBMEMCACHED_DIR}/build/lib")
|
62
|
+
end
|
63
|
+
|
64
|
+
def run(cmd, reason = nil)
|
65
|
+
puts reason if reason
|
66
|
+
puts cmd
|
67
|
+
raise "'#{cmd}' failed" unless system(cmd)
|
68
|
+
end
|
69
|
+
|
70
|
+
check_libmemcached
|
71
|
+
|
72
|
+
unless have_library 'memcached' and have_header 'libmemcached/memcached.h'
|
73
|
+
abort "ERROR: Failed to build libmemcached"
|
74
|
+
end
|
75
|
+
|
76
|
+
create_makefile 'rlibmemcached'
|
@@ -3,7 +3,6 @@
|
|
3
3
|
#include <libmemcached/visibility.h>
|
4
4
|
#include <libmemcached/memcached.h>
|
5
5
|
#include <libmemcached/memcached_exist.h>
|
6
|
-
#include <ruby/version.h>
|
7
6
|
%}
|
8
7
|
|
9
8
|
%warnfilter(SWIGWARN_RUBY_WRONG_NAME) memcached_st;
|
@@ -110,12 +109,16 @@
|
|
110
109
|
$result = UINT2NUM($1);
|
111
110
|
};
|
112
111
|
|
112
|
+
%typemap(in, numinputs=0) (const char **key, size_t *key_length) {
|
113
|
+
const char *key_ptr;
|
114
|
+
size_t key_length_ptr;
|
115
|
+
$1 = &key_ptr;
|
116
|
+
$2 = &key_length_ptr;
|
117
|
+
}
|
118
|
+
|
113
119
|
// String for memcached_fetch
|
114
|
-
%typemap(
|
115
|
-
|
116
|
-
size_t length = 0;
|
117
|
-
$1 = string;
|
118
|
-
$2 = &length;
|
120
|
+
%typemap(argout) (const char **key, size_t *key_length) {
|
121
|
+
rb_ary_push($result, rb_str_new(*$1, *$2));
|
119
122
|
};
|
120
123
|
|
121
124
|
// Strings with lengths
|
@@ -150,87 +153,63 @@
|
|
150
153
|
%include "libmemcached/memcached_touch.h"
|
151
154
|
%include "libmemcached/memcached_exist.h"
|
152
155
|
|
153
|
-
//// Custom C functions
|
154
|
-
|
155
|
-
VALUE rb_str_new_by_ref(char *ptr, long len);
|
156
|
-
%{
|
157
|
-
VALUE rb_str_new_by_ref(char *ptr, long len)
|
158
|
-
{
|
159
|
-
#ifdef OBJSETUP
|
160
|
-
NEWOBJ(str, struct RString);
|
161
|
-
OBJSETUP(str, rb_cString, T_STRING);
|
162
|
-
#ifdef RSTRING_NOEMBED
|
163
|
-
/* Ruby 1.9 */
|
164
|
-
str->as.heap.ptr = ptr;
|
165
|
-
#if RUBY_API_VERSION_MAJOR < 3 || (RUBY_API_VERSION_MAJOR == 3 && RUBY_API_VERSION_MINOR < 3)
|
166
|
-
str->as.heap.len = len;
|
167
|
-
#else
|
168
|
-
// Ruby 3.3.0 moved the len field out of heap into toplevel RString
|
169
|
-
str->len = len;
|
170
|
-
#endif
|
171
|
-
str->as.heap.aux.capa = len + 1;
|
172
|
-
// Set STR_NOEMBED
|
173
|
-
FL_SET(str, FL_USER1);
|
174
|
-
#else
|
175
|
-
/* Ruby 1.8 */
|
176
|
-
str->ptr = ptr;
|
177
|
-
str->len = len;
|
178
|
-
str->aux.capa = 0;
|
179
|
-
#endif
|
180
|
-
#else
|
181
|
-
/* Rubinius, JRuby */
|
182
|
-
VALUE str = rb_str_new(ptr, len);
|
183
|
-
free(ptr);
|
184
|
-
#endif
|
185
|
-
return (VALUE)str;
|
186
|
-
}
|
187
|
-
%}
|
188
|
-
|
189
156
|
//// Manual wrappers
|
190
157
|
|
191
|
-
// Single get
|
192
|
-
VALUE memcached_get_rvalue(memcached_st *ptr, const char *key, size_t key_length, uint32_t *flags, memcached_return *error);
|
193
|
-
%{
|
194
|
-
VALUE memcached_get_rvalue(memcached_st *ptr, const char *key, size_t key_length, uint32_t *flags, memcached_return *error) {
|
195
|
-
size_t value_length = 0;
|
196
|
-
char *value = memcached_get(ptr, key, key_length, &value_length, flags, error);
|
197
|
-
return rb_str_new_by_ref(value, value_length);
|
198
|
-
};
|
199
|
-
%}
|
200
|
-
|
201
|
-
VALUE memcached_get_len_rvalue(memcached_st *ptr, const char *key, size_t key_length, uint32_t user_spec_len, uint32_t *flags, memcached_return *error);
|
202
|
-
%{
|
203
|
-
VALUE memcached_get_len_rvalue(memcached_st *ptr, const char *key, size_t key_length, uint32_t user_spec_len, uint32_t *flags, memcached_return *error) {
|
204
|
-
size_t value_length = 0;
|
205
|
-
char *value = memcached_get_len(ptr, key, key_length, user_spec_len, &value_length, flags, error);
|
206
|
-
return rb_str_new_by_ref(value, value_length);
|
207
|
-
};
|
208
|
-
%}
|
209
|
-
|
210
158
|
VALUE memcached_get_from_last_rvalue(memcached_st *ptr, const char *key, size_t key_length, uint32_t *flags, memcached_return *error);
|
211
159
|
%{
|
212
160
|
VALUE memcached_get_from_last_rvalue(memcached_st *ptr, const char *key, size_t key_length, uint32_t *flags, memcached_return *error) {
|
213
161
|
size_t value_length = 0;
|
214
162
|
char *value = memcached_get_from_last(ptr, key, key_length, &value_length, flags, error);
|
215
|
-
|
163
|
+
VALUE str = rb_str_new(value, value_length);
|
164
|
+
free(value);
|
165
|
+
return str;
|
216
166
|
};
|
217
167
|
%}
|
218
168
|
|
219
169
|
// Multi get
|
220
|
-
VALUE memcached_fetch_rvalue(memcached_st *ptr, char
|
170
|
+
VALUE memcached_fetch_rvalue(memcached_st *ptr, const char **key, size_t *key_length, uint32_t *flags, memcached_return *error);
|
221
171
|
%{
|
222
|
-
VALUE memcached_fetch_rvalue(memcached_st *ptr, char
|
223
|
-
size_t value_length = 0;
|
172
|
+
VALUE memcached_fetch_rvalue(memcached_st *ptr, const char **key, size_t *key_length, uint32_t *flags, memcached_return *error) {
|
224
173
|
VALUE ary = rb_ary_new();
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
VALUE str =
|
174
|
+
|
175
|
+
*error = MEMCACHED_TIMEOUT; // timeouts leave error uninitialized
|
176
|
+
memcached_result_st *result = memcached_fetch_result(ptr, &ptr->result, error);
|
177
|
+
VALUE str = Qnil;
|
178
|
+
if (result == NULL || *error != MEMCACHED_SUCCESS) {
|
179
|
+
*key = NULL;
|
180
|
+
*key_length = 0;
|
181
|
+
*flags = 0;
|
182
|
+
str = Qnil;
|
183
|
+
} else {
|
184
|
+
*key = memcached_result_key_value(result);
|
185
|
+
*key_length = memcached_result_key_length(result);
|
186
|
+
*flags = memcached_result_flags(result);
|
187
|
+
str = rb_str_new(memcached_result_value(result), memcached_result_length(result));
|
188
|
+
}
|
229
189
|
rb_ary_push(ary, str);
|
230
190
|
return ary;
|
231
191
|
};
|
232
192
|
%}
|
233
193
|
|
194
|
+
// Single get
|
195
|
+
VALUE memcached_get_rvalue(memcached_st *ptr, const char *key, size_t key_length, uint32_t *flags, memcached_return *error);
|
196
|
+
%{
|
197
|
+
VALUE memcached_get_rvalue(memcached_st *ptr, const char *key, size_t key_length, uint32_t *flags, memcached_return *error) {
|
198
|
+
*error = memcached_mget(ptr, &key, &key_length, 1);
|
199
|
+
if (*error != MEMCACHED_SUCCESS) {
|
200
|
+
return rb_ary_new_from_args(1, Qnil);
|
201
|
+
}
|
202
|
+
VALUE ret = memcached_fetch_rvalue(ptr, &key, &key_length, flags, error);
|
203
|
+
if (*error == MEMCACHED_END) {
|
204
|
+
*error = MEMCACHED_NOTFOUND;
|
205
|
+
} else {
|
206
|
+
memcached_return end_error;
|
207
|
+
memcached_fetch_result(ptr, &ptr->result, &end_error);
|
208
|
+
}
|
209
|
+
return ret;
|
210
|
+
};
|
211
|
+
%}
|
212
|
+
|
234
213
|
// Ruby isn't aware that the pointer is an array... there is probably a better way to do this
|
235
214
|
memcached_server_st *memcached_select_server_at(memcached_st *in_ptr, int index);
|
236
215
|
%{
|