协思

协作、思考、感悟、进步

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com
 
redis是继memcached之后兴起的内存数据库,作者非常崇尚简洁高效,力求以最简单的方式最高效的解决问题,所谓大道至简。同时作者也很勤奋,经常尝试不同解决问题的方式来优化。
 
redis支持丰富的数据的数据结构,它们在特定场景下都有自己的用武之地。比如hash: 能提供同一类资源下所有健值的查询, ServiceStack的redis client就是基于此来封装Entity实现透明读写操作的。
 
为了支持不同数据结构的操作,提供了丰富的命令,实际上这就是和redis进行交互的方式。我在项目中用到redis保存json结构的数据,用命令查看并不方便,于是基于node.js提供rest api查询,在chrome浏览器中查看json方便了不少,后面有时间会整理开源到github。
 
redis的cluster模块还没有合并到稳定版本中,因此无法做到数据切片。Master/Slave也只能解决HA的问题,目前还是单机使用的场景比较多,这方面还比较弱。
 
redis曾经在早期版本中提供了使用磁盘来虚拟内存功能,但在新版本中已经取消,作者认为redis定位是内存数据库,在内存中操作数据是最高效的。因此,在产线部署redis要求内存足够,考虑fork进程持久化的问题,建议至少为缓存数据的两倍值。在实践中,我们发现内存紧张可能引发redis异常退出,所以没内存就不要玩redis。
 
redis提供了AOF和Snapshot两种方式来持久化数据,这两种持久化都不会影响缓存使用。前者是commit log方式,对数据的保障性最高,缺点是要准备足够的磁盘空间。另外要注意在特别严格的场景下,要关闭操作系统写缓存(appendfsync),否则高并发下仍然有丢失数据的风险。Snapshot是通常的做法,也是默认的方式,通过一定的策略来触发,注意是Snapshot是全量写入磁盘的。
 
redis也实现了事务性的两阶段提交,事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。事务中的命令要么全部被执行,要么全部都不执行。
 
值得一提的是,在电子商务网站中,前端负载均衡设备通常会以FAQ的方式询问后端服务是否活着,对于redis的检查,可以通过ping命令完成。
posted on 2014-09-13 17:17  协思  阅读(785)  评论(0编辑  收藏  举报