Pārlūkot izejas kodu

support compress

丁云鹏 2 mēneši atpakaļ
vecāks
revīzija
ec8b822c8a

+ 84 - 0
recommend-feature-produce/pom.xml

@@ -107,6 +107,90 @@
             <artifactId>aliyun-sdk-oss</artifactId>
             <version>3.17.4</version>
         </dependency>
+        <!-- Snappy compression library -->
+        <dependency>import org.xerial.snappy.Snappy;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.zip.GZIPInputStream;
+import java.util.zip.GZIPOutputStream;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+import java.util.zip.ZipOutputStream;
+
+public class CompressionUtil {
+
+    // ZIP压缩
+    public static byte[] zipCompress(byte[] data) throws IOException {
+        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+        ZipOutputStream zipOutputStream = new ZipOutputStream(byteArrayOutputStream);
+        ZipEntry zipEntry = new ZipEntry("data");
+        zipOutputStream.putNextEntry(zipEntry);
+        zipOutputStream.write(data);
+        zipOutputStream.closeEntry();
+        zipOutputStream.close();
+        return byteArrayOutputStream.toByteArray();
+    }
+
+    // ZIP解压缩
+    public static byte[] zipDecompress(byte[] compressedData) throws IOException {
+        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(compressedData);
+        ZipInputStream zipInputStream = new ZipInputStream(byteArrayInputStream);
+        ZipEntry zipEntry = zipInputStream.getNextEntry();
+        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+        byte[] buffer = new byte[1024];
+        int len;
+        while ((len = zipInputStream.read(buffer)) != -1) {
+            byteArrayOutputStream.write(buffer, 0, len);
+        }
+        zipInputStream.closeEntry();
+        zipInputStream.close();
+        return byteArrayOutputStream.toByteArray();
+    }
+
+    // ZLIB压缩(使用Java的ZipOutputStream进行模拟)
+    public static byte[] zlibCompress(byte[] data) throws IOException {
+        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+        ZipOutputStream zipOutputStream = new ZipOutputStream(byteArrayOutputStream);
+        ZipEntry zipEntry = new ZipEntry("data");
+        zipOutputStream.putNextEntry(zipEntry);
+        zipOutputStream.write(data);
+        zipOutputStream.closeEntry();
+        zipOutputStream.close();
+        return byteArrayOutputStream.toByteArray();
+    }
+
+    // ZLIB解压缩(使用Java的ZipInputStream进行模拟)
+    public static byte[] zlibDecompress(byte[] compressedData) throws IOException {
+        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(compressedData);
+        ZipInputStream zipInputStream = new ZipInputStream(byteArrayInputStream);
+        ZipEntry zipEntry = zipInputStream.getNextEntry();
+        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+        byte[] buffer = new byte[1024];
+        int len;
+        while ((len = zipInputStream.read(buffer)) != -1) {
+            byteArrayOutputStream.write(buffer, 0, len);
+        }
+        zipInputStream.closeEntry();
+        zipInputStream.close();
+        return byteArrayOutputStream.toByteArray();
+    }
+
+    // Snappy压缩
+    public static byte[] snappyCompress(byte[] data) {
+        return Snappy.compress(data);
+    }
+
+    // Snappy解压缩
+    public static byte[] snappyDecompress(byte[] compressedData) {
+        return Snappy.uncompress(compressedData);
+    }
+}
+            <groupId>org.xerial.snappy</groupId>
+            <artifactId>snappy-java</artifactId>
+            <version>1.1.8.4</version>
+        </dependency>
     </dependencies>
     <build>
         <plugins>

+ 2 - 2
recommend-feature-produce/src/main/java/com/tzld/piaoquan/recommend/feature/produce/ODPSToRedis.java

@@ -30,8 +30,8 @@ public class ODPSToRedis {
         Map<String, String> argMap = cmdService.parse(args);
 
 //        argMap.put("project", "loghubods");
-//        argMap.put("table", "alg_mid_feature_share_and_return");
-//        argMap.put("dt", "20240905");
+//        argMap.put("table", "alg_video_source_feature_day");
+//        argMap.put("dt", "20250210");
 //        argMap.put("hh", "13");
 //        argMap.put("mi", "00");
 //        argMap.put("env", "test");

+ 6 - 0
recommend-feature-produce/src/main/java/com/tzld/piaoquan/recommend/feature/produce/service/RedisService.java

@@ -1,6 +1,7 @@
 package com.tzld.piaoquan.recommend.feature.produce.service;
 
 import com.tzld.piaoquan.recommend.feature.produce.model.DTSConfig;
+import com.tzld.piaoquan.recommend.feature.produce.util.CompressionUtil;
 import com.tzld.piaoquan.recommend.feature.produce.util.JSONUtils;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.MapUtils;
@@ -81,6 +82,11 @@ public class RedisService implements Serializable {
         Pipeline pipeline = jedis.pipelined();
         for (Map.Entry<String, String> e : batch.entrySet()) {
             pipeline.setex(e.getKey(), expireSeconds, e.getValue());
+            // 压缩后的key,升级后进行替换
+            try {
+                pipeline.setex("snappy:" + e.getKey(), expireSeconds, CompressionUtil.snappyCompress(e.getValue()));
+            } catch (Exception ex) {
+            }
         }
         pipeline.sync();
 

+ 143 - 0
recommend-feature-produce/src/main/java/com/tzld/piaoquan/recommend/feature/produce/util/CompressionUtil.java

@@ -0,0 +1,143 @@
+package com.tzld.piaoquan.recommend.feature.produce.util;
+
+import com.google.common.collect.Lists;
+import net.jpountz.lz4.*;
+import org.xerial.snappy.Snappy;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
+import java.util.List;
+
+
+/**
+ * @author dyp
+ */
+public class CompressionUtil {
+    public static String lz4Compress(String input) {
+        byte[] data = input.getBytes(StandardCharsets.UTF_8);
+        LZ4Factory factory = LZ4Factory.fastestInstance();
+        LZ4Compressor compressor = factory.fastCompressor();
+        int maxCompressedLength = compressor.maxCompressedLength(data.length);
+        byte[] compressed = new byte[maxCompressedLength];
+        int compressedLength = compressor.compress(data, 0, data.length, compressed, 0, maxCompressedLength);
+        byte[] result = new byte[compressedLength];
+        System.arraycopy(compressed, 0, result, 0, compressedLength);
+        return Base64.getEncoder().encodeToString(result);
+    }
+
+    public static String lz4Decompress(String input) {
+        // 将Base64编码的字符串解码为字节数组
+        byte[] data = Base64.getDecoder().decode(input);
+        LZ4Factory factory = LZ4Factory.fastestInstance();
+        LZ4SafeDecompressor decompressor = factory.safeDecompressor();
+
+        // 创建一个缓冲区来存储解压缩后的数据
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+
+        // 使用ByteBuffer来处理压缩数据
+        ByteBuffer buffer = ByteBuffer.wrap(data);
+
+        // 假设每次读取的块大小为4KB(可以根据实际情况调整)
+        byte[] chunk = new byte[4096];
+        byte[] decompressedChunk = new byte[4096 * 2]; // 解压缩后的块可能会更大
+
+        while (buffer.hasRemaining()) {
+            int remaining = Math.min(buffer.remaining(), chunk.length);
+            buffer.get(chunk, 0, remaining);
+
+            // 解压缩当前块
+            int decompressedLength = decompressor.decompress(chunk, 0, remaining, decompressedChunk, 0);
+
+            // 将解压缩后的数据写入输出流
+            outputStream.write(decompressedChunk, 0, decompressedLength);
+        }
+
+        // 返回解压后的数据
+        return new String(outputStream.toByteArray(), StandardCharsets.UTF_8);
+    }
+
+    public static String snappyCompress(String input) throws IOException {
+        byte[] inputBytes = input.getBytes(StandardCharsets.UTF_8);
+        byte[] compressedBytes = Snappy.compress(inputBytes);
+        return Base64.getEncoder().encodeToString(compressedBytes);
+    }
+
+    // 将Snappy压缩后的String解压缩回String
+    public static String snappyDecompress(String compressedInput) throws IOException {
+        byte[] compressedBytes = Base64.getDecoder().decode(compressedInput);
+        byte[] decompressedBytes = Snappy.uncompress(compressedBytes);
+        return new String(decompressedBytes, StandardCharsets.UTF_8);
+    }
+
+    public static void main(String[] args) {
+        List<String> lz4Strs = Lists.newArrayList(
+                "8hZ7ImZlYXR1cmUiOiJ7XCJyb3NfMWRcIjpcIjAuNjY1MjY4XCIsGAAUNxgAYzc3NTg0MhgAFnYwAGUwMTgyMDkYAAUwAGEwMjM3OTMYADdzdHIwAFUyNzM3MRgABjAAUTMwNjY3GAAldm8wAHI4LjI5NDk1SAAAGAADMAB0Ny45NDk0MBgAB5AAVjE1MTA0GAADMACBMC4xODkxMzZgAAHwABU02QBEMjM1MtkARXNfMzAZAEIzOTMxkgAB8gAFMgBSMDI0OTHDAAAZAAYyAGEwMjUyMDRkAAH0AAYyAEIzNDQzMgAAGQAHMgBCMzQwORkARHZpZXcnAXEzNDgxOC4wSgABGAADxwBkMzU1NTMyGQAAJwEDYwBjOC4zNzE3YwAAKAEEYwByOC4zMTc4NpUAASkBAzIAcjAuMjA4NTX5AAAZAAQyAAAZADM5NjQrAURfY250lgBTMi43MjF0AQIZAASXAFMuMTgyNDYCVHNoYXJlMwAzOTUzrgACFwADMQBEMTA5MBkAAeAABJYAYzg4NDA5MDMAARoABJcAZDE1NTAwMfwAAn8ABDYAcjMuMjI3NDP2AQIbAAQ3AGMzLjI1MzERAlVyX3JhdJwAcjAuMDA2NjkCAQMbAAOgAAAbADM3NDcEAVRldHVybtIAMzYzNJ8AAxgAAzMAQzg0NTkZAALrAAWdADQwNDTSAAIaAAScAEk1Mjg00QAZNIgDMzI0OH4CAGwBGTSMAyQzNowDA9MAA0ABAbkAIzcxkAMCHAAEbwACHAATNNwDAr0ABKUASzIyMDLYAAQ3AFMzOTA2N9oAAVwBAKYABW8AYTczMjA4M6kCBB0ABDkAIDAulAETMWABAnAAAdMBA2wEJTUyMgEDSwEBHgADUAFLNjcyNJIAAR8ABLIAVDE4NDM3cgEIQAAEfwBUMzI0OTVCAAE7ADNoYXMpAAOCACkyM4UCBiAAA4QANDI2NYYDAroBBiIAA0IAJDk1GwEMIQADQwA1MTA5MQIMhQADRQElNjh7AQsiAATLAEQxMjAw6wAMaAAEEAFEMzAwOO4ADCQABEgAMjUyNdEA8Al9IiwidmlkZW9fc291cmNlIjoiQUdDIn0=",
+                "8hZ7ImZlYXR1cmUiOiJ7XCJyb3NfMWRcIjpcIjAuODgzMTE0XCIsGAAUNxgAYzk5Nzg4MhgAFnYwAFUwNDY1NRcABS8AUjA1NDM1RwA3c3RyLwBCNTI3MUcAABgACDAAMTQ2OUgAJXZvMACFNy43MTk5MzYYAAMwAHI3Ljc4ODE2eAAYdo8ARzM1OTMYAAMwAHIwLjQyMzMxMAAB7wASNNgAgTEuMDIwODAxYQAAGQAlMzAZAFMxNjM5MxkAFXYyAADbACI1MJIAABgABDEAABgAIzg2MQAA2wAEYwAAGQBBMzkzOEoAABkACDIAQTc3NDcZAER2aWV3JgGWNzA0NzE1MC4wGgADyACEMzY3ODk3OTMbAAAqAQNnAHI3Ljk0MjM2cwEAQwEEZwBkNy44ODY1WwEIyQBTNDM3MzB/AAnKAFI0NjI4ODIAVHJfY250mQBjMy41NDUwjwECGgAEmQBiLjY2NzA5FwFVc2hhcmU0AFM3MTQ2NrEAAhoAAzQAczIwMDM5MDUbAAIBAQPNAIg1NTU3ODUzNxwABdAAczYwNTk3MzgcAAKHAARtAWQzLjYzNTmoAgG8AAQ4AGMzLjUxMDgDAkVfcmF0owCBMC4wMTMxMzFvAQMbAAOkAAAbADI0ODKxAmVyZXR1cm7ZAEQyODA0ogADGwADNgBkMTk5OTY2wQEC9QAEogAQMkkDIzAxvgACHAAEowBzNDM5MjE4ORwAAdoAGTSbAzIwOTiwAQQcAANxAACfAzo1NzDdAANMAQDDADM1MTTKAgLeAARxAAAcADI2NzGcAgPEAASpAGUzMDYwMTWNAAL8AAQ5AGQ0NDY0MTniAASOAAQ7AABWAzQ2OTRRAQLHAAQ7AAAdACQwMG4BAlcAAv0BAnoDdDI1MzI1MDIFAQchAAPtAHQxNTU3MzY4BQMDtwACQwAD9AB0MjQzMDQ4OXcCCCMABIcAeTM1MjA3MjN/AjNoYXMrAAMPBSs5MoUCBiIAA40AVDU0NTI5jAICzgEGJAADRgBUMzcyMzavAAwkAANIAGQyMDA4MjixAAHNAAdIAAPXAFQ4NDE2MxoBCyQABNgAajEyNzE1NGACDkoAZDI5Nzk4N90BDJQABEwAYTQzNzY1MiMB8AB9IiwidmlkZW9fc291cmM6BuBVR0MtYXV0b3BpY2sifQ==",
+                "8hZ7ImZlYXR1cmUiOiJ7XCJyb3NfMWRcIjpcIjAuNzI1OTA4XCIsGAAUNxgAYzk4ODA5NRgAFnYwAGUwMzIxNzMYAAUwAEIwNDU2FwA3c3RyLwBRNDQzMjEvAAAYAAcvACI2MXYAJXZvLwCBOC41ODM0NDQvAAAYAAMvAHQ3LjczNjE3GAAHjgBWMjc2MTUYAAMwAHIwLjM1MzAwjwAB7gAWNNcAQTE3ODdhAAAZAC8zMBkAAhd2MgBSMDQ1MTnCAAAZAAYyAAcZAADbAAZkADMwNDZ8AAAYAAgxAAQYAER2aWV3JAGBNDY4OTY3LjCUAAEZAAPGAHQzMjM1ODg0GgAAJwEDYwAAEAFCNDIyOTMAFm9kAAsZAAjHAEMzNDk1iQEAGQAGlgAHGQBUcl9jbnSYAHIzLjIxOTgwXQECGgADmQBiNC4yMTM3HAJUc2hhcmUzAFMyMDc4NbAAAhkAAzIAYzE0OTQzMxoAAeQABC4BeDM3NTc1MjkbAASbAAobAAKCAAQ3ACA0LrcCITQyAgECGwAENwALGwA1cmF0oAB0MC4wMDk5OTYAARsAA6IAYzAuMDEwOFMBZHJldHVybtYAUzE1MDg4oQADGgADNQBUMTQ3NjWhAQLxAAShAFQxNzI5NTYAAhsABKEACRsAAbwAGTSQAzM0MDmhAgCPARk0lAM5NDg3vgAEbwABvwAjNjGnAgLaAARwAAocAAPbAANKAlQxNjk4MKcAA90ABDgAChwAA4wABnEAQjk3ODAEAgTEAAQ5AAkcAAJwAAL0AQJsA1QxMjk1MPECA3QAASAABFYBXzE0MjI3IQABBH0AZDEzMTMzM3kBCEMABIMACiIAAV4AM2hhcyoAA/wEQzQ2ODbXAQshAAOJAFMzNTA0MSIAAsMBDUQARDIwODOqAAwjAANGAGMxNDk5MjJHAAtpAATRAF8zOTg3MCMAAwTSAAgjAAxqAARHABAxJwUETAMMJQAESQAGJQDwAH0iLCJ2aWRlb19zb3VyYx4G4FVHQy1oYW5kcGljayJ9",
+                "8hZ7ImZlYXR1cmUiOiJ7XCJyb3NfMWRcIjpcIjAuOTA4NTM1XCIsGAAUNxgAYzg5Mzk4OBgAFnYwAGUwMzk5NjcYAAUwAGEwNDA5NjkYADdzdHIwAFU0Mzk5MRgABzAAMjU4MkgAJXZvMABjNy43MTcyMAAAGAADMAByNy43NDAwMUgAGHaQAFEzMDg0NF8AABcAAy8AcjAuMzE3MDlfAAHvABQ02ABUOTAzNjPYAERzXzMwGQBSODUyNDXBAAHxAAUyAEUwNDE3MgAXdjIAYTA0MDU4NnwAAfMABzIAMjYxOEsAABkABmQAQzA0NzbEADRpZXclAaExMTExNTI0Ni4wTAABGwADyQCUMTAxNTU4NjQyHAAAKwEDaAByNy45MzU5OYEAACwBBGgAgjcuODMzOTMzTgAALQEDMgBmMC4zMzEyGAAEMQABLwEjOTQGAkRfY250mwCBMy44MTMyMjJLAAIaAAOaAHIzLjk2NDM3TQBUc2hhcmU0AFQ0ODg5N7EAAhoAAzQAdDQ2NTQxMDHMAADoAASbADAxODFBAhk3BQEEoACTMzg4MTk0NTY1OgACiQAEOwBjNC4wMzAx7wACGwAFOQBjLjg3NjM0CAJFX3JhdKYAcjAuMDEwNDiOAQMbAAOnAAEbACIzM1YCZXJldHVybtwAVDQ0MjQ4hwACGwADNgBzNDE2MDcwORwAAvgABKMAVTgzNzkw4QECHAAEpAAwMTg03gATNDkAAcEAGTShAzM1MjeMAACBARk0pQMjMDlFAwPDAARyAALEABI1HQIDHAAEcgABHAAEFQECxAAENwBrNzU3MTYy4QAEOAB9MTU3NTUwOaoAA8MBZTAuOTAzN3MAAqsABDwAAGADMjA4OS8CA1QBAekCA4kEZDM0MjgzORsCCCEAA18BdTMyMjAzOTMDAgK4AAJDAAOBAIQ2MDA4ODQwN0oBByMABIcAkzEyMzQyNDM0MyQAAUAAM2hhc3EAA40AVDExNjUwwgILIwADjwBkMTA0OTUyjgAC0gENSABUNDkwNzNrAAwkAANJAH80NjcwMDkwkAAEA9oAZDE4Nzg3NXkBC5IABNwAZDQwNjQ0MbwBDG8ABOIBZDgzNzc5NWcDDCYABEwAcTE4NTE1OTaXAPAAfSIsInZpZGVvX3NvdXJjRQbgb2xkVmlkZW9QdXNoIn0=",
+                "8hZ7ImZlYXR1cmUiOiJ7XCJyb3NfMWRcIjpcIjAuOTIyMzIzXCIsGAAUNxgAYzg2MTY1NxgAFnYwAGUwNTAwNTgYAAUwAGEwNDcwNTIYADhzdHIwAEU0Mjc0GAAGMABRNTQ2MDYYACV2bzAAdTcuNjU4NjkXAAMvAHQ3LjgyNjU1GAAHjwBSMzgzMzh3AAAYAAMwAIEwLjM2ODI1NUgAAe8AFDTYAFI5MzAwMUkAABkAJDMwGQBSODk2NjWpAAHxAAUyAFYwNTE0MfIABjIAYTA0ODg5MWQAAfMABzIAMjUyODwBABkABzIAQzU0NTL1ADRpZXcmAaEzNTUxMjA3MC4wTQABGwADygCUMjQyMzQ3MTg5HAAALAEDaQB0Ny42NzU4NP4ABmkAdDcuNzU3MzkZABV2MgByMC4zOTQ2N5sAABkABpsAUjM3OTI2mwBVcl9jbnScAGMuODQwOTkAAQEaAAObAGMzLjYxODlNAFRzaGFyZTQAczE5MjczOTSzAAIbAAM1AHkxMzIzMzY56wAE0ACTNTgwOTY2MzE1OQABCAEEogCjMTA3OTkyMzk5Nx4AA6YAAzwAczMuODY3NTnJAgGnAAQ6AHMzLjcxNjUwDQJFX3JhdKkAdDAuMDEzMDM2AAEbAAOpAAIbABIw3wFlcmV0dXJu3wBUNzc3NjeSAQMcAAM3AIMxMTQwMjkwMaUAAvwABOEAejMyMTE5OTUdAASnAIM1ODg4MzgwNDoAAd8AGTSpAzcwMDShARg0rQNDNTk1MqsAA+EAAxgBAccAKTI5/QAEcgABHAAUMSYDA+MAAzgAdTI5ODcyMTeOAAIeAAQ6AIw1Mjc5ODQyNqwAAz0AdzAuOTY3Njg0Ahg0agNDOTE0OTgDAz0BAeoBA5MEhDEzNjE0NjkyXAACegABIgADZAF/ODkyNDU0OCIAAQRqAZ8yMjkyOTQwNzNGAAAExQCENDA5NTc4MDbJAQFjADNoYXOUAAOPAFQ0NjI4MXQCCyMAA5AAZDMxNTA4NmsAAvMBDUgAXzE5MzIxJQAGA0oAdDEzMjY2NTdYAQtvAATdAGQ3NzIzNzFGAgslAATeAH8xNDIwNjQ3lgAGA6sBdDMwODY5NjKQAwy9AAROAHE1NzcwMzc1JwDwAH0iLCJ2aWRlb19zb3VyY1UGsHRyYW5zcG9ydCJ9",
+                "8hZ7ImZlYXR1cmUiOiJ7XCJyb3NfMWRcIjpcIjAuNDkzMDIzXCIsGAAUNxgAYzc5NTI3ORgAFnYwAGUwMjI2NzQYAAUwAGEwMzIyODUYADdzdHIwAEI0NTk4SAAAGAAGMABRNDA1OTYwACV2bzAAcjguOTI5MjRIAAAYAAMwAIM3Ljk2MDgyNzAAB5AARDIwMjRHAAePAFQyNTcwMacARXNfMTTYAEY4MjAzGQAkMzAZAFQ2NzI2NwkBF3YyAFQwMzEzOTIAF3YyAFIwMjc1NqsAANsABmQAUjA0MDE0MgAAGQAHMgAzNDA5VQFEdmlldyYBYjkzNTAuMNwAABcAA/UAZDI1NDYwORkAACUBA8YAcjcuODc4NjBiAAAmAQRiAHI4LjI1NTkwxgAAEAEGlABSMjQ3MzOIAQAZAAQyAHIwLjIyNzU3WQFUcl9jbnSVAHIyLjcxNzk0MwACGgADmACBNC4yMzA1NzGxAFRzaGFyZTQAJDQzyAACFwADMQBUMTAzMzbIAADhAASXAGgzNDEzNzMaAASYAHMxMDI5MzM1GwACfwAENgByNC4xOTk0NYAAAhsABDcAdDMuNDQ1NTPPADVyYXScAIEwLjAwODM0MrYAAxsAA6AAABsAMzc2M1EAVGV0dXJu0gA0MjEyhAACGAADMwA6ODIy6wAEnQBTMTM3MDQzAAIFAQScAFM0MjE4MRoAAbYAHzSHAwQAhgEZNIsDMjMwNe0BA7gABG0AAbkAIjQ3AAMDHAAEbwAAHAASOO0AAroABDUAVDEwNzE3iAACGwAENABEMjgzN70ABaMAA3UCdDAuNzgwMTVsAAKkAAQ5AAA/AzMxMjKlAAJVAAjiAjQxODnnAQgeAANNAVo2NTQzOJIAAj0AA3sANjg0NAsCBz8ABH4AVDIzNDI1YAABOgAzaGFzaAAD6QQUN2AACx8AA4IANDE5NEAAAtECDUEADNsCBiEABEMANDAzNrACC2UABHoBNDI1NU4CCyIABMoAJTgy6QANiAADDQEAMgMEvwEMJAAERwBBNDIyN2oA8AB9IiwidmlkZW9fc291cmMBBpB1bmtub3duIn0=",
+                "8hZ7ImZlYXR1cmUiOiJ7XCJyb3NfMWRcIjpcIjAuNTk3NDY0XCIsGAAUNxgAVDc0OTM1GAAWdjAAYzAyMTkxMjAAFnYwAGEwMzMxODkYADdzdHIwAFUzNjY3NRgABjAAMjQ0Mi8AJXZvLwBxOC4yNTY3OC4AABcAAy4AZTguMTAzMBgAB44AYzE4MDkyMTAAB44AUjI2ODkzGAAB7gAUNNcAYTg0MDU4NjEAABkAJDMwGQBSNzU3OTSoAADYAAYyAGMwMzg1MzcyABd2MgBSMDMzNTbDAAHyAAYyADM0NThLAAAZAAcyAAb0ADRpZXckAZEyMzg0NDI4LjBkAAEaAAP4AIQyMzY3MDUyNRsAACkBA2YAcjcuOTIyMzfKAAArAQRmAHI3Ljk0ODg0/AAAFAEGygBiMzA1MzAzZgAJygBSMjY2ODNLAFVyX2NudJoAYi43NzA1NJABAhoAA5oAcjMuMjUyMjAgAlRzaGFyZTQARDg3NDTMAAIZAAMzAGUxMDQ4MzbMAADnAASbAIQ1OTA0OTI2MegAABwABNAAkzEyMjM0Nzc1Mh0AAocABDoAczMuNDYxMTi4AQG8AAQ5AHMzLjMzMjc1ugFFX3JhdKQAcjAuMDA3OTC8AQMbAAOmAHMwLjAxMDIwUQBUZXR1cm7aAFQ1MjI0N4YAAhoAAzUAYzc4NTU5NhsAAvUABKEAeTI3MDcxMjQcAASiAGQ1NDE4NzUSAQHZABk0mgMoNjKWARk0ngM0NzcymAEC2wADGQIAwQAyMTEzmgEDHAAEcQAAHAAyMDA3AwIDwwAFqQBjMjc1NTcwqQADHQAEOQAgNDHGAAUdAABoAQCqAAVzAFc4NTg4MkECGTRaA0M2NDg3bAECdAAB5AIDggRVNDMxMzndAQcgAANcAWQ2MzY1NzRdAQOYAAJBAAN/AHQxODAyNzkyPgIIIwAEwACDMzI2NDY4NDPeAAE/ADNoYXMrAAOKAEQxODg1ugILIgADjABFMjQxNSMAAugBDUYANTg3NswDDCMAA0cAZDEwNTA2NBQCC2sABJABAPYAHzUkAAQE1wBzMTIzMjM0OdYAAocDB5EAAyABTzI2NDmUAAcETABhNTM2OTYziQHwAH0iLCJ2aWRlb19zb3VyYzYGwHVzZXJ1cGxvYWQifQ==",
+                "8hZ7ImZlYXR1cmUiOiJ7XCJyb3NfMWRcIjpcIjAuMzk3OTczXCIsGAAUNxgAYzQ0NTY4NRgAFnYwAGUwMjA5NDgYAAUwAGEwMTk2NzEYADdzdHIwAFU1MjYzNxgABjAAQjQ0MTNIACV2bzAAcjguNDUxODlIAAAYAAMwACA4LhcAITU2SAAYdpAAUjE3NzA1wAAAGAADMABiMC4xNjc1XwAB7wAVNNgAMzcyN2AAABkAJDMwGQBSODYzMjlhAAHxAAUyAGEwMTgzNDl6AAAZAAYyAGEwMzYwNjQZAAHzAAYyAEIzODgwMgAAGQAHMgBCNDE3N1UBRHZpZXcmAYE5NTgwMjUuMEsAARkAA8cAdDQ0OTE4ODcaAAAoAQNlAHI4LjY5MjgyMgAWb2QAdjguMDQyOTARAQQxAHQwLjE1OTUwWgEIyABDMjkwMPkARF9jbnSWAHMyLjUwMDQ5RQEBGgADlwAgMi4sAQOOAVRzaGFyZTQAUzUwNDI4rwACGQADMwBjMTk4MjYxGgAB4wAEmQB4ODg1NzkwORsABDEBgzM1Nzk5ODc2HAAChAAEOAAQMgIBIjYz6gACGwAFOABiLjkxNDExmwFVcl9yYXShAHQwLjAwODM31QABGwADowAAGwAjNzTEAmRyZXR1cm7XAEQyMDA2ogADGgADNQBTODgzNjKgAALxAASgAFQzNDM3NrsBAhsABKAAaTE0OTU1M9cAGTSTAzI2ODEzAwHYABk0lwMyNDQ1WwIDvgAEcAAAvwAqNjj1AARxAAAcACQ5MhwAA9sAAxkCYzE2MjUzMMMAA90ABDgAZTEyOTEwOR0AAIABAKkAAzoAcjAuNDc3MTDQAgSqAAQ7AABRAzMyMDSfAQJzAAL4AQJxA1QxNjk2MhECA3cAASAAA1kBVDc1Mjc1WgEIIAAE8ABzMTQxMjg0NDYDCCIABIMAdDEwMzg0MTFlAAFeADNoYXMrAAMCBTQ4MDKJAQshAAOJAEQzMzU2AgECxwENRABENTA1N78DDCMAA0YAVDE5ODgwGgMLaQAE0gA6NjAzIwMGaQAE0wBfMzI5ODVrAAUESABUMzQwNjWvAgyQAARKAGExNDk3NzAmAPAAfSIsInZpZGVvX3NvdXJjJgbg5YWo6Z2ic3BpZGVyIn0=",
+                "8hZ7ImZlYXR1cmUiOiJ7XCJyb3NfMWRcIjpcIjAuODA2MjEzXCIsGAAVNxgARDY2NDAYABZ2MABjMDUwNTA2MAAWdjAAYTA1Mzg1MhgAN3N0cjAAQjYyNjQwAAAYAAYwAEI2MjE1GAAldm8wAIE3LjQzNjY4NEgAABgAAzAAUzcuMjc4jwAYdo8AVDM3NTU5RwAHjwBhMzkxOTM5RwAB7wAWNNgARTU3NDEZACQzMBkAVzk3NzY18QAFMgBSMDU0NjHaAADyAAYyADMwNTgKAQDaAAcxAEI2MzA4YwAAGQAIMQBBOTM4N3wARHZpZXclAZYyNDczMDc5LjAaAAP3AHUxMzMxMDA2GwAAKQEDZwBUNy40NjC6AQAqAQRnAABDATYwNjgUAQaZAFQ0MDc0MVwBCMoAUjQzMTQymQBUcl9jbnSaAGgzLjg5MTkZAAOZAIEzLjg2MzI4OLIAVHNoYXJlMwBjMTU0OTI4zAACGgADNABjODI3MzA0GgACAAEDzACIMjAwNzM1ODUcAATPAHQzNTYwMTU3HAADnwADOQByMy44ODM3M9MAAhsABDgAVDQuMjA0YgJVcl9yYXSjAHQwLjAxMjk31wABGwADpAAAGwAjMzlQAFVldHVybtgARTI0OTCGAAIbAAM1AEU3MTY3vwEC8wAEdAFzMTI2NjI1NtkAAhwABKIAIDIxdQEE3AEBvgAZNJkDIjM3YAEEGwADbwBlMC44NjQxHAABvwAEcAAAwABBNDA2MpgBAxwABHAAABwAEzOYAgPBAAQ3AHMxMDk2MjUwpwADHQAEOAB0MjA2NzAzMh0AACACAKgAA4MBAI4ANDM1NU0BAh0ABDsAAFYDOTQ0NlABAvoBAnYDRTkyODg6AQN3AAEgAAPrAGU1MjE2NzMjAQK1AAEhAAS6AG84MTc4MjUiAAEEhAB0MTUzNTk0NoQBAT4AM2hhc24AAwgFUzMyMDkz4gALIgADiwBUMTg1NTNFAALJAQ1GAGMxNTUzOTdHAAwkAANIAFk4Mjk0MwYDB0cAA1QBVDI4MjI2SAALjwAE1wBUNDkxNjZIAAxsAAQeAVUxMjY5NB4BDCYABEsAYTIxMjEyMP4B8AB9IiwidmlkZW9fc291cmMxBvAI5YWo6Z2ic3BpZGVyLWF1dG9waWNrIn0=",
+                "8hZ7ImZlYXR1cmUiOiJ7XCJyb3NfMWRcIjpcIjAuODk5NTQ3XCIsGAAVNxgAUzM3MTIzGAAWdjAAZTA0MzgyNhgABTAAYTA0NzE5MRgAOHN0cjAANTg3MhcABi8AQjU2MzdfACV2by8AgTcuNzYzMzE1MAAAGAADMAB0Ny44NTk3MzAAB48AUjM0MDIzjwAAGAADMACBMC4zNzA5MDhIAAHvABQ02ABlOTAzNTY5GQAkMzAZAFQ4NTE5MAkBF3YyADUwNTExABd2MQBXMDQ2OTfyAAVjAEMwNTcySgAACwEHMgA0NTUxrQA0aWV3JQGhMTk0MTkxMjYuMJcAARsAA8kAlDE3NzU2ODA2MxwAACwBA2kAcjcuNTAyNDflAAAtAQRpAHY3LjYwNzA3FgEEMgB0MC4zODc4MF8BCM0AUjM1NzMxYAFUcl9jbnScAGkzLjY0NjgaAAObAGMzLjU3MjSsAVRzaGFyZTQAVDk0NjEwsgACGgADNACEMTAwMDk5ODnOAADqAASdAJg0NDUxOTE3NTEdAAXTAIM2MzA4MTY0MB0AA6QAA9gAgTMuODI4MjY0PwECGwAEOQBjMy42NTc5ggJVcl9yYXSnAHIwLjAxMjAxQAEDGwADqAAAGwAiMzLcAWRyZXR1cm7cAGQ4NTEwNjSGAAIbAAM1AHM4Mzc5NTkyHAAC+AAE3QBrMjU0Njc5HQAEpAB0NDIwNzM2MDoAAcEAGTSjAzc3MzDdABk0pwM5NTM0wwAEcwABxAAiNTB8AwPfAARyAAAcADoyODThAANNASAyMxcBFDmHAQP/AAQ6AIMzNTg0Mjc5OOYABawAAz0AczAuOTYyNTdgAwBJAhk0ZANDODM5M64AAjwBAe0CA40EETa3AgVbAAchAANiAYQ2NTg2MTM1N30AByIABPYAjzE3MjY0NzcwRgABBMQAdTI3MjY1ODlxAQGEADNoYXPrAAOOAFQyMzMzN5QBCyMAA5AAZDIzNDU2M2sAAgQDDUgAXzk0ODQ2JAAFA0kAdDEwMDMxMjbeAgtuAATcAGQ2MDExMTB9AgslAATdAGo5Nzk4NTR+AweUAAOoAYMyMzkwNjcwNUoBDLsABE0AcTQwNTQ4OTlxAfAAfSIsInZpZGVvX3NvdXJjTAbg5Z6C55u0c3BpZGVyIn0="
+        );
+
+        List<String> snappyStrs = Lists.newArrayList(
+                "mQyQeyJmZWF0dXJlIjoie1wicm9zXzFkXCI6XCIwLjY2NTI2OFwiLAkYADcRGBg3NzU4NDJcCRgAdhkwFDAxODIwORUYFTAUMDIzNzkzBRgIc3RyHTAQMjczNzEVGBkwEDMwNjY3BRgEdm8VMBg4LjI5NDk1CUgBGA0wGDcuOTQ5NDARGB2QEDE1MTA0GRgNMBwwLjE4OTEzNgVgBfAANBXZDDIzNTIR2QxzXzMwFRkMMzkzMQmSAHIBYhUyEDAyNDkxCcMBGRkyFDAyNTIwNAVkBfQZMgwzNDQzCTIBGR0yDDM0MDkJGQx2aWV3MScYMzQ4MTguMAVKBRgNxxQzNTU1MzIRGSEnDWMUOC4zNzE3DWMBGRFjGDguMzE3ODYJlQB2MscAEDIwODU1CfkBGREyGDAuMjA5NjQtKwxfY250EZYQMi43MjEtdAkZEZcQLjE4MjRNNhBzaGFyZREzCDk1Mw2uCRcNMQwxMDkwERkF4BXIEDg0MDkwDTMFGhGXFDE1NTAwMRH8CX8RNhgzLjIyNzQzKfYJGxE3FDMuMjUzMU0REHJfcmF0FZwYMC4wMDY2OSkCDRsNoAEbCDc0Ny0EEGV0dXJuEdIINjM0DZ8NGA0zDDg0NTkNGQnrFZ0IMDQ0EdIJGhGcDDUyODQy0QAANDKIAwgyNDhNfiGFBDRzEWoUMC43NzM2cYwAXwnTTQgFuQQ3MW2QCRwRbwkcADRt3A3VDTgMMjIwMjrYABE3EDM5MDY3DdoRihE3GDAuNzMyMDg9eQA0MkIDDDQzMzEtYAlwJdONbAQ1MjUyLh4ALVAMNjcyNDqSAAk9BDRkhaoQMTg0Mzcxci5AABW4DDI0OTURQgU7CGhhcw0pDYIEMjMyhQIZIAA3CWQIMjY1cYYpuhkiDUIEOTUxGz4hAA1DCDEwOVUxPoUADcoENjg1ezoiABHLDDEyMDAR6z5oABFGEDMwMDg0Lac+JAARSAg1MjUJ0Vx9IiwidmlkZW9fc291cmNlIjoiQUdDIn0=",
+                "1AyQeyJmZWF0dXJlIjoie1wicm9zXzFkXCI6XCIwLjg4MzExNFwiLAkYBDdkDRgYOTk3ODgyXAkYAHYZMBAwNDY1NRUXFS8UMDU0MzU0BRgIc3RyHS8MNTI3MQlHARguMAAINDY5BTAEdm8VMBw3LjcxOTkzNhUYDTAYNy43ODgxNgl4AHYujwAMMzU5Mx0YDTAYMC40MjMzMQkwBe8ENGQF2BwxLjAyMDgwMQVhARkEMzAVGRAxNjM5Mw0ZBHZfETIUMC4wNTUwCZIIcm92FTEBGAQ4Ng0xAdsuMQAMMzkzOAVKARkRYwEyDDc3NDcFGQx2aWV3MSYgNzA0NzE1MC4wGRoNyBwzNjc4OTc5MxEbISoNyhw3Ljk0MjM2NAk0BG9yFWcUNy44ODY1MVsuyQAQNDM3MzANfzLKABA0NjI4OAkyFHJfY250X00eFDMuNTQ1MC2PCRoRmRQuNjY3MDkpFxBzaGFyZRU0EDcxNDY2DbEJGg00GDIwMDM5MDUNGykBDc0cNTU1Nzg1MzcuHAAxNxw3NjA1OTczOA0cCYcRORQzLjYzNTlRqAW8ETgUMy41MTA4TQMMX3JhdBWjGDAuMDEzMTNNBQkbDaQBGwg0ODJJsRRyZXR1cm4V2QwyODA0EaINGw02FDE5OTk2NjHBCfURogAyYUkEMDENvgkcEaMYNDM5MjE4OQ0cBb8ANDKbAwgwOTgpsBEcDXEYMC45OTU3MDbdAC1MAcMINTE0TcoJ3hFxARwINjcxSZwNxBE4FDMwNjAxNRWNCfwRORQ0NDY0MTkR4hGOETthVgg2OTQxUQRjbgHHETsBHQQwMDFuCVcp/QBkZZMcMjUzMjUwMi5J/i4hAA3tGDE1NTczNjhxBS4iABGBGDI0MzA0ODlRdy4jABGHGDM1MjA3MjMyfwIIaGFzDSsNjAQ5MjqFAhkiDY0UNTQ1Mjk4Da0pzhkkDUYQMzcyMzYRrz4kAA1IFDIwMDgyOBGxJRAdSC3LEDg0MTYzMRo6JAAR2BQxMjcxNTQ2YAJGSgAUMjk3OTg3Md0+lAARTBQ0Mzc2NTIlIzh9IiwidmlkZW9fc291cmPBOjRVR0MtYXV0b3BpY2sifQ==",
+                "uAyQeyJmZWF0dXJlIjoie1wicm9zXzFkXCI6XCIwLjcyNTkwOFwiLAkYADcRGBg5ODgwOTVcCRgAdhkwFDAzMjE3MxUYFTAMMDQ1NgkXCHN0ch0vEDQ0MzIxBS8BGB0vBDYxCXYEdm8VLxw4LjU4MzQ0NAUvARgNLxg3LjczNjE3ERgdjhAyNzYxNRkYDTAYMC4zNTMwMAmPBe4ENGQN7xQ5ODE3ODcFYQEZBDMwUhkABHZfGTIQMDQ1MTkJwghyb3YdMh0ZAdsuMgAANg18ARgZYwAwFRgMdmlldzEkHDQ2ODk2Ny4wBZQFGQA3CZQYMzIzNTg4NBEaIScANAkaIRAMNDIyOQkzBG9yFWQ6GQAuxwAMMzQ5NS2JAHYyxwAdGRByX2NudBGYHDMuMjE5ODA0BWUJGg2ZFDQuMjEzN0kcEHNoYXJlETMQMjA3ODUNsAkZDTIUMTQ5NDMzDRoF5BHLGDM3NTc1MjkuGwAxMTYbAAByCZwtAgQ0LkG3BDQyHZ0RNzobAAhyYXQVoBgwLjAwOTk5ETYFGw2iFDAuMDEwOC1TFHJldHVybhHWEDE1MDg4DaENGg01EDE0NzY1MaEJ8RGhEDE3Mjk1ETYJGxGhMhsABdcANDKQAwg0MDlNoQHzBDRzEW4YMC45ODQ4NzK+ABFvBb8ENjFNpwnaEXA2HAAN2y1IEDE2OTgwEacNHBE4NhwADYwRORQwLjk3ODBJBBEcETkyHAAJcCn0AGRlhRAxMjk1MFHxLiAAMVYQMTQyMjdOIQAAMRG2FDMxMzMzNDaUAQVjEYM2IgAFGwhoYXMNbQ2IDDQ2ODYNQzohAA2JEDM1MDQxDSIpw0JEABAyMDgzN1ojAA1GFDE0OTkyMg0kOmkAEdEQMzk4NzBWIwAR0i4jAEKNADEYoSdxTD4lABFJGSU4fSIsInZpZGVvX3NvdXJjwR40VUdDLWhhbmRwaWNrIn0=",
+                "3wyQeyJmZWF0dXJlIjoie1wicm9zXzFkXCI6XCIwLjkwODUzNVwiLAkYADcRGBg4OTM5ODhcCRgAdhkwFDAzOTk2NxUYFTAUMDQwOTY5BRgIc3RyHTAQNDM5OTEVGB0wCDU4MglIBHZvFTAUNy43MTcyDTABGA0wGDcuNzQwMDEJSAB2LpAAEDMwODQ0BV8BFw0vGDAuMzE3MDkJXwXvBDRkFfAIMzYzEdgMc18zMBEZEDg1MjQ1CcEAcgFhFTIMMDQxNxUyAHYdMhQwNDA1ODYFfAXzHTIINjE4CUsBGRlkDDA0NzYNxAhpZXcxJSQxMTExNTI0Ni4wBUwFGw3JIDEwMTU1ODY0MhEcISsNaBg3LjkzNTk5CYEBGRFoHDcuODMzOTMzCU4yzAAMMzMxMhkYETElLwQ5NE0GDF9jbnQRmxwzLjgxMzIyMgVLCRoNmhgzLjk2NDM3CU0Qc2hhcmURNBA0ODg5NxGxCRoNNBg0NjU0MTAxEcwlAw3NCDE4MUFBADcyBQERoCAzODgxOTQ1NjUNOgmJETsUNC4wMzAxDe8JGxU5FC44NzYzNE0IDF9yYXQVphgwLjAxMDQ4KY4NGw2nBRsIMzM0CfUQZXR1cm4V3BA0NDI0OBGHCRsNNhg0MTYwNzA5DRwJ+BGjEDgzNzkwNeEJHBGkCDE4NAHeADQNOQXBBDRzEXFhoQg1MjcNjCGbBDRzEXIUMC44OTA5bUUNwxFyCcQANUkdDRwRcgUcMRUJxBE3FDc1NzE2MjrhABE4GDE1NzU1MDlCqgAtwwGrBDM3FXMEY24BqxE8GDAuODUwODlJLw11SQEAZGWZFDM0MjgzOVEbLiEALV8YMzIyMDM5M1UDAGUllwlDDYEcNjAwODg0MDcxSh0jEYcgMTIzNDI0MzQzDSQFQAhoYXMNLA2NEDExNjUwUcI6IwANjxQxMDQ5NTIRjinSQkgAEDQ5MDczEWs+JAANSRg0NjcwMDkwWpAADdoUMTg3ODc1MXk6kgAR3BQ0MDY0NDExvD5vABFLFDgzNzc5NXFnPiYAEUwYMTg1MTU5NgWXOH0iLCJ2aWRlb19zb3VyY8FFNG9sZFZpZGVvUHVzaCJ9",
+                "7AyQeyJmZWF0dXJlIjoie1wicm9zXzFkXCI6XCIwLjkyMjMyM1wiLAkYADcRGBg4NjE2NTdcCRgAdhkwFDA1MDA1OBUYFTAUMDQ3MDUyBRgIc3RyLjAADDQyNzQVGBkwEDU0NjA2BRgEdm8VMBg3LjY1ODY5FRcNLxg3LjgyNjU1ERgdjxAzODMzOAl3CHZvdhEwHDAuMzY4MjU1BUgF7wQ0ZBHwDDMwMDEJSQEZBDMwERkUODk2NjU0DTIEdl8ZMhAwNTE0MRnyGTIUMDQ4ODkxBTIF8xVkEDA1NTI4KTwBGR0yDDU0NTIN9QhpZXcxJiQzNTUxMjA3MC4wBU0FGw36IDI0MjM0NzE4OREcISwENGQFzRg3LjY3NTg0Ef4AchVpGDcuNzU3MzkRGS7NABQzOTQ2NzcJZwRvdhUyGDAuMzc5MjYJmxByX2NudBWcFC44NDA5OS0ABRoNmxQzLjYxODkNTRBzaGFyZRE0GDE5MjczOTQNswkbDTUYMTMyMzM2OTLrABHQIDU4MDk2NjMxNQ05JQgxPSQxMDc5OTIzOTk3DR4JjBE8GDMuODY3NTlNyQWnEToYMy43MTY1ME0NDF9yYXQVqRgwLjAxMzAzETYFGwA3KV0JGwAwKd8UcmV0dXJuFd8QNzc3Njcxkg0cDTccMTE0MDI5MDENpQn8FaUUMjExOTk1Nh0AEacYNTg4ODM4MDE2BcQANDKpAwgwMDQ9oQQ0cxF0GDAuODU5NTINqwnGEXMFxwQyOTL9ABFyBRwAMXEmDeNNXBgyOTg3MjE3FY4JHhE6HDUyNzk4NDI2DeYVrA09GDAuOTY3NjhdNAQ0cxU8FDAuOTE0OW04DVgl6o2THDEzNjE0NjkyEVwJegUiLWQYODkyNDU0OE4iABGCIDIyOTI5NDA3M0pGABHFHDQwOTU3ODA2MckFYwhoYXMNcg2PEDQ2MjgxUXQ6IwANkBQzMTUwODYRaynzQkgAEDE5MzIxYiUADUoYMTMyNjY1NzFYOm8AEd0YNzcyMzcxMQ3bOiUAEd4UMTQyMDY0NQFClgAANEnnGDMwODY5NjJxkD4nABFOGDU3NzAzNzUFJ3R9IiwidmlkZW9fc291cmNlIjoidHJhbnNwb3J0In0=",
+                "lgyQeyJmZWF0dXJlIjoie1wicm9zXzFkXCI6XCIwLjQ5MzAyM1wiLAkYADcRGBg3OTUyNzlcCRgAdhkwFDAyMjY3NBUYFTAUMDMyMjg1BRgIc3RyHTAMNDU5OAlIARgZMBA0MDU5NgUwBHZvFTAYOC45MjkyNAlIARgNMBw3Ljk2MDgyNw0wHZAMMjAyNBFHAHYRLxgwLjI1NzAxEacQc18xNGQN8BQ3ODIwMzQFSCEICDMwZA0ZEDY3MjY3MQkAdh0yFDAzMTM5NA0yAHYdMhAwMjc1NgmrAdsZZBAwNDAxNAkyARkZZAwwNDA5LVUMdmlldzEmFDkzNTAuMAViBRcN9RQyNTQ2MDkRGSElDcYYNy44Nzg2MAliARkRYhg4LjI1NTkwCcYAdjLGABAyNDczMymIARkRMhgwLjIyNzU3KVkQcl9jbnQRlRgyLjcxNzk0CTMJGg2YHDQuMjMwNTcxBbEQc2hhcmURNAQ0MxHICRcNMRAxMDMzNhHIBfgNyRQzNDEzNzMuGgARmBgxMDI5MzM1DRsJfxE2GDQuMTk5NDUJgAkbETcYMy40NDU1MxHPCHJhdBWcHDAuMDA4MzQyBbYAcgkbDaABGwg3NjMNURBldHVybhHSCDIxMhGECRgNMwg4MjI26wARnRAxMzcwNA0zKQURnBA0MjE4MQ0aBbYANFqHAwhfY24BHA1qGDAuNzkzMDUp7Q24EW0FuQQ0N2kADRwRbwEcADgJ7Qm6ETUQMTA3MTcRiAkbETQMMjgzNxG9EYcRNxgwLjc4MDE1EWwJpBE5GDAuNjcxMjINpQlVKeoEZFyBaAgxODkx5y4eAA3jEDY1NDM4NpIACT1NJwg4NDRZCwBlJZ8FIBF+EDIzNDI1EWAFGghoYXMNKQ2BADcRYDofAA2CCDE5NBFAKbVCQQA+2wIZIRFDCDAzNlGwOmUAEcgIMjU1UU46IgARygQ4MhXpQogALQ1hMjG/PiQAEUcMNDIyNwVqbH0iLCJ2aWRlb19zb3VyY2UiOiJ1bmtub3duIn0=",
+                "zgyQeyJmZWF0dXJlIjoie1wicm9zXzFkXCI6XCIwLjU5NzQ2NFwiLAkYBDdkDRgYNzQ5MzU0XAkYAHYZMBQwMjE5MTIVGBUwFDAzMzE4OQUYCHN0ch0wEDM2Njc1FRgZMAg0NDIJLwR2bxUvGDguMjU2NzgFLgEXDS4UOC4xMDMwFRgdjhQxODA5MjENMAB2ETAYMC4yNjg5MwkYBe4ENGQN1xQ4NDA1ODYFMQEZBDMwERkQNzU3OTQJqAByAWIVMhQwMzg1MzcNMgB2HTIQMDMzNTYJwwXyGTIINDU4DUsBGRlkHfQIaWV3MSQgMjM4NDQyOC4wBWQFGg34HDIzNjcwNTI1ERshKQ1mGDcuOTIyMzcJygEZEWYYNy45NDg4NAn8AHYyygAUMzA1MzAzCWYyygAQMjY2ODMJSxByX2NudBWaFC43NzA1NCmQCRoNmhwzLjI1MjIwNAVNEHNoYXJlETQMODc0NBHMCRkNMxQxMDQ4MzYVzABpIQENzRw1OTA0OTI2MRHoARwR0CAxMjIzNDc3NTINHQmHEToYMy40NjExOC24AF8BvBE5HDMuMzMyNzU3BaMUcl9yYXRlEaQYMC4wMDc5MCm8DRsNphgwLjAxMDIwDVEQZXR1cm4RNhA1MjI0NxGGCRoNNRQ3ODU1OTYNGwn1EaEYMjcwNzEyNDIcABGiFDU0MTg3NTESBb4ANDKaAwQ2Mi6WAQQ0cxFwGDAuNzQ3NzIxmAnbLUwBwQgxMTMpmg3cEXEBHAgwMDdJAw3DETgYMjI3NTU3MA2pDR0ROQQ0MQHGFR0haAGqFXMQODU4ODJdQQQ0cxU7GDAuNzY0ODctbCk3JeEIMWRcgYIQNDMxMzk13R0gLVwUNjM2NTc0MV0uIQARfxwxODAyNzkyMTa7AAVkEcAcMzI2NDY4NDMNIwUcCGhhcw1ODYoQMTg4NThWIgANjAwyNDE1FSMp6EJGAAg4NzZ1zD4jAA1HFDEwNTA2NFEUPo0ALVUB9gA1WiQAEdcYMTIzMjM0OQ20Pm4AEUoMMjY0OWaUABFMFDUzNjk2MyWJOH0iLCJ2aWRlb19zb3VyY8E2LHVzZXJ1cGxvYWQifQ==",
+                "wAyQeyJmZWF0dXJlIjoie1wicm9zXzFkXCI6XCIwLjM5Nzk3M1wiLAkYADcRGBg0NDU2ODVcCRgAdhkwFDAyMDk0OBUYFTAUMDE5NjcxBRgIc3RyHTAQNTI2MzcVGBkwDDQ0MTMJSAR2bxUwGDguNDUxODkJSAEYDTAEOC4BFwQ1NgVIAHYukAAQMTc3MDUJwAEYDTAUMC4xNjc1CV8F7wA0FdgINzI3DWABGQQzMBEZEDg2MzI5CWEAcgFhFTIUMDE4MzQ5BXoBGRkyFDAzNjA2NAUZBfMZMgwzODgwCTIBGR0yDDQxNzcpVQx2aWV3MSYcOTU4MDI1LjAFSwB2ARkEN2Qlnxg0NDkxODg3ERohKA1lGDguNjkyODIJMgRvchVkGDguMDQyOTA5ERExGDAuMTU5NTAxWgB2FTIUMC4yOTAwDfkMX2NudBGWGDIuNTAwNDktRQUaDZcEMi4hLC2OEHNoYXJlETQQNTA0MjgNrwkZDTMUMTk4MjYxDRoF4xGZGDg4NTc5MDkuGwAxMRwzNTc5OTg3Ng0cCYQROAAyIQIENjMJ6gkbFTgYLjkxNDExNCUeEHJfcmF0FaEYMC4wMDgzNxHVBRsNowEbBDc0TcQUcmV0dXJuEdcMMjAwNhGiDRoNNRA4ODM2Mg2gCfERoBAzNDM3NjG7CRsRoBQxNDk1NTMy1wAANDKTAwg2ODFpMwXYBDRzEW4YMC40NDQ0NUlbEdkENGRFLAG/BDY4NvUAEXEBHAQ5MhEcDdsNOBQxNjI1MzANww0cETgUMTI5MTA5FR1BBAGpDToYMC40NzcxMEnQER0ROxgwLjg2MjA0LZ8Jcyn4Ca8QMTY5NjJRES4gAC1ZFDc1Mjc1MjaXAAlADX4YMTQxMjg0NEoiABGDGDEwMzg0MTERZQU+CGhhcw1tDYgIODAyMYk6IQANiQwzMzU2MQIpx0JEAAw1MDU3cb8+IwANRhAxOTg4MHEaOmkAEdIINjAzNiMDGWkR0xAzMjk4NV5rABFIEDM0MDY1Ua8+kAARShAxNDk3N2l3OH0iLCJ2aWRlb19zb3VyY8EmNOWFqOmdonNwaWRlciJ9",
+                "1AyQeyJmZWF0dXJlIjoie1wicm9zXzFkXCI6XCIwLjgwNjIxM1wiLAkYADcVGAw2NjQwERgAdhkwGDA1MDUwNlwJMAB2GTAUMDUzODUyBRgIc3RyHTAMNjI2NAkwARgVYAF3ADUJGAR2bxUwHDcuNDM2Njg0BUgBGA0wEDcuMjc4DY8Adi6PABAzNzU1ORFHHY8UMzkxOTM5BUcF7wQ0ZBHwEDY1NzQxFRkEMzARGRA5Nzc2NR3xFTIQMDU0NjEJ2ghyb3YdMggwNTgtCgHaHTEMNjMwOAljARkZYxQwNTkzODcFfAx2aWV3MSUgMjQ3MzA3OS4wGRoN9xgxMzMxMDA2FRshKQ2YEDcuNDYwMboBGRFnIUMIMDY4ORQRMhwwLjQwNzQxNAlmMsoAEDQzMTQyCZkQcl9jbnQRmhQzLjg5MTkuGQANmRwzLjg2MzI4OAVMEHNoYXJlETMUMTU0OTI4DcwJGg00FDgyNzMwNA0aKQANzBwyMDA3MzU4NS4cABHPGDM1NjAxNTcRHA2fDTkYMy44ODM3MwnTCRsROBA0LjIwNFFiEHJfcmF0FaMYMC4wMTI5NxHXBRsNpAEbBDM5DVAQZXR1cm4V2AwyNDkwFYYJGw01DDcxNjc1vwnzEaEYMTI2NjI1Ng3ZCRwRogQyMSF1MdwFvgA0MpkDBDM3KWARGw1vFDAuODY0MRUcBb8RcAHACDQwNk2uCRwRcAEcADNNmA3BETcYMTA5NjI1MA2nDR0ROBgyMDY3MDMyER1BIAGoLYMBjggzNTUxTQRjbgEdETsYMC45NzQ0NjJQASn6AGRljww5Mjg4OQIpVQUgDesUNTIxNjczNSMdIRF/FDgxNzgyNU4iABGEGDE1MzU5NDYxhAVfCGhhcw1NDYkQMzIwOTMN4joiAA2LEDE4NTUzEUUpyUJGABQxNTUzOTcNRz4kAAA3CfMUODI5NDM0DSQ6awAR1RAyODIyNhFIOiQAEdcQNDkxNjYRSD5sABFJEDEyNjk0NR4+JgARSxQyMTIxMjAl/jh9IiwidmlkZW9fc291cmPBMVjlhajpnaJzcGlkZXItYXV0b3BpY2sifQ==",
+                "5gyQeyJmZWF0dXJlIjoie1wicm9zXzFkXCI6XCIwLjg5OTU0N1wiLAkYADcVGBQzNzEyM1wJGAB2GTAUMDQzODI2FRgVMBQwNDcxOTEFGAhzdHIuMAAIODcyFRcZLww1NjM3CV8Edm8VLxw3Ljc2MzMxNQUwARgNMBg3Ljg1OTczETAdjxAzNDAyMwmPCHZvdhEwHDAuMzcwOTA4BUgF7wA0EdgUOTAzNTY5FRkEMzARGRA4NTE5MDEJBHZfGTIIMDUxFTEAdh0xEDA0Njk3HfIVYwwwNTcyDUohCxljDDA1NTERrQhpZXcxJSQxOTQxOTEyNi4wBZcFGw35IDE3NzU2ODA2MxEcISwNaRg3LjUwMjQ3CeUBGRFpGDcuNjA3MDc5FhEyGDAuMzg3ODAxXy7NABAzNTczMSlgFHJfY250X00hFDMuNjQ2ODIaAA2bFDMuNTcyNC2sEHNoYXJlETQQOTQ2MTARsgkaDTQcMTAwMDk5ODkRziUFDc8gNDQ1MTkxNzUxLh0AFdMcNjMwODE2NDANHQ2kDTscMy44MjgyNjQlPwkbETkUMy42NTc5TYIQcl9yYXQVpxgwLjAxMjAxKUANGw2oARsEMzIp3BRyZXR1cm4R3BQ4NTEwNjQRhgkbDTUYODM3OTU5Mg0cCfgRohQyNTQ2Nzk6HQARpBg0MjA3MzYwEToFwQA0MqMDCDczMB3dBDRzEXMYMC44MzUzNDLDABFzBcQENTBpfA3fEXIBHAgyODQ24QAtTQQyMyEXADkxhw3kETocMzU4NDI3OTgN5hWsDT0YMC45NjI1N21gQUkENHMVPBgwLjg4MzkzDa4pPEkDAGSFjQA2RbcVWx0hLWIcNjU4NjEzNTcRfR0iEYEcMTcyNjQ3NzBORgARxBgyNzI2NTg5NXEFhAhoYXMNUA2OEDIzMzM3MZQ6IwANkBQyMzQ1NjMRaynyQkgAEDk0ODQ2XiQADUkYMTAwMzEyNlHeOm4AEdwYNjAxMTEwNA3+OiUAEd0UOTc5ODU0Nn4DHZQtqBwyMzkwNjcwNQ1MPrsAEU0YNDA1NDg5OSVxOH0iLCJ2aWRlb19zb3VyY8FMNOWeguebtHNwaWRlciJ9"
+        );
+        testSnappyDecompress(snappyStrs, 1);
+//        testSnappyDecompress(snappyStrs, 10);
+//        testSnappyDecompress(snappyStrs, 100);
+//        testSnappyDecompress(snappyStrs, 1000);
+//        testSnappyDecompress(snappyStrs, 10000);
+
+//        testLz4Decompress(lz4Strs, 1);
+//        testLz4Decompress(lz4Strs, 10);
+//        testLz4Decompress(lz4Strs, 100);
+//        testLz4Decompress(lz4Strs, 1000);
+//        testLz4Decompress(lz4Strs, 10000);
+    }
+
+    private static void testSnappyDecompress(List<String> strs, int num) {
+        try {
+            long startTime = System.currentTimeMillis();
+            for (int i = num; i > 0; i--) {
+                for (String str : strs) {
+                    System.out.println(CompressionUtil.snappyDecompress(str));
+                }
+            }
+            System.out.println(num + " : snappy decompress cost: " + (System.currentTimeMillis() - startTime) + "ms");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    private static void testLz4Decompress(List<String> strs, int num) {
+        try {
+            long startTime = System.currentTimeMillis();
+            for (int i = num; i > 0; i--) {
+                for (String str : strs) {
+                    CompressionUtil.lz4Decompress(str);
+                }
+            }
+            System.out.println(num + " : lz4 decompress cost: " + (System.currentTimeMillis() - startTime) + "ms");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+
+}