Value compression for Concord KV store.
Provides transparent compression for large values to reduce memory usage and improve performance. Compression is automatically applied based on configurable size thresholds.
Configuration
config :concord,
compression: [
enabled: true,
algorithm: :zlib, # :zlib or :gzip
threshold_bytes: 1024, # Compress values larger than 1KB
level: 6 # Compression level 0-9 (0=none, 9=max)
]Compression Format
Compressed values are stored as tuples: {:compressed, algorithm, binary}
Uncompressed values are stored as-is.
Examples
# Compress a value
compressed = Concord.Compression.compress("large data...")
# {:compressed, :zlib, <<...>>}
# Decompress automatically
value = Concord.Compression.decompress(compressed)
# "large data..."
# Check if value should be compressed
Concord.Compression.should_compress?("small") # false
Concord.Compression.should_compress?(large_data) # true
Summary
Functions
Compresses a value if it exceeds the configured size threshold.
Returns the compression configuration.
Decompresses a value if it was compressed.
Checks if a value should be compressed based on size threshold.
Returns compression statistics for a value.
Types
Functions
@spec compress( term(), keyword() ) :: term() | compressed_value()
Compresses a value if it exceeds the configured size threshold.
Options
:algorithm- Compression algorithm (:zlib or :gzip):level- Compression level 0-9 (default: 6):force- Force compression regardless of size (default: false)
Examples
iex> Concord.Compression.compress("small value")
"small value"
iex> large_value = String.duplicate("x", 2048)
iex> Concord.Compression.compress(large_value)
{:compressed, :zlib, <<...>>}
iex> Concord.Compression.compress("force compress", force: true)
{:compressed, :zlib, <<...>>}
@spec config() :: keyword()
Returns the compression configuration.
@spec decompress(term() | compressed_value()) :: term()
Decompresses a value if it was compressed.
Automatically detects compressed values and decompresses them. Non-compressed values are returned as-is.
Examples
iex> Concord.Compression.decompress("plain value")
"plain value"
iex> compressed = {:compressed, :zlib, binary}
iex> Concord.Compression.decompress(compressed)
"original value"
Checks if a value should be compressed based on size threshold.
Examples
iex> Concord.Compression.should_compress?("small")
false
iex> large = String.duplicate("x", 2048)
iex> Concord.Compression.should_compress?(large)
true
Returns compression statistics for a value.
Examples
iex> value = String.duplicate("x", 2048)
iex> Concord.Compression.stats(value)
%{
original_size: 2048,
compressed_size: 45,
compression_ratio: 45.5,
savings_bytes: 2003,
savings_percent: 97.8
}