使用 Redis 发布/订阅实现缓存失效
探索如何使用 Redis 发布/订阅,在多个应用实例之间实时使缓存失效
使用 Redis 发布/订阅实现缓存失效 是 CoddyKit 上的免费 Caching Strategies: Redis + CDN + Edge Computing 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Caching Strategies: Redis + CDN + Edge Computing 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Caching Strategies: Redis + CDN + Edge Computing 课程共包含 4 节课。
本课时的部分内容尚未翻译,以英文显示。
Real-time Cache Updates
Imagine you have multiple copies of your application running, all using a local cache. When data changes in the database, how do you tell all these application instances to update their caches immediately?
Redis Publish/Subscribe (Pub/Sub) is a powerful messaging pattern that allows you to send real-time notifications to multiple clients, making it perfect for distributed cache invalidation.
Beyond Time-To-Live (TTL)
While Time-To-Live (TTL) is great for automatically expiring old data, it doesn't guarantee instant freshness. If critical data changes, you don't want to wait for the TTL to expire.
Pub/Sub provides a way to force immediate invalidation. When data is updated in your primary data store (like a database), one application instance can broadcast a message, and all other instances listening will receive it and invalidate their specific cache entries.
The Publisher Role
In the Pub/Sub model, a Publisher is an entity (like one of your application instances) that sends messages to a specific channel.
- When a significant data change occurs (e.g., a product's price is updated in the database), the application instance that made the change acts as a publisher.
- It doesn't care who receives the message, only that it's sent to the designated channel.
The Subscriber Role
A Subscriber is an entity (another application instance) that listens for messages on one or more specific channels.
- All other application instances would be subscribers to the 'cache-invalidation' channel.
- When a message arrives on a channel they're subscribed to, they receive it and can then react, for example, by removing the corresponding item from their local cache.
Redis Pub/Sub Commands
Redis provides two main commands for Pub/Sub:
PUBLISH channel message: Sendsmessageto the specifiedchannel. All subscribers to that channel will receive it.SUBSCRIBE channel [channel ...]: This client subscribes to one or more channels. Once subscribed, it will continuously listen for messages.
Remember, Pub/Sub messages are fire-and-forget; Redis doesn't store them.
Publishing a Cache Invalidation
Here's how an application instance can publish an invalidation message using Java and the Jedis client. This example sends a message to invalidate a specific product.
import redis.clients.jedis.Jedis;
public class CachePublisher {
public static void main(String[] args) {
// Connect to Redis (default localhost:6379)
Jedis jedis = new Jedis("localhost", 6379);
String channel = "product-updates";
String message = "invalidate:product:456"; // Key to invalidate
// Publish the message
jedis.publish(channel, message);
System.out.println("Published: '" + message + "' to channel '" + channel + "'");
// Close the connection
jedis.close();
}
}Setting Up a Cache Subscriber
Subscribers use a special listener class to handle incoming messages. The onMessage method is where your invalidation logic goes.
Note: The jedis.subscribe() call is blocking and keeps the connection open to listen. In a real app, this runs in a dedicated thread.
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub;
public class CacheSubscriberSetup {
public static void main(String[] args) {
System.out.println("Preparing Redis Pub/Sub subscriber...");
// Define your listener logic
JedisPubSub listener = new JedisPubSub() {
@Override
public void onMessage(String channel, String message) {
System.out.println("Received: '" + message + "' on channel '" + channel + "'");
// Here, you would implement your cache invalidation logic
// e.g., myLocalCache.remove(message.split(":")[1]);
}
@Override
public void onSubscribe(String channel, int subscribedChannels) {
System.out.println("Successfully subscribed to: " + channel);
}
// Other methods like onUnsubscribe, onPMessage, etc., can be overridden
};
// In a real application, you'd run:
// try (Jedis jedis = new Jedis("localhost", 6379)) {
// jedis.subscribe(listener, "product-updates"); // This blocks!
// }
System.out.println("Subscriber listener defined. To truly listen, run a blocking subscribe call.");
System.out.println("This runnable example exits to demonstrate setup.");
}
}End-to-End Invalidation Flow
Let's see the full picture:
- App A updates a product in the database.
- App A publishes an invalidation message ('invalidate:product:456') to the 'product-updates' channel in Redis.
- Redis receives the message and broadcasts it to all clients subscribed to 'product-updates'.
- App B, App C (and App A itself if subscribed) receive the message.
- Each app's subscriber logic removes 'product:456' from its local cache, ensuring fresh data on next request.
Designing Invalidation Messages
What should you include in your invalidation message?
- Specific Key: 'invalidate:user:123' is ideal for precise invalidation.
- Category: 'invalidate:all:products' for broader invalidation (use with caution).
- Timestamp/Version: Can help subscribers decide if their cached data is older than the update.
Keep messages concise. Subscribers should have enough info to know what to invalidate.
Pros and Cons of Pub/Sub
Benefits:
- Real-time: Immediate cache updates across instances.
- Decoupled: Publishers don't need to know about subscribers.
- Scalable: Redis handles message distribution efficiently.
Considerations:
- No Persistence: If a subscriber is offline, it misses messages.
- At-Most-Once: Redis Pub/Sub doesn't guarantee delivery. For critical systems, consider other messaging patterns or a combination.
Pub/Sub Invalidation Quiz
You've learned how Redis Pub/Sub helps with real-time cache invalidation. Let's test your understanding!
Pub/Sub for Fresh Data
Great job! You've explored how Redis Publish/Subscribe is a vital tool for maintaining data freshness in distributed caching environments.
- Pub/Sub allows real-time broadcasting of invalidation messages.
- Publishers send messages, and subscribers listen to channels.
- This pattern enables immediate cache updates across all application instances when data changes, improving consistency and user experience.
- While powerful, remember its 'fire-and-forget' nature and consider persistence needs for critical systems.
常见问题解答
「使用 Redis 发布/订阅实现缓存失效」课时是免费的吗?
是的 — 「使用 Redis 发布/订阅实现缓存失效」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Caching Strategies: Redis + CDN + Edge Computing 课程的其余内容,请升级到 CoddyKit PRO。 Caching Strategies: Redis + CDN + Edge Computing 课程共包含 4 节课。
「使用 Redis 发布/订阅实现缓存失效」这节课中我会学到什么?
探索如何使用 Redis 发布/订阅,在多个应用实例之间实时使缓存失效 你通过在浏览器中直接运行的动手代码来练习 Caching Strategies: Redis + CDN + Edge Computing,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Caching Strategies: Redis + CDN + Edge Computing 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Caching Strategies: Redis + CDN + Edge Computing 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「使用 Redis 发布/订阅实现缓存失效」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Caching Strategies: Redis + CDN + Edge Computing 课中编写并运行代码吗?
能。每节 Caching Strategies: Redis + CDN + Edge Computing 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- Redis 持久化与 HA
- 使用 Redis 实现分布式缓存
- 使用 Redis 发布/订阅实现缓存失效
- Redis 集群与分片