那些年,我使用过的轮子(二)--memcached+couchbased
来源:互联网 发布:elasticsearch mysql 编辑:程序博客网 时间:2024/04/30 14:40
背景
memcached 出现的比较早了,支持的数据类型比较简单,而且没有持久化,在绝大多数的应用场景中都作为缓存来使用,加上根据一致性Hash扩展成分布式的缓存集群也是互联网中常用的方案设计。couchbase 文档较少,国内用的公司应该不多, 它作为一种NoSQL的数据库,支持memcached协议,支持JSON的文档格式和索引,加上其天生的Auto-Sharding和P2P特性,在分布式领域中有着更为灵活的应用场景,之所以把这两个放一块说,主要是工作中的用途差不多,它们之间的差别还是很大的。
业务场景
动态网页缓存
网页缓存是提升网站访问性能常用的手段之一,特别是动态网页缓存;比如网页的内容和传入的参数有关系,网页的内容经常会发生变化等,在这种场景下,可以提升网站的访问体验,特别是在高峰期间的时候,可以分散后端服务器的压力。常用的方案是前端的nginx服务器利用memcached_module进行扩展,提取页面访问请求的URI,参数等,组成memcached_key,然后去memcached去获取,如果获取成功,直接将渲染好的网页内容或者数据返回给前端,如果cache里面没有,会重定向到后端服务器进行处理。每台nginx会指向local或者远程的一台memcached实例作为存储服务器。至于cache miss之后,可以在Filter层面统一对返回的数据进行拦截处理和写入到memcached。
从前端nginx配置memcached,到cache miss之后后端服务的数据再生产,到数据生产之后回写memcached流程较长,也相对比较复杂,容易踩到比较多的坑,在每一步处理都有较多的细节需要处理和测试,不然达不到设计或者预期的效果;比如memcached的监控, nginx到memcached的连接回收,cache miss之后后端服务的操作流程,写入数据的大小和是否压缩等
通用数据缓存
目前公司的基础缓存是基于couchbase搭建的,文章里面关于couchbase的介绍比较齐全,就不重复了。couchbase以集群方式运行,分为持久化和非持久化两种,按应用分vBucket,持久化的方式性能较低,用的不多,这里主要说非持久化。 应用的数据类型分两种,k-v类型和json类型,k-v和memcached类似,可以兼容memcached相关的操作,json格式的话,类似mongo了,支持按照字段的索引,修改和查找。
由于是基础缓存,封装的couchbase的dao较为完善,貌似没有批量操作的接口支持,以及对原子操作的支持也不太好,不过扩容和监控相对方便,能省不少事。
一些教训
1. memcached 相对来说比较脆弱,supervisor之类的服务监控和拉起是非常有必要的,在cache miss的时候,后端服务对memcached的读写需要再控制一下,之前服务高峰期, memcached经常出现实例进程没有或者不响应,在定位到问题前,保证它能快速响应很重要。
2. memcached和nginx的连接回收和超时也要注意观察下,一不小心,系统的time wait就上来了。
3. memcached和couchbase的key, value会有限制,根据数据大小和应用场景选择是否压缩。
4. couchbase的client会维护一个消费者和生产者的队列,队列内部积累的请求过多会抛异常,和请求数和批量取的key数量有关系, 需要通过上层限流来避免队列溢出
5. 需要提前考虑缓存批量丢失(节点损坏)带来的影响以及预案,墨菲定律牢记心头。
0 0
- 那些年,我使用过的轮子(二)--memcached+couchbased
- 那些年,我使用过的轮子
- 那些年,我使用过的轮子(一)--Redis
- 那些年我准备过的cfa
- 那些年我追过的android
- 那些年我追过的android
- 那些年我追过的android
- 那些年我追过的android
- 那些年,我用过的虚拟主机
- 那些年我踩过的坑
- 那些年我写过的代码
- 那些年,我开发过的软件
- 那些年,我培养过的大佬
- 那些年,我开发过的软件
- 那些年我犯过的错
- 那些年我追过的“女孩”
- 那些年我用MUI开发遇过的坑(二)
- 那些年,我玩过的Linux命令(二)—— 文件搜索相关
- 大数据工程师(开发)面试系列(4)
- 关于static的一些小代码
- sql中表级约束和列级约束
- Android Studio Checkout Github Error “CreateProcess=2” (Windows)
- zookeeper如何实现负载均衡的?(具体连接哪一个zookeeper服务器的选择?)
- 那些年,我使用过的轮子(二)--memcached+couchbased
- 蓝桥杯2016-2生日蜡烛
- Java 函数
- Hi3516A/Hi3516D SDK 安装以及升级使用说明
- 初识 版本控制 git
- Qt:使用ShaderEffectSource对Item拍摄"UI快照",提升渲染效率
- Ubuntu下android源码下载与编译
- TensorFlow 学习(十)—— 工具函数
- 人生必须充实,年轻必须劳动!