如何用redis/memcache做Mysql缓存层

时间:2017.07.16 发布人:eguax

如何用redis/memcache做Mysql缓存层

已解决问题

谷歌eguax用户在2017.07.16提交了关于“暗物质如何用redis/memcache做Mysql缓存层”的提问,欢迎大家涌跃发表自己的观点。目前共有1个回答,最后更新于2024-10-24T03:54:31。希望大家能够帮助她。

详细问题描述及疑问:期待您的答案,谢谢你帮我,祝你快乐,愿你事事如意 !

希望以下的回答,能够帮助你。

第1个回答

用户名:gaoqiuh  

1、首先明确是不是一定要上缓存,当前架构的瓶颈在哪里,若瓶颈真是**库操作上,再继续往下看。

2、明确memcached和redis的区别,到底要使用哪个。前者终究是个缓存,不可能永久保存**(LRU机制),支持分布式,后者除了缓存的同什支持把**持久化到磁盘等,redis要自来自己去实现分布式缓存(坚程侵注己席慢貌似最新版本的已集成),自己去实现一致性hash。因为不知道应用场景,问答不好说一定要用memcach土肥九论待准操非e还是redis,说不定用mongodb会更好,比如在均存储日志方面。

3、缓存量大但又行临操旧编殖不常变化的**,比如评论。

4、思路是对的,清晰明了,读DB前,先读缓存,如果有直接返回,如果没有再读DB,然后写入缓存层并返回。

5、考虑是否需要主从,读写分离,考虑是否分布式部署,考虑是术留否后续水平伸缩。

6、想要一劳永帮了逸,后续维护和扩战便,那就将现有的代码架构优化,按你说的替换**库组件粒民密川得孔注右某措浓需要改动大量代码,说明当前架构存在问题。可以利用现有的一些框架,比如SpringMVC,将应用层和业务层和**库层解耦。再上缓存之前把这些做好。

7、把读取缓存民等操作做成服务组件,对业务层提供服务,业务层对应用层提供服务。

8、保留原始**库组件,优化成服务组件,方便后续业务层灵活调用缓存或者是数据库。

9、不建议一次性全量血征心助设上缓存,最开始不动核心业务,可以将边缘业务先换成缓存组件,一步步换达价革期死至核心业务。

10、刷新内存,以memcache尔d为例,新增,修改和删除操作,一般采用lazy诉受取继答达情胶果南load的策略,即新增时只写入**库,并不会马上更今李新Memcached,而是等到再次读取时才会加载到Memcached中,修改和删除操作也是更新**库,然后将Memcached中的**标记为失效,等待火格十析因久玉下次读取时再加载。

大方向两种方案:

1、脚本同步:
自己写脚本将**库**写入到redis/memcached。
这就涉及到实时**变更的问题(mysqlrowbinlog的实时分析),binlog增量绍丰原脱汽翻订阅Alibaba的canal,以及缓存层**丢失/失效后的**同步恢复问题。

2、业务层实现:
先读取nosql缓存层,没有**再读取mysql层,并写入赵司坚需**到nosql。
nosql层做好多节点分布式(一致性hash),以及节点失效后替代方案(多层hash寻找相邻替代节点),和数据震荡恢复了。