通过redis内存数据库加速数据拼接过程

工作   417阅读

近期,在公司的一个项目中,有将远程oracle数据库中的大量数据抓过来,然后存在本地的mysql数据库中。在存本地mysql的过程,是按照递归的方式按规律生成数据,一次操作大约有35000条数据,在最开始完成的版本中,按照从oracle中读一条立刻写一条到mysql中,这样的循环执行完毕的时间大约20分钟。

在企业中,实际上一次操作持续20分钟,业务人员也可以接受,毕竟这次刚完成的程序,主要是要解决从无到有的问题。在时间允许的情况下,我还是打算优化一下。

实际上,我们可以感觉到这样的循环过程时间漫长,甚至进程假死,原因大概在告诉的内存运算速度与磁盘读写速度以及网络延时上的不匹配导致的。

那么,在这个项目的优化过程中,我打算将远程oracle的数据一次性全部读到本地内存中,避免成千上万次读取远程oracle的操作。

在php程序中,可以定义一个数组变量来存从远程oracle中读过来的批量数据,这样一个变量大约占4M内存空间,在循环中传递这么大的一个变量应该不是一个好的主意,尤其是要上万次的循环,我想这样会导致内存爆掉的,尽管我没有测试。

因此,我想到了通过内存数据库,来临时存储这些从oracle中读过来的批量数据。

redis,之前常常听说在应用的cache、session等的存储上使用的很广泛,尤其是在存session时,效果要比临时文件要好。

先下载redis,百度搜索到redis官网,下载源代码,在linux下make安装。

在redis.conf文件中设置daemonize=yes,然后启动redis,这样是的redis-server在后台进程运行。

php需要暗中redis扩展,直接在github上下载源码,编译即可。

php代码中使用redis就比较容易了。

$redis=new redis();

$redis->connect('127.0.0.1',6379);

$redis->set('foo','bar',80000);

$redis->get('foo');

$redis->close();

在使用redis作为中间转存之后,程序的性能提升了40倍,现在执行的时间大约30秒,这样就比较满意了。


这次开发,是在前面提到的尝试linux系统中通过odbc链接HANA数据库,遇到了字符集编码的问题,中文乱码。后来放弃了通过php操作hana数据库的方式。

在项目进度紧逼的情况下,也来不及去找承包商,只有我自己来开发,从技术上来讲,为了将数据处理的性能加快,在无法使用hana内存数据库的情况下,仍然取得了比较好的效果。

首先,通过mysql字段加索引,解决了批量update时性能缓慢的问题。

然后,通过引入redis内存数据库,解决了在抓取远程oracle数据的过程中频繁读库花费较长时间的问题。

使用centos作为web服务器,保证了服务的稳定。

采用php作为开发语言,灵活、快速开发。

从开发的角度来讲,要有丰富的开发经验,平时打好基础,在任务面前才能接受考验。

从企业的角度来讲,需要员工的责任心比较强,高效高质量完成任务。

不过话说回来,做了这个项目,除了redis是新鲜的,其他的都是常规经常用到的。

喜欢请常来,打赏请随意。