🚀 Redis + ABP vNext 构建分布式高可用缓存架构
🔧 环境准备
-
开发环境
- .NET 8.0 SDK
- Visual Studio 2022 / VS Code
- Docker & Docker Compose
-
NuGet 包
Volo.Abp.Caching.StackExchangeRedis v8.1.5
Volo.Abp.DistributedLocking.StackExchangeRedis v8.1.5
Volo.Abp.EventBus.Distributed.Redis v8.1.5
Polly v7.2.3
-
Global using
using System; using System.Threading.Tasks; using Microsoft.Extensions.Caching.Distributed; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Polly; using StackExchange.Redis; using Volo.Abp; using Volo.Abp.Caching; using Volo.Abp.Caching.StackExchangeRedis; using Volo.Abp.DistributedLocking; using Volo.Abp.DistributedLocking.StackExchangeRedis; using Volo.Abp.EventBus.Distributed; using Volo.Abp.EventBus.Distributed.Redis;
项目结构示例
src/ ├─ MyApp/ │ ├─ MyAppModule.cs │ ├─ Program.cs │ └─ Services/ │ └─ ProductService.cs └─ test/ └─ MyApp.Tests/ └─ CacheTests.cs
📚 目录
1️⃣ 背景与需求 🎯
分布式微服务场景下,缓存可显著提升性能和降低数据库压力,但需解决:
- 🔄 多节点更新 导致数据不一致
- 💥 热点缓存失效 引发击穿
- 🔄 节点扩缩容 后本地缓存未命中
量化场景:
- QPS:10,000 req/s
- 读写比:95% 读 / 5% 写
- 缓存命中率目标:>95%
需求:构建 高可用、高性能、可复现 的缓存系统。
2️⃣ 架构设计:ABP vNext + Redis 分布式缓存
- 🗝️ Redis 统一缓存源
- 📣 Pub/Sub / 分布式事件广播失效
- 🔁 本地
IMemoryCache
+ 分布式IDistributedCache
二级缓存
3️⃣ 搭建 Redis 集群(Sentinel & Cluster)
🔹 Sentinel HA 示例(docker-compose.yml)
version: '3'
services:
redis-master:
image: redis:6.2
volumes:
- ./redis-master.conf:/usr/local/etc/redis/redis.conf
command: redis-server /usr/local/etc/redis/redis.conf
ports: ["6379:6379"]
redis-slave:
image: redis:6.2
command: redis-server --slaveof redis-master 6379
ports: ["6380:6379"]
sentinel-1:
image: redis:6.2
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
ports: ["26379:26379"]
# 同理配置 sentinel-2、sentinel-3 …
sentinel.conf:
sentinel monitor mymaster redis-master 6379 2 sentinel auth-pass mymaster <password>
🔹 Cluster 分片示例
version: '3'
services:
redis-node-1:
image: bitnami/redis-cluster:6
environment:
- REDIS_PASSWORD=yourpassword
ports: ["7000:7000","7001:7001"]
# 至少 6 个节点...
集群创建:
docker exec -it <container> \ redis-cli --cluster create \ 127.0.0.1:7000 127.0.0.1:7001 ... \ --cluster-replicas 1 --cluster-yes
4️⃣ Program.cs 最小示例
🚀 启动流程示意图
var builder = WebApplication.