应用Redis读写数据,使用队列处理器定时向mysql写入数据。同时注意避免冲突。当redis启动时,去mysql读取所有的表键值,存入redis。向redis写入数据时,会自增读取redis主键。如果mysql更新失败,需要清空缓存,同步redis主键。这种处理方式主要是实时读写redis,而mysql数据通过队列异步处理,减轻mysql的压力。但是这种方式的应用场景主要以高并发为主,redis的高可用集群架构相对复杂一些,一般不推荐使用。redis如何与mysql数据库同步【方案一】http://www.zhihu.com/question/23401553?sort=created程序实现mysql更新、增删改查redis数据。程序查询redis,不存在则查询mysql,并保存rediredis和mysql数据的同步。代码层面大致可以这样:读:读redis->no,读mysql->写mysql数据回redi写:写mysql->success,写redis(捕获所有mysql修改,写删除事件,操作redis)[方案二]http://www.linuxidc.com/Linux/2015-01/380.htm实时获取mysqlbinlog进行分析,然后修改rediMySQL转Redis数据方案,无论是MySQL还是Redis,都有其自己的数据同步机制,比如比较常用的MySQLMaster/Slave模式,是通过在Slave端分析Master的binlog来实现的。这样的数据其实还是一个异步过程,但是当服务器都在同一个内网时,异步延迟几乎可以忽略不计。理论上我们也可以用同样的方法分析MySQL的binlog文件,将数据插入到Redis中。但是这需要对binlog文件和MySQL有非常深刻的理解。同时,由于binlog有Statement/Row/Mixedlevel多种形式,分析binlog实现同步的工作量非常大。因此,这里选择了一种开发成本较低的方法,借用相对成熟的MySQLUDF,先将MySQL数据放入Gearman,然后通过自己写的一个PHPGearmanWorker将数据同步到Redis。与分析binlog的方式相比,增加了很多流程,但是实现成本更低,更易操作。【方案三】使用mysql的udf。详见MySQL::MySQL5.1参考手册::22.3MySQL新增功能,然后使用trigger在tableupdate和insert后调用函数,写入redis。大致是这样的。[http://www.zhihu.com/question/27738066]1.首先要明确缓存是否有必要,当前架构的瓶颈在哪里,如果真的是数据库操作的瓶颈,然后继续往下看。2.弄清楚memcached和redis的区别,该用哪个。前者毕竟是缓存,不可能完全保存数据(LRU机制),支持分布式,而后者不仅支持缓存还支持数据持久化到磁盘等,redis要自己实现分布式缓存(貌似***版本已经集成),自己实现一致性hash。因为不知道你的应用场景,所以不好说一定要用memcache还是redis。可能用mongodb比较好,比如存储日志。3.缓存量大但不经常变化的数据,比如评论。4、你的思路正确、清晰。在读取DB之前,先读取缓存。如果有,直接退货。如果没有,则重新读取DB,然后写入缓存层并返回。5、考虑是否需要主从、读写分离,是否需要分布式部署,是否需要后续横向扩展。6、如果想一劳永逸,方便后续的维护和扩展,那就优化现有的代码结构。按照你说的,替换数据库组件需要大量的代码改动,说明目前的结构存在问题。您可以使用一些现有的框架,例如SpringMVC,将您的应用程序层与业务层和数据库层解耦。在进入缓存之前执行这些操作。7、将读缓存等操作做成服务组件,为业务层提供服务,业务层为应用层提供服务。8、保留原有数据库组件,优化为服务组件,方便后续业务层灵活调用缓存或数据库。9、不建议一次性全部上传缓存。一开始,核心业务不能动。可以先将边缘业务替换成缓存组件,再逐步切换到核心业务。10、刷新内存,以memcached为例,增、改、删操作一般采用懒加载策略,即新增时只写入数据库,不会立即更新Memcached,而是等到读取时再更新再次加载到Memcached中,修改和删除操作也会更新数据库,然后将Memcached中的数据标记为无效,等待下一次读取再次加载。
