【转】动网先锋CTO的一篇关于redis的博文

这是我09年的一篇日志,http://blog.renren.com/blog/200000733/408143542,简单介绍了下redis。今天就redis的问题再讨论下:
1.到底是否需要redis的持久化能力?

  这让我们使用的很纠结,因为redis持久化的是数据集的当前快照,于是当你用它来做存储,而不是缓存时,你会很焦虑。

当数据集很大的时候,比如32G内存,数据集20G,你愿意dump快照吗?如果这样做,问题就来了,redis的dump是fork一个进程,利用操作系统内存管理的copy-on-write来得到当前内存快照,但如果数据的更新比较频繁,20G内存dump到磁盘的速度又不快,就会导致在dump的时候需要大量的内存来做写时copy,需要的新内存加上原有的20G内存,可能导致操作系统swap,同时因为copy-on-write,主线程在处理请求时也会变慢,redis的整体性能急速下降。

  所以我们还是保守的把redis当做cache,只有当数据集很小的时候,才用它来做持久存储。

2.性能真的没有问题吗?

  很多人说redis性能比memcached要高,其实看完代码比较差异,redis是单线程,memcac hed是多线程,redis每次请求malloc 你需要的数据大小内存量,memcached每次malloc 1M,memcached只有malloc没有free,redis当删除时会free,对于value本身来讲,redis可以支持结构化的value,memcached则只把value当做一块字节。都是基于epoll,kv都是hashtable,从这些方面来看,我觉得性能上讲两者不会有太大差别。

但因为redis的malloc方式,导致一个潜在问题,就是当有很多small object放进去,又被频繁的free后,导致了大量的内存碎片,到一定临界点后,你会发现插入新数据的时候redis的性能急剧下降,原因在malloc函数上要花很长时间,我们在一个项目中就遇到了这个问题,32G内存机器,redis使用了22G左右的内存量,因为清理了大量没用的cache数据后,导致redis响应及其缓慢。

因为memcached只有malloc,每次都是以1M为单位,所以没有redis的这个问题。不过memcached在内存用满后,再插入数据时因为需要替换策略也会引起性能下降。

  所以在使用redis时候要注意避免内存碎片问题,因为这个问题,redis社区很多人有尝试使用tcmalloc来替换malloc。

转载于:https://www.cnblogs.com/mike0923/archive/2012/05/23/2515525.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值