用户名: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寻找相邻替代节点),和数据震荡恢复了。