流程:
1.设计并创建数据库;
2.编写操作数据库接口;
3.修改业务数据存储逻辑,按照先写入mysql再写reids的方式;拉取时如果在reids中找不到数据,就查找mysql;
4.迁移数据;
5.测试
注意事项:
1.在按照每一个redis-key对应一个mysql-table的原则下,需要有一个能够将所有数据归入一个database的聚合根,即分库分表的key;
2.关联表需要设置联合索引,确保数据唯一性;
3.在编写数据迁移脚本的时候需要考虑到脏数据的情况,做容错处理;
4.由于数据量过大,按照百库百表来计算,至少会包含10w张table,所以需要尽可能的精简插入语句,我的做法的是事先遍历redis-key,按照database=>table=>query的方式构造一个php数组,原则上每一张表就只有一条插入语句,然后遍历数组进行插入操作;
5.在mysql配置中,一次性插入量最大为16M,批量插入时,会遇到一次性插入量大于16M,这时候需要修改mysql配置,修改方法如下:
(1)连接mysql,执行set global max_allowed_packet = 500*1024*1024;(设置最大插入量为500M);
(2)重启mysql,执行show VARIABLES like '%max_allowed_packet%';查看是否修改成功;
6.在编写数据迁移脚本的时候需要进行对数据中转义符的处理;
7.发布服务时,需要先发布服务,然后再导入数据,在导入数据时,可能会遇到同时在redis和mysql中写入数据,导致数据重复,因此在数据迁移脚本中,需要考虑使用replace而不是insert;
8.将业务数据插入数据库时,需要考虑到转义符的问题,例如"query << "这是'一条插入语句" << endl;"插入数据库会报错,因为包含单引好,另外,插入语句中包含的"\"会被转义吞掉,所以需要在插入语句之前进行转义,mysqlpp中有一个mysqlpp::escape方法,例如:
query << mysqlpp::escape << "这是'一条插入语句" << endl;