侧边栏壁纸
博主头像
数据渔港

点亮对生活的好奇心

  • 累计撰写 37 篇文章
  • 累计创建 78 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Halo博客H2数据库迁移MySQL+Redis

数据渔港
2026-03-22 / 0 评论 / 0 点赞 / 1 阅读 / 1,080 字
温馨提示:
本文最后更新于 2026-03-22,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

使用Halo博客搭配MySQL+Redis缓存的架构,核心是提升性能、保障数据安全、优化用户体验,相比Halo默认的H2嵌入式数据库(无缓存),优势非常明显,在迁移之前使用的是H2自带数据库,文件损坏后数据无法恢复很鸡肋,下面我会从新手易懂的角度,拆解具体好处和适用场景

MySQL+Redis

  • 数据更安全

MySQL是成熟的关系型数据库,支持事务、主从备份、定时快照,即使服务器意外宕机,数据丢失风险远低于H2(H2单文件损坏就可能导致数据全丢)。

  • 支持高并发大数据量

当博客文章、评论、访问量增多时,H2的查询性能会快速下降,而MySQL针对复杂查询做了大量优化,能高效处理上万篇文章、百万级访问记录的读写请求。

  • 便于数据迁移管理

MySQL支持标准SQL,你可以用Navicat、phpMyAdmin等工具可视化管理数据,也能轻松迁移到其他服务器(H2迁移需额外转换格式)

Redis缓存解决访问速度问题

Redis是内存数据库,把Halo高频访问的数据(比如首页文章列表、热门文章、用户登录状态)缓存到内存中,而非每次都从MySQL读取,核心优势:

  • 访问速度提升10~100倍

存读写速度(Redis)远快于磁盘读写(MySQL),用户打开博客首页、浏览文章时,响应时间从几百毫秒缩短到几毫秒,彻底避免页面加载卡顿。

  • 减轻MySQL压力

博客80%的访问请求都是「读操作」(比如用户看文章、翻列表),这些请求直接从Redis取数据,MySQL只需处理20%的写操作(发布文章、评论),避免MySQL因高并发读请求被打满。

  • 支持热点数据缓存/过期策略

比如缓存「近7天热门文章」,并设置自动过期更新;缓存用户登录Token,避免每次请求都验证密码,提升登录体验。

整体架构的协同优势

  • 高可用:MySQL做主从备份,Redis做集群,即使单节点故障,博客仍能正常运行
  • 可扩展:后续博客访问量增长,可单独扩容Redis内存、MySQL服务器,无需重构整体架构
  • 用户体验更好:页面加载快、无卡顿,搜索引擎也更青睐响应速度快的网站(间接提升SEO)

H2迁移MySQL+Redis

  • Halo 管理后台导出数据

image-20260322110542216

配置docker-compose


#切换到当前目录执行
docker-compose up -d

#配置文件
version: "3"

services:
halo_server:
image: halohub/halo:1.6.0
container_name: halo_server
restart: on-failure:3
depends_on:
- halo_mysql
- halo_redis
networks:
halo_network:
volumes:
- ./:/root/.halo
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "8090:8090"
environment:
- SERVER_PORT=8090
- SPRING_DATASOURCE_DRIVER_CLASS_NAME=com.mysql.cj.jdbc.Driver
- SPRING_DATASOURCE_URL=jdbc:mysql://halo_mysql:3306/halodb?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
- SPRING_DATASOURCE_USERNAME=root
- SPRING_DATASOURCE_PASSWORD=o#DwN&JSa56
- HALO_ADMIN_PATH=admin
- HALO_CACHE=redis
- SPRING_REDIS_PORT=6379
- SPRING_REDIS_DATABASE=0
- SPRING_REDIS_HOST=halo_redis
- SPRING_REDIS_PASSWORD=dm5fD%rvPtq

halo_mysql:
image: mysql:8.0.27
container_name: halo_mysql
restart: on-failure:3
networks:
halo_network:
command: --default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
volumes:
- /etc/localtime:/etc/localtime:ro
- ./mysql:/var/lib/mysql
- ./mysqlBackup:/data/mysqlBackup
ports:
- "3306:3306"
environment:
# 请修改此密码,并对应修改上方 Halo 服务的 SPRING_DATASOURCE_PASSWORD 变量值
- MYSQL_ROOT_PASSWORD=o#DwN&JSa56
- MYSQL_DATABASE=halodb

halo_redis:
image: redis
container_name: halo_redis
restart: on-failure:3
networks:
halo_network:
volumes:
- ./redis/data:/data
- ./redis/logs:/logs
# 请修改此密码,并对应修改上方 Halo 服务的 SPRING_REDIS_PASSWORD 变量值
command: redis-server --requirepass dm5fD%rvPtq
ports:
- "6379:6379"
networks:
halo_network:

访问站点重新初始化

-上传步骤1导出的Json数据文件

img

image-20260322111057646

附件上传覆盖

  • 上传upload文件

image-20260322111342091

###初始化完成数据迁移

  • 后台界面

image-20260322111221076

  • 首页界面

image-20260322111803076

0

评论区

ip); ?>