mysql 内存表替代redis的完整方案记录

2022年 8月 30日

redis很强很轻量,但是对于结构化数据 mysql具有天然优势。

这里只记录 使用mysql内存表替代redis的一个方案,只适用于某些特殊情况

但是 mysql 内存表有几个天然缺陷 Memory不支持行锁只支持表锁,只有InnoDB支持行锁。这就导致了大并发的时候,尤其是并发写入的时候 mysql的Memory引擎效率并不高

另外Memory不支持持久化储存,在宕机重启的情况下,虽然可以导入新数据。但是如果配置了主从同步会出现更多复杂问题。

为了规避这些问题,可以在以下场景式 使用。

最后采取的理想方式:

1、分库处理,库A 所有表使用InnoDB,配置好主从同步并用户储存所有数据。库B 只有部分表从库A复制的表,且全部是内存表,不进行主从同步。

2、mysql启动的时,库A部分表数据 完整复制到库B,或者应用端在查询不到数据的时候,自动复制数据过来。

3、定时同步库B数据到库A 以持久化保存

其他要注意的:

1、频繁写入的数据,依旧还是使用redis,这是redis的天然优势

2、关闭库B的 查询缓存(没有太大必要使用)

3、大量数据非经常查询的数据,放在

先看一个创建一个表 和复制一个表的基本语法

另外一个简单的解决方法 是使用 ramdisk (tmpfs),然后使用InnoDB 或者 MyISAM即可

然后定时备份 ramdisk(最好关停mysql后备份)

CREATE TABLE `fish_api`.`mem` ( `mem` INT NOT NULL ) ENGINE = MEMORY;
CREATE TABLE targetTable LIKE sourceTable;
INSERT INTO targetTable SELECT * FROM sourceTable;
#完整代码
#DROP TABLE user_mem;
CREATE TABLE user_mem LIKE user ;
ALTER TABLE user_mem  ENGINE = MEMORY;
INSERT INTO user_mem SELECT * FROM user ;

其实需要的是 优化mysql

频繁查询 较少写入的表的查询操作 开启查询缓存 这个比较好理解

小类

http://www.leiyanhui.com/?about

Comments