Hello, Nadav,
Try go-memcached<https://github.com/valyala/ybc/tree/master/apps/go/memcached>
-
fast memcached server written in Go <http://golang.org/>. It can cache
objects with up to 2Gb sizes. It also has no 250 byte limit on key sizes.
Currently it supports the following memcache commands: get, gets, set, add,
cas, delete, flush_all. It also has the following features missing in the
original memcached:
* Cache size may exceed available RAM size by multiple orders of
magnitude.
* Cached objects may survive server crashes and restarts if cache is
backed by files.
* It can shard objects into multiple backing files located on multiple
distinct physical storage devices (HDDs or SSDs). Such sharding may
linearly increase qps for I/O-bound workloads, when hot objects don't fit
RAM.
* It supports two useful commands (extensions to memcache protocol):
* dogpile effect-aware get (getde). Clients with getde support may
effectively combat negative consequences of dogpile effect such as periodic
spikes in resource usage.
* conditional get (cget). Clients with cget support may save network
bandwidth and decrease latency between memcache servers and clients by
caching objects in local in-process cache. This may be especially useful
when dealing with large objects.
Currently only a single memcache client takes advantage of these
commands -
CachingClient<https://github.com/valyala/ybc/blob/master/libs/go/memcache/caching_client.go>for
Go.
According to my performance tests on Ubuntu 12.04 x64, go-memcached's speed
is comparable to the original memcached.
go-memcached can be built from source code (see how to build and run
it<https://github.com/valyala/ybc/blob/master/apps/go/memcached/README> section
for details) or it can be downloaded from
https://github.com/downloads/valyala/ybc/go-memcached-1.tar.bz2 . The
archive contains two programs - a memcache server (go-memcached) and a
benchmark tool for memcache servers (go-memcached-bench). These programs
can be configured with command line flags. Run them with --help in order to
see available configuration options:
$ ./go-memcached --help
Usage of ./go-memcached:
-cacheFilesPath="": Path to cache file. Leave empty for anonymous
non-persistent cache.
Enumerate multiple files delimited by comma for creating a cluster of
caches.
This can increase performance only if frequently accessed items don't fit
RAM
and each cache file is located on a distinct physical storage.
-cacheSize=100: Total cache capacity in Megabytes
-deHashtableSize=16: Dogpile effect hashtable size
-goMaxProcs=4: Maximum number of simultaneous Go threads
-hotDataSize=0: Hot data size in bytes. 0 disables hot data optimization
-hotItemsCount=0: The number of hot items. 0 disables hot items
optimization
-listenAddr=":11211": TCP address the server will listen to
-maxItemsCount=1000000: Maximum number of items the server can cache
-osReadBufferSize=229376: Buffer size in bytes for incoming requests in OS
-osWriteBufferSize=229376: Buffer size in bytes for outgoing responses in
OS
-readBufferSize=4096: Buffer size in bytes for incoming requests
-syncInterval=10s: Interval for data syncing. 0 disables data syncing
-writeBufferSize=4096: Buffer size in bytes for outgoing responses
$ ./go-memcached-bench --help
Usage of ./go-memcached-bench:
-connectionsCount=4: The number of TCP connections to memcache server
-goMaxProcs=4: The maximum number of simultaneous worker threads in go
-key="key": The key to query in memcache
-maxPendingRequestsCount=1024: Maximum number of pending requests
-osReadBufferSize=229376: The size of read buffer in bytes in OS
-osWriteBufferSize=229376: The size of write buffer in bytes in OS
-readBufferSize=4096: The size of read buffer in bytes
-requestsCount=1000000: The number of requests to send to memcache
-serverAddrs=":11211": Comma-delimited addresses of memcache servers to
test
-value="value": Value to store in memcache
-workerMode="GetMiss": Worker mode. May be 'GetMiss', 'GetHit', 'Set',
'GetSetRand'
-workersCount=512: The number of workers to send requests to memcache
-writeBufferSize=4096: The size of write buffer in bytes
On Monday, December 3, 2012 11:43:39 AM UTC+2, Nadav Har Tzvi wrote:
>
> Hello there,
>
> Let me just start this topic by stating that I do know of the 1 MB item
> size limitation in memcached and the reasons for why it is so.
>
> However I am faced here with a dilema. As part of a web service, I have to
> return a bit large JSON object that includes base64 encoded images in it
> (thus the large size).
> The average JSON object size should be somewhere between 1.2 MB to 2MB max.
> In order to boost the whole deal, I decided to cache those items (Server
> has more than enough memory) and grant access from Nginx to reduce the load
> on the service and provide quicker responses.
>
> So my question is this, should I go for increasing memcached item size or
> is there any other solution to bypass this problem? Searching google didn't
> provide any good results, maybe you have any idea of how to deal with this?
>
> Thanks.
>