diff --git a/client/pom.xml b/client/pom.xml
index d0ae4006937..b17cdbc4017 100644
--- a/client/pom.xml
+++ b/client/pom.xml
@@ -181,6 +181,10 @@
com.metamx
bytebuffer-collections
+
+ org.xerial.snappy
+ snappy-java
+
diff --git a/client/src/main/java/com/metamx/druid/client/cache/MemcachedCache.java b/client/src/main/java/com/metamx/druid/client/cache/MemcachedCache.java
index 9dca20d9fb8..e5d478e341e 100644
--- a/client/src/main/java/com/metamx/druid/client/cache/MemcachedCache.java
+++ b/client/src/main/java/com/metamx/druid/client/cache/MemcachedCache.java
@@ -53,9 +53,10 @@ public class MemcachedCache implements Cache
public static MemcachedCache create(final MemcachedCacheConfig config)
{
try {
- SerializingTranscoder transcoder = new SerializingTranscoder(config.getMaxObjectSize());
- // disable compression
- transcoder.setCompressionThreshold(Integer.MAX_VALUE);
+ SnappyTranscoder transcoder = new SnappyTranscoder(config.getMaxObjectSize());
+
+ // always use compression
+ transcoder.setCompressionThreshold(0);
return new MemcachedCache(
new MemcachedClient(
diff --git a/client/src/main/java/com/metamx/druid/client/cache/SnappyTranscoder.java b/client/src/main/java/com/metamx/druid/client/cache/SnappyTranscoder.java
new file mode 100644
index 00000000000..d83e740f810
--- /dev/null
+++ b/client/src/main/java/com/metamx/druid/client/cache/SnappyTranscoder.java
@@ -0,0 +1,50 @@
+package com.metamx.druid.client.cache;
+
+import net.spy.memcached.transcoders.SerializingTranscoder;
+import org.xerial.snappy.Snappy;
+
+import java.io.IOException;
+
+public class SnappyTranscoder extends SerializingTranscoder
+{
+ public SnappyTranscoder()
+ {
+ super();
+ }
+
+ public SnappyTranscoder(int max)
+ {
+ super(max);
+ }
+
+ @Override
+ protected byte[] compress(byte[] in)
+ {
+ if (in == null) {
+ throw new NullPointerException("Can't compress null");
+ }
+
+ byte[] out;
+ try {
+ out = Snappy.compress(in);
+ } catch(IOException e) {
+ throw new RuntimeException("IO exception compressing data", e);
+ }
+ getLogger().debug("Compressed %d bytes to %d", in.length, out.length);
+ return out;
+ }
+
+ @Override
+ protected byte[] decompress(byte[] in)
+ {
+ byte[] out = null;
+ if(in != null) {
+ try {
+ out = Snappy.uncompress(in);
+ } catch (IOException e) {
+ getLogger().warn("Failed to decompress data", e);
+ }
+ }
+ return out == null ? null : out;
+ }
+}
diff --git a/pom.xml b/pom.xml
index dce1e771eef..0c97dd87ed7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -320,6 +320,12 @@
jackson-mapper-asl
1.9.11
+
+ org.xerial.snappy
+ snappy-java
+ 1.0.5
+
+