# Redis Cache Demo 一个完整的 Kubernetes 应用示例,展示 Redis 缓存的使用,支持自动读写分离和重连。 ## 功能特性 - ✅ 自动识别 Kubernetes Headless Service - ✅ Master-Replica 读写分离 - ✅ 自动重连机制(每10秒检测) - ✅ HTTP API 接口 - ✅ 健康检查 - ✅ 完整的 K8s 部署配置 ## 架构设计 ``` ┌─────────────────┐ ┌─────────────────┐ │ App Pod #1 │ │ App Pod #2 │ │ (Read/Write) │ │ (Read/Write) │ └─────────┬───────┘ └─────────┬───────┘ │ │ └──────────┬───────────┘ │ ┌────────────────┴─────────────────┐ │ Redis Cluster │ │ ┌─────┐ ┌─────┐ ┌─────┐ │ │ │Pod-0│ │Pod-1│ │Pod-2│ │ │ │Master│ │Replica││Replica│ │ │ └─────┘ └─────┘ └─────┘ │ └─────────────────────────────────┘ ``` ## 快速开始 ### 1. 部署 Redis 集群 ```bash chmod +x deploy.sh ./deploy.sh ``` 这将创建: - 3个 Redis Pod(1个master + 2个replica) - Headless Service(用于自动发现) - LoadBalancer Service(用于外部访问) ### 2. 构建和部署应用 ```bash # 构建镜像 docker build -t redis-cache-demo:latest . # 部署应用 kubectl apply -f k8s/app.yaml # 等待应用就绪 kubectl wait --for=condition=ready pod -l app=redis-cache-demo -n redis-cache-demo --timeout=120s # 获取服务地址 kubectl get svc redis-cache-demo -n redis-cache-demo ``` ### 3. 测试 API 获取服务地址后,替换 `` 进行测试: ```bash # 健康检查 curl http:///health # 设置缓存 curl -X POST http:///api/cache/test -H 'Content-Type: application/json' -d '{ "value": "hello world", "expires_in": 300 }' # 获取缓存 curl http:///api/cache/test # Hash 操作 curl -X POST http:///api/hash/user:1/name -H 'Content-Type: application/json' -d '{"value":"张三"}' curl http:///api/hash/user:1/name # 计数器 curl -X POST http:///api/counter/visits/inc # 测试重连 curl -X POST http:///api/test/reconnect ``` ## API 文档 ### 基础缓存操作 | Method | Path | Description | |--------|------|-------------| | GET | `/api/cache/:key` | 获取值 | | POST | `/api/cache/:key` | 设置值 | | DELETE | `/api/cache/:key` | 删除键 | ### Hash 操作 | Method | Path | Description | |--------|------|-------------| | GET | `/api/hash/:key/:field` | 获取字段值 | | POST | `/api/hash/:key/:field` | 设置字段值 | | GET | `/api/hash/:key` | 获取所有字段 | ### 计数器 | Method | Path | Description | |--------|------|-------------| | POST | `/api/counter/:key/inc` | 计数器+1 | | POST | `/api/counter/:key/inc/:value` | 计数器+指定值 | ### 系统功能 | Method | Path | Description | |--------|------|-------------| | GET | `/health` | 健康检查 | | POST | `/api/test/reconnect` | 测试重连功能 | ## 环境变量配置 | 变量名 | 默认值 | 说明 | |--------|--------|------| | `PORT` | 8080 | HTTP 服务端口 | | `REDIS_ADDR` | - | Redis 地址(支持 headless service) | | `REDIS_PASSWORD` | "" | Redis 密码 | | `REDIS_RECONNECT` | true | 是否启用自动重连 | | `REDIS_RECONNECT_INTERVAL` | 10s | 重连检测间隔 | ## 观察读写分离 在多个终端中监控 Redis 请求分布: ```bash # 监控 master(写操作) kubectl exec -it redis-0 -n redis-cache-demo -- redis-cli monitor # 监控 replica(读操作) kubectl exec -it redis-1 -n redis-cache-demo -- redis-cli monitor kubectl exec -it redis-2 -n redis-cache-demo -- redis-cli monitor ``` 执行应用 API 操作,观察请求如何分布到不同的 Redis 实例。 ## 重连测试 1. 重启 Redis Pod: ```bash kubectl delete pod redis-1 -n redis-cache-demo ``` 2. 继续调用 API,观察自动重连日志: ```bash kubectl logs -f deployment/redis-cache-demo -n redis-cache-demo ``` ## 本地开发 使用内存缓存进行本地测试: ```bash export REDIS_ADDR="" go run main.go ``` 使用本地 Redis: ```bash export REDIS_ADDR="localhost:6379" go run main.go ```