What’s Wrong with Delayed Double Delete? How Top Tech Companies Elegantly Avoid It
The article explains the delayed double‑delete cache‑invalidation pattern, its four major drawbacks in high‑concurrency environments, and presents four production‑grade alternatives—event‑driven binlog updates, distributed‑lock with versioning, write‑through proxy layers, and logical‑delete with async cleanup—used by leading Chinese internet firms to achieve reliable data consistency.
What Is Delayed Double Delete?
Delayed Double Delete (Delayed Double Delete) is a cache‑invalidation strategy for Redis‑MySQL stacks that tries to mitigate cache‑DB inconsistency by deleting the cache, updating the database, waiting a fixed interval (e.g., 500 ms), and deleting the cache again.
The core problem is that it relies on a guessed time window; in real high‑concurrency scenarios request latency, network jitter, and master‑slave replication delay vary wildly, making the second delete’s timing unreliable.
Typical Cache‑Aside Flow and Why Delayed Double Delete Appears
Thread A updates the master DB.
Thread A deletes the cache.
Thread B reads the key, misses the cache, queries the still‑stale replica, gets old data, and writes it back to the cache, resurrecting stale data.
Subsequent reads keep hitting the polluted cache until it expires.
Delayed Double Delete was introduced to break this “dirty‑read‑then‑write‑back” cycle.
Four Major Drawbacks
Fixed delay is hard to control: Too short a delay leaves the replica unsynced, allowing stale data to be written back; too long a delay degrades performance and user experience.
Cannot guarantee eventual consistency: Even with a delay, reads may still fetch old data from an unsynced replica and repopulate the cache.
Second delete may fail: If the delayed task crashes or is lost, the stale cache entry persists permanently, requiring extra compensation mechanisms.
Double write load: Each update triggers two cache deletions, increasing write traffic and causing cache‑miss storms in hot‑key scenarios.
Architectural Solutions Adopted by Large Companies
Solution 1: Weak‑Consistency Binlog + Async Update (Alibaba/Meituan)
Instead of time‑based deletion, changes are captured from the MySQL binlog, sent through middleware (e.g., Canal) to a message queue, and consumed by an independent service that deletes or refreshes the corresponding cache entry.
Key steps:
All data modifications go through the master DB, generating a binlog.
Canal (or similar) captures the binlog and pushes change events to MQ.
A consumer service asynchronously deletes the affected cache key (or pre‑loads the new value).
Reliability is ensured by MQ persistence and retry mechanisms.
Advantages:
High reliability – MQ guarantees delivery.
Clear decoupling – business logic no longer handles cache directly.
Strong traceability – every cache change is logged.
Solution 2: Distributed Lock + Version Control (Strong Consistency)
For scenarios like account balance or financial transactions that require strict consistency, a distributed lock (e.g., Redis lock) serializes access to a key, and a version field (or timestamp) is stored in the DB.
Write flow:
1) Acquire lock on the key
2) Update DB and increment version
3) Delete cache
4) Release lockRead flow:
data = redis.get(key)
if not data:
fresh = db.query()
if fresh.version >= get_cached_version(key):
redis.set(key, fresh, version=fresh.version)
return fresh
return dataBenefits:
Near‑strong consistency – reads never see partially updated data.
Protection against stale writes – version check prevents old data from overwriting newer cache entries.
Drawbacks:
Lock overhead can hurt performance for high‑frequency keys.
Requires schema changes to add version fields.
Lock contention may cause timeouts or cascade failures.
Solution 3: Write‑Through Cache Proxy Layer
A unified data‑access layer (DAL) sits in front of Redis and the DB. All write requests go to the proxy, which first writes to the DB and, upon success, updates or deletes the cache (write‑through). Read requests first check the cache; if a logical‑delete marker is present, they bypass the cache and fetch fresh data from the DB, then rebuild the cache.
Key points:
Business services interact only with the proxy, hiding consistency details.
Supports persistent Redis‑compatible stores (e.g., Tendis, Pika) for added durability.
Solution 4: Logical Delete + Asynchronous Cleanup
Instead of physically deleting a key, the write operation marks the cached entry as invalid (e.g., adding is_deleted=1 or a version flag). Reads that encounter the marker bypass the cache, fetch the latest DB state, and rebuild the cache.
Asynchronous background tasks periodically scan for marked entries and delete them, freeing storage without risking stale reads.
Advantages:
No dirty‑read risk – marked entries are never served.
Lightweight – marking is an atomic Redis command, faster than deletion.
Resilient – even if cleanup fails, the marker still prevents stale data exposure.
Key Architectural Takeaways
Replace static time windows with precise event‑driven triggers to eliminate guesswork.
Match the consistency level to the business scenario: weak‑consistent high‑read workloads benefit from binlog‑driven async invalidation; strong‑consistent critical data should use locks + versioning.
Layered design (event‑driven, lock‑based, proxy, logical‑delete) allows incremental upgrades without a one‑size‑fits‑all solution.
Signed-in readers can open the original source through BestHub's protected redirect.
This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactand we will review it promptly.
Tech Freedom Circle
Crazy Maker Circle (Tech Freedom Architecture Circle): a community of tech enthusiasts, experts, and high‑performance fans. Many top‑level masters, architects, and hobbyists have achieved tech freedom; another wave of go‑getters are hustling hard toward tech freedom.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.
