解决mysql内存表的数据持久性问题

 

文章目的:

 

本文中作者讲述了一种结合snapshot快照机制和Mysql内存表来同时提供高速访问和逻辑运算的实现方法。

 

前言:

 

后台服务中往往要根据不同的需要采用不同的数据获取方案。

为了保证系统的高性能,我们一般采取下面2种方案解决

1. Cache

大多数系统都是采用各种Cache 系统来进行数据缓存的,但目前的Cache系统普遍存在的问题是仅提供了简单的数据存储,但不能提供数据组织,计算等逻辑功能。

2. 内存表

多数系统后台DB使用的是Mysql,Mysql提供一种特殊的存储引擎(HEAP),这个即是Mysql的内存表方案。但Mysql内存表不提供数据的持久性能力,DB崩溃,重启后数据即消息,这对于部分业务来说是不可接受的。

 

 

 

下面以一个简单的例子来描述这种方法:

1. 建立内存表:


  1. CREATE TABLE `t_music_list` (
  2. `Fmusic_id` varchar(12) NOT NULL default '',
  3. `Fmusic_name` varchar(64) NOT NULL default '',
  4. `Fstatus` int(11) NOT NULL default '0',
  5. `Ftry_count` int(11) NOT NULL default '0',
  6. `Flisten_count` int(11) NOT NULL default '0',
  7. `Ffee` int(11) NOT NULL default '0',
  8. `Fdesc` varchar(255) NOT NULL default '',
  9. `Fsinger_name` varchar(32) NOT NULL default '',
  10. `Fsinger_gender` varchar(6) NOT NULL default '',
  11. `Fsinger_type` varchar(16) NOT NULL default '',
  12. `Fcopy_right` int(11) NOT NULL default '0',
  13. PRIMARY KEY (`Fmusic_id`),
  14. KEY `Fmusic_name` (`Fmusic_name`,`Flisten_count`)
  15. ) ENGINE=HEAP DEFAULT CHARSET=latin1;

---这是一个歌曲库的DB例子,由于需要频繁的查询,修改,以及业务需要进行较复杂的排名搜索等逻辑操作,因此采用了这种机制。

2. 生成快照脚本 ---   snapshot_music_list.sh

 

  1. src_port=3306
  2. user='xxx'
  3. pass='xxx'
  4. FOLD='/data/t_music_list.log'
  5. dstfile='/data/t_music_list.dat'
  6. if [ -f "$dstfile" ] ;
  7. then
  8.         mv $dstfile ${dstfile}_bak
  9. fi
  10. $MYSQL >> ${FOLD} -u${user} -h${src_host} -P${src_port} -p${pass} -f -N <<!
  11. select * from myDB.t_music_list into outfile '${dstfile}';
  12. !
  13. filezize=`du -b $dstfile| awk '{print $1}'`
  14. if [ $filezize -lt 2048 ] ;
  15. then
  16.         echo "Dest file too slow, recover it by backedfile."
  17.         mv ${dstfile}_bak $dstfile
  18. fi

---用crontab 定时执行

  1. */5 * * * * /usr/local/app/tools/ snapshot_music_list.sh >/dev/null 2>

3. mysql启动时进行数据恢复   启动时执行恢复脚本,恢复脚本负责将快照数据重新导入DB

数据恢复脚本 ---initdb.sql

  1. load data infile '/data/t_music_list.dat' into table myDB.t_music_list;

mysql启动配置    --- my.cnf

[mysqld]

init-file       = /usr/local/app/tools/initdb.sql

 

 

通过上面的配置,我们即可实现既保证数据获取速度,也能保证逻辑运算简化的机制。实际使用中这种方式由于实现简单,且有效,等到了较广的应用,希望对大家有所帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
保证Redis和MySQL数据的一致性是一个复杂的问题,可以采取以下几个方面的策略来处理: 1. 数据写入的同步:在应用程序中,对数据进行写入操作时,需要保证先更新MySQL,再更新Redis,确保数据的一致性。可以使用事务来实现这一点,即将MySQL和Redis的更新操作放在同一个事务中进行,保证原子性。 2. 数据读取的同步:在应用程序中进行数据读取时,可以先从Redis中查询数据,如果没有命中,则从MySQL中读取,并将读取到的数据重新写入Redis中,以便下次查询时从Redis中获取。这样可以提高读取性能,并保证数据的一致性。 3. 定期数据同步:可以通过定时任务或者触发器定期将MySQL中的数据同步到Redis中,以保证Redis中的数据MySQL中的数据保持一致。可以根据业务需求,设置合适的同步频率。 4. 异步数据同步:可以使用消息队列等方式,将MySQL中的数据变更操作异步地发送给Redis进行更新。这样可以避免直接在应用程序中同步操作对性能的影响,并提高系统的可扩展性。 5. 监控和故障处理:监控Redis和MySQL的状态,如主从同步、连接状态等,并及时处理故障情况,以防止数据不一致的问题。 需要注意的是,尽管采取了一些策略来保证Redis和MySQL数据的一致性,但由于Redis是内存数据库,数据持久化可能会受到影响。因此,在系统设计和架构中,需要根据具体场景和业务需求来权衡使用Redis的优势和局限性,并做出合适的决策。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值