在 CentOS 或 Ubuntu 系统中,Redis 与 MySQL 本身没有原生的“服务级集成”机制(即无法像主从复制那样自动同步数据)。但可以通过以下方式实现业务层面的深度集成,具体取决于你的使用场景:
一、常见集成场景与方案
✅ 场景 1:缓存层(最常用)
- 架构:应用 → Redis(缓存热点数据)→ MySQL(持久化存储)
-
实现方式:
- 在应用代码中统一处理读写逻辑(如 Spring Cache、Django-Cache、Node.js 中间件)
-
使用
Cache Aside Pattern(旁路缓存):# 伪代码示例 def get_user(user_id): data = redis.get(f"user:{user_id}") if data: return json.loads(data) data = mysql.query("SELECT * FROM users WHERE id = ?", user_id) if data: redis.setex(f"user:{user_id}", 3600, json.dumps(data)) return data - 更新时先删缓存再写 DB,避免脏读。
✅ 场景 2:实时数据同步(双写/异步同步)
⚠️ 注意:需自行保证一致性,不推荐对强一致性场景直接双写
方案 A:基于 Binlog 的异步同步(推荐)
- 工具:Canal(阿里开源)、Maxwell、Debezium
- 流程:
- MySQL 开启 binlog(
binlog_format=ROW,binlog_row_image=FULL) - Canal 监听 binlog 变化 → 解析事件
- 将变更写入 Redis(按 Key 设计策略)
- MySQL 开启 binlog(
-
部署示例(Ubuntu + Canal):
# 安装 Java & Canal sudo apt update && sudo apt install default-jdk wget https://github.com/alibaba/canal/releases/download/canal-1.1.7/canal.deployer-1.1.7.tar.gz tar -xzf canal.deployer-1.1.7.tar.gz cd canal.deployer/conf && cp example.properties.example example.properties # 修改 example.properties # canal.instance.master.address=192.168.1.100:3306 # canal.instance.filter.regex=.*\..* # 启动 Canal cd bin && ./start.sh
方案 B:应用层双写(简单但有风险)
// Spring Boot 示例
@Transactional
public void updateUser(User user) {
userRepository.save(user); // 写 MySQL
try {
redisTemplate.opsForValue().set(
"user:" + user.getId(),
user,
3600,
TimeUnit.SECONDS
);
} catch (Exception e) {
log.error("Redis write failed", e);
// 可记录到死信队列重试
}
}
✅ 场景 3:分布式锁 / 会话共享
- Redis 作为锁/Session 存储,MySQL 仅存核心业务数据
- 典型用例:秒杀、登录状态共享
- 工具:
Redlock(Redisson 实现)、Spring Session + Redis
二、运维层面集成建议(CentOS/Ubuntu)
| 项目 | 配置要点 |
|---|---|
| 防火墙 | 开放 Redis 端口(默认 6379),禁止X_X访问:sudo ufw allow from 192.168.1.0/24 to any port 6379 |
| 安全加固 | Redis:requirepass + bind 127.0.0.1MySQL:禁用远程 root,启用 SSL |
| 监控联动 | 使用 Prometheus + Grafana 同时监控两者: – redis_exporter– mysqld_exporter |
| 备份协同 | 定时脚本:先 dump MySQL → 再 save Redis → 上传 OSS/S3 |
三、重要注意事项
-
不要试图让 Redis 替代 MySQL 做事务支持
Redis 是单线程内存数据库,不支持 ACID;MySQL 才是可靠的事务引擎。 -
一致性权衡
- 高可用 > 强一致?→ 接受短暂不一致(最终一致)
- X_X/订单等场景 → 优先保证 MySQL 正确性,Redis 仅作辅助缓存
-
避免常见陷阱
- ❌ 直接
FLUSHALL清空缓存导致雪崩 - ❌ 大 Key 阻塞 Redis 主线程(用
redis-cli --bigkeys检测) - ❌ 未设置 TTL 导致缓存膨胀
- ❌ 直接
四、进阶:容器化部署(Docker Compose 示例)
# docker-compose.yml
version: '3.8'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: secure_pass
MYSQL_DATABASE: app_db
ports: ["3306:3306"]
volumes: ["mysql-data:/var/lib/mysql"]
redis:
image: redis:7-alpine
command: redis-server --requirepass rds_secure --appendonly yes
ports: ["6379:6379"]
volumes: ["redis-data:/data"]
volumes:
mysql-data:
redis-data:
配合 Canal 容器即可构建完整数据流。
如您有具体业务场景(如:电商库存扣减、用户行为分析、实时报表等),我可提供定制化集成架构设计与代码模板。
轻量云Cloud