随着数据量的不断增加,数据库的压力会逐渐增加,打开的速度会越来越慢,甚至出现数据库的slow-query,即使已经建立了完善的索引.
这个时候我们通常会采取几种方法来减轻数据库的压力:
读写分离,采取mysql的master,slaver方式将数据库的读写操作分离开,以达到数据库的减压.
另外一种是添加一张中间表,所有写入的数据都直接写入这张中间表,之后再通过定时程序或其它方法在系统闲时将数据导入相应的数据表,以达到减压的效果.
今天我们要说到的方法与第二种中间表的形式类似,只不过是用memcached替换中间表,将每一个个体的所有相关属性,内容组合成数组,存入到memcached中,在此个体没有被完整存储的时候,所有的对于它的读取,修改,删除,添加内容等等操作都将在memcached中进行,充分利用memcached快速读写特性.
由于memcached不是永久性存储,在我们使用memcached做中间存储介质时需要考虑数据的安全性,防止memcached出现意外造成数据丢失,需要多台memcached服务器,参考mysql的master,slaver模式,对数据的写入,修改,删除要同时保证所有服务器同时操作,读取可以随机从其中一台读取.
需要注意的是在每个memcached中的完整数组需要有一个lock的值,标记它的状态,当我们的定时程序读取的时候要标记所有服务器里相同key的lock值为锁定状态,此时即使前台命中这个缓存也只能是只读状态,保证数据的一致性.
数据的转存,可以采用php模拟daemon的方式或cron定时的方式将memcache中的缓存存储到mysql中,实现永久保存,当数据被存储到数据库中剩下的就是常规的读取缓存,缓存命中与未命中的常规逻辑了.
大概的思想就是这样了,先说一下这样做的优点:
1.    使用memcache做中间存贮,速度快,效率高,充分利用memcached的优点
2.    读写方便,不需要修改原有的数据模型,不用修改数据库结构
3.    不用改变现有的生产环境,不需要添加额外的功能支持,通过现有的LAMP即可实现
不足,缺点:
1.    对于成型的项目来说,修改量可能比较大,需要对业务的流程有非常熟悉的了解
2.    memcached并非持久存储,有一定的数据丢失风险,可以通过master,slaver的方式增加可靠性
3.    由于memcache的没有不提供搜索功能,当数据量较大时搜索的效率会比较低.可以通过对存入的key进行哈希索引的方式创建php搜索功能,提高效率
4.    对内存的需求量比较高,可以通过修改转存程序的频率和速度来维持内存使用量在一个可控范围内

现在nosql的概念很流行,例如:mongodb,couchdb等.这个想法其实也是借鉴了nosql的方式,通过php+mysql+memcached来模拟一个非关系型数据库,以解决前面提到的数据量增加,传统数据库难以解决的
1.    高并发读写的需求
2.    高效的存储访问需求
同时为那些不方便在现有环境下安装新的应用扩展,或权限较低的情况提供一种解决方案和想法.
在这里只是简单的说了一下我的想法,至于具体如何实现对不同的项目会有不同的需求和具体的解决方案.后面会跟大家分享我的实际使用中的各种问题和经验的^~^