Redux Toolkit 2.9.0 - Deep Dive into RTK Query Enhancements & Updates

February 5, 2026

Understanding Redux Toolkit 2.9.0 Update

The Redux Toolkit 2.9.0 release focuses primarily on optimizing RTK Query performance, streamlining asynchronous request management, and reducing resource overhead in large-scale applications.

While this update doesn't fundamentally change the core API, it significantly improves the logic "under the hood," directly impacting application speed and stability.

⚡ RTK Query Performance Enhancements

To understand this update, we must first look at how RTK Query handles data. When you use a hook like useGetUsersQuery() in multiple components, RTK Query creates a subscription.

A subscription means a component is "subscribed" to a specific cache entry, notifying Redux that it needs to stay updated whenever that data changes.

🔁 The Issue Pre-v2.9.0

Before this release:

  • Every new component using the same query created its own subscription instance.
  • With every new subscription, RTK Query would re-calculate the polling interval from scratch.
  • If 10 components shared the same query, polling calculations might run 10 times redundantly.

This behavior caused unnecessary CPU overhead, especially in complex dashboards or data-heavy applications.

✅ The Solution in v2.9.0

This version optimizes subscription management as follows:

  • Polling intervals are no longer recalculated when adding a new subscription to an existing query.
  • A single, centralized polling timer is maintained for each cache entry.
  • New subscriptions simply "attach" to the existing timer instead of triggering new calculations.

The Result: Higher performance, fewer operations, and lower resource consumption.

📦 Switching from Record to Map

Internally, RTK Query previously used standard JavaScript objects (Record<string, value>) to store subscriptions.

In v2.9.0, this was replaced with Map because:

  • Map is significantly faster for additions and deletions with large datasets.
  • It eliminates the need to convert keys to strings, unlike standard objects.
  • It is more memory-efficient for managing dynamic data like active subscriptions.

Though an internal change, it provides a noticeable performance boost for enterprise-scale projects.

🧠 Optimized useStableQueryArgs

The useStableQueryArgs hook previously relied on serializing arguments into a JSON string for comparison.

The drawbacks were:

  • Serializing large objects is computationally expensive.
  • It occurred even if the data hadn't actually changed.

Now, RTK Query prioritizes reference checks over serialization, drastically reducing unnecessary calculations.

🚫 Automatic Request Cancellation via AbortSignal

Prior to v2.9.0, if a cache entry was removed, an ongoing network request might continue until it finished.

Now:

  • When a cache entry is fully unmounted/removed, an AbortSignal is sent.
  • The network request is cancelled immediately if it is still pending.

This prevents wasting bandwidth and processing power on requests that are no longer needed.

🛠️ Introducing builder.addAsyncThunk

This update introduces a cleaner way to handle async logic: builder.addAsyncThunk.

Instead of chaining multiple addCase calls for a single thunk, you can now group the lifecycle states:


builder.addAsyncThunk(fetchUser, {
  pending(state) {
    state.loading = true;
  },
  fulfilled(state, action) {
    state.loading = false;
    state.user = action.payload;
  },
  rejected(state) {
    state.loading = false;
    state.error = true;
  }
});
            

This makes the code: Cleaner, more concise, and easier to maintain.

📌 Why This Update Matters

  • Significant performance gains in RTK Query.
  • Reduced unnecessary operations and CPU cycles.
  • Better management of asynchronous requests.
  • Improved developer experience (DX) for large-scale applications.