• Skip to secondary menu
  • Skip to main content
  • Skip to primary sidebar
  • Home
  • Projects
  • Products
  • Themes
  • Tools
  • Request for Quote

Vengala Vinay

Having 9+ Years of Experience in Software Development

  • Home
  • WordPress
  • PHP
    • Codeigniter
  • Django
  • Magento
  • Selenium
  • Server
Home » Eliminating Redis Bottlenecks: Tuning Queries for High-Performance Magento 2 Stores

Eliminating Redis Bottlenecks: Tuning Queries for High-Performance Magento 2 Stores

Understanding Magento 2’s Redis Usage Patterns

Magento 2 leverages Redis extensively for caching, session management, and message queueing. While this provides significant performance benefits, misconfigurations or inefficient data access patterns can turn Redis into a critical bottleneck. A common misconception is that Redis is a “black box” and tuning is limited to memory allocation. This post dives into specific query patterns and configuration parameters that directly impact Magento 2’s performance when using Redis.

Session Storage Optimization: The `session.save_handler` Directive

By default, Magento 2 often uses Redis for session storage. The primary configuration for this resides in php.ini or a custom PHP configuration file. The critical directive is session.save_handler. While redis is common, understanding its implications is key.

When using Redis for sessions, each request that requires session access results in a Redis GET operation (to retrieve the session data) and potentially a SET operation (to save changes). If session data becomes large or if there’s high traffic, this can lead to a significant load on Redis. Furthermore, the default serialization format can impact performance.

Tuning `session.gc_maxlifetime` and `session.cookie_lifetime`

These PHP settings, while not directly Redis commands, influence how long session data persists in Redis. Setting them too high can lead to stale data and unnecessary memory consumption. Setting them too low can cause frequent session expirations, leading to a poorer user experience and potentially more frequent session creation overhead.

A common starting point for e-commerce sites is a session.gc_maxlifetime of 14400 seconds (4 hours) and a session.cookie_lifetime of 7200 seconds (2 hours). Monitor Redis memory usage and session activity to fine-tune these values.

Cache Storage Tuning: Magento’s Cache Types and Redis Commands

Magento 2 employs a sophisticated caching system with various types (e.g., configuration, layout, block_html, collections). When Redis is configured as the cache backend (cache.backend set to Cm_Cache_Backend_Redis in app/etc/env.php), understanding the underlying Redis commands is crucial.

Magento uses a prefixing strategy for cache keys to isolate different cache types and prevent collisions. For example, a configuration cache entry might look like config: Magento_Store::stores, while a block HTML cache might be block_html: Magento_Catalog::catalog_product_view_type_simple_123. These are stored as Redis keys.

Analyzing Redis `KEYS` and `SCAN` for Cache Debugging

Directly using KEYS * in Redis is highly discouraged in production environments due to its blocking nature. However, for debugging purposes on a staging or development environment, it can reveal the structure of your cache keys. A more production-friendly approach is SCAN.

To inspect cache keys related to a specific Magento cache type (e.g., block_html), you can use SCAN with a pattern. Note that Magento’s cache keys are often prefixed with the cache type itself.

redis-cli
127.0.0.1:6379> SCAN 0 MATCH "block_html:*" COUNT 100

This command will return a cursor and a list of keys matching the pattern. Observing the distribution and size of these keys can highlight potential issues. For instance, an excessive number of unique block_html keys for product pages might indicate that page caching is not effectively utilized or that dynamic content is being cached granularly.

Cache Tagging and Invalidation Strategies

Magento’s cache tagging mechanism is powerful but can be a source of performance problems if not managed correctly. When an entity (like a product or category) is updated, Magento invalidates all cache entries associated with its tags. If tags are overly broad or if there’s a high churn of updates, this can lead to excessive cache invalidations, forcing Redis to serve stale data or requiring frequent cache regeneration.

Consider the impact of custom modules that might introduce inefficient tagging. Debugging cache invalidations often involves tracing the tags parameter in Magento’s cache API calls.

Message Queue (MQ) Performance with Redis Transport

Magento 2’s Message Queue framework, when configured to use Redis as the transport (queue.xml), introduces another layer of Redis interaction. Messages are published to Redis lists, and consumers retrieve them.

Monitoring Redis Lists for Queue Backlogs

A common indicator of MQ issues is a growing backlog of messages in Redis. You can monitor the length of these lists using the LLEN command.

redis-cli
127.0.0.1:6379> LLEN "magento/queue/default/messages"

The exact list name depends on your queue configuration. A consistently high or increasing list length suggests that consumers are not processing messages fast enough. This could be due to:

  • Insufficient consumer instances.
  • Slow execution of consumer logic.
  • Resource contention on the server running consumers.
  • Redis performance issues themselves (latency, throughput).

Optimizing Consumer Throughput

If Redis is performing well but queues are backing up, the bottleneck is likely within the consumer logic or its execution environment. Ensure consumers are idempotent and handle errors gracefully. Consider scaling out consumer instances. For very high throughput scenarios, investigate alternative MQ transports if Redis becomes a limiting factor for message brokering.

Redis Configuration Parameters for Magento 2

Beyond memory allocation, several Redis configuration parameters in redis.conf are critical for Magento 2’s performance.

`maxmemory-policy`

For cache storage, allkeys-lru or volatile-lru are generally recommended. allkeys-lru evicts the least recently used keys across the entire dataset, while volatile-lru only evicts keys with an expire set. For Magento’s cache, which often has TTLs, volatile-lru can be effective, but allkeys-lru might be more predictable if memory pressure is high and you want to ensure frequently accessed non-expiring data (like sessions) isn’t evicted prematurely.

# redis.conf
maxmemory-policy allkeys-lru

`appendonly` and `appendfsync`

For session storage, durability is important. Enabling appendonly yes with appendfsync everysec provides a good balance between durability and performance. This writes commands to an append-only file (AOF) every second. For critical session data where absolute minimal data loss is paramount, appendfsync always can be used, but it incurs a significant performance penalty.

# redis.conf
appendonly yes
appendfsync everysec

For cache storage, durability is often less critical. If Redis is solely used for caching and can be rebuilt from the source, you might consider disabling AOF or using appendfsync no for maximum performance, accepting the risk of data loss on Redis restart.

`tcp-backlog`

This setting controls the maximum number of pending connections that Redis can queue. On busy servers, increasing this value can prevent connection refused errors during traffic spikes.

# redis.conf
tcp-backlog 511

The optimal value depends on your OS and network stack. A common recommendation is to set it to a value like 511 or higher, matching your OS’s net.core.somaxconn.

Monitoring and Diagnostics

Effective monitoring is key to identifying and resolving Redis bottlenecks. Utilize Redis’s built-in commands and external tools.

`INFO` Command

The INFO command provides a wealth of information about your Redis instance. Key sections to examine for performance tuning include:

  • Memory: used_memory_human, used_memory_rss, maxmemory, mem_fragmentation_ratio. High fragmentation can indicate memory inefficiency.
  • Clients: connected_clients. A high number of connected clients can strain Redis.
  • Stats: total_commands_processed, instantaneous_ops_per_sec, keyspace_hits, keyspace_misses. A low hit rate suggests cache inefficiency.
  • Persistence: AOF and RDB status.
  • CPU: used_cpu_sys, used_cpu_user. High CPU usage is a direct indicator of load.
redis-cli
127.0.0.1:6379> INFO memory
127.0.0.1:6379> INFO stats
127.0.0.1:6379> INFO commandstats

INFO commandstats is particularly useful for identifying which Redis commands are being executed most frequently and how much CPU time they consume.

`SLOWLOG` Command

The slowlog logs commands that exceed a specified execution time threshold. This is invaluable for pinpointing specific queries or operations that are causing latency.

redis-cli
127.0.0.1:6379> CONFIG GET slowlog-log-slower-than
127.0.0.1:6379> SLOWLOG GET 10
127.0.0.1:6379> SLOWLOG LEN
127.0.0.1:6379> SLOWLOG RESET

Ensure slowlog-log-slower-than is set to a reasonable value (e.g., 10000 microseconds = 10ms). Analyze the output for commands that are consistently slow. For Magento, this might reveal inefficient cache key lookups or problematic session operations.

Conclusion

Optimizing Redis for Magento 2 is an ongoing process that requires a deep understanding of both Magento’s internal workings and Redis’s capabilities. By carefully tuning session handlers, analyzing cache key patterns, monitoring message queues, and configuring Redis parameters appropriately, you can transform Redis from a potential bottleneck into a high-performance asset for your Magento 2 store.

Primary Sidebar

A little about the Author

Having 9+ Years of Experience in Software Development.
Expertised in Php Development, WordPress Custom Theme Development (From scratch using underscores or Genesis Framework or using any blank theme or Premium Theme), Custom Plugin Development. Hands on Experience on 3rd Party Php Extension like Chilkat, nSoftware.

Recent Posts

  • Step-by-Step: Diagnosing indexing lock conflicts and high CPU during bulk stock updates on DigitalOcean Servers
  • How to Debug and Fix memory leaks and socket exhaustion in daemon processes in Modern C++ Applications
  • Infrastructure as Code: Provisioning Secure PHP Clusters on DigitalOcean Using Terraform
  • Fixing Slow Largest Contentful Paint (LCP) caused by unoptimized database queries in Legacy Laravel Codebases Without Breaking API Contracts
  • An Auditor’s Checklist for Securing Laravel Backends on Google Cloud

Copyright © 2026 · Vinay Vengala