Understanding Key Eviction and Memory Fragmentation in Redis

Redis operates within a fixed memory limit, and when this limit is reached, key eviction policies determine which data is removed. Improper eviction strategies and high memory fragmentation can lead to inefficient memory usage and degraded performance.

Common symptoms include:

  • High Redis latency despite low CPU usage
  • Frequent eviction of critical keys
  • Unexpected OOM command not allowed errors
  • High fragmentation ratio in INFO MEMORY output

Key Causes of Performance Degradation

Several factors contribute to performance issues in Redis:

  • Suboptimal eviction policy: Using volatile-lru or allkeys-random may remove frequently accessed keys.
  • Memory fragmentation: Uneven memory allocation results in wasted space.
  • Large object storage: Storing large strings or complex data structures leads to inefficient memory use.
  • Improper persistence settings: Background saves can interfere with normal operations.
  • Improper client connection handling: Too many open connections can strain memory.

Diagnosing Key Eviction and Memory Fragmentation Issues

To identify and resolve Redis performance issues, systematic debugging is required.

1. Checking Memory Usage

Inspect Redis memory allocation:

redis-cli INFO MEMORY

2. Monitoring Evicted Keys

Detect frequent key evictions:

redis-cli INFO stats | grep evicted_keys

3. Checking Memory Fragmentation

Analyze memory fragmentation ratio:

redis-cli INFO MEMORY | grep mem_fragmentation_ratio

4. Identifying Large Keys

Find keys consuming excessive memory:

redis-cli --bigkeys

5. Analyzing Eviction Policy

Check current eviction settings:

redis-cli CONFIG GET maxmemory-policy

Fixing Performance Issues in Redis

1. Optimizing Key Eviction Strategy

Choose an appropriate eviction policy:

redis-cli CONFIG SET maxmemory-policy allkeys-lru

2. Reducing Memory Fragmentation

Perform active defragmentation:

redis-cli MEMORY PURGE

3. Using Hashes Instead of Large Strings

Store structured data efficiently:

HSET user:1001 name "Alice" age "30"

4. Optimizing Persistence Configuration

Avoid performance degradation from background saves:

redis-cli CONFIG SET save "900 1 300 10 60 10000"

5. Managing Client Connections

Limit excessive connections:

redis-cli CONFIG SET maxclients 10000

Conclusion

Key eviction and memory fragmentation in Redis can lead to degraded performance and unexpected data loss. By selecting the right eviction policy, optimizing data structures, reducing fragmentation, and properly managing client connections, developers can ensure high Redis performance and reliability.

Frequently Asked Questions

1. Why is Redis evicting my keys?

Redis evicts keys when it reaches its memory limit, based on the configured eviction policy.

2. How do I check memory fragmentation in Redis?

Use redis-cli INFO MEMORY | grep mem_fragmentation_ratio to check the fragmentation ratio.

3. What is the best eviction policy for Redis caching?

allkeys-lru is recommended for caching as it removes the least recently used keys.

4. How can I optimize Redis memory usage?

Use hashes instead of large strings, perform active defragmentation, and configure an efficient eviction policy.

5. How do I prevent Redis from running out of memory?

Set an appropriate maxmemory limit and enable an eviction policy suited for your workload.