nc-blog 首页软硬兼施

顺利切换到redis

日期: 2011-07-09, 14:01   共 16,020 次阅读

网站为提高响应速度,越来越依赖在内存中存放数据。之前使用memcached,但却发现了一些由memcached的内存分配机制以及LRU导致的问题(详见 http://ahuaxuan.iteye.com/blog/225692)——简单来说是这样的,我们发现,在memcached还没有用尽其内存时,它就开始踢那些“永不超时”的数据了。对于memcached的设计理念是作为缓存来说,这当然不算是问题,或者可以说是有意设计的,但对于我们的实际需求来说(“永不超时”的数据必须保持在内存中)是无法接受的了。毕竟,缓存是缓存,数据是数据。

于是上周着手寻找新的替代方案,后来确定了使用redis。

“Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过10万次读写操作,是我知道的性能最快的Key-Value DB。”(http://www.iteye.com/topic/524977

相比memcached,Redis毕竟是以DB为设计目标的,因此功能强大很多(比如内存中的数据维护功能,memcached几乎为0),却非常小巧,编译安装也非常方便。

“和Memcached不同,Redis并没有选择libevent。Libevent为了迎合通用性造成代码庞大(目前Redis代码还不到libevent的1/3)及牺牲了在特定平台的不少性能。Redis用libevent中两个文件修改实现了自己的epoll event loop(4)。业界不少开发者也建议Redis使用另外一个libevent高性能替代libev,但是作者还是坚持Redis应该小巧并去依赖的思路。一个印象深刻的细节是编译Redis之前并不需要执行./configure。”(http://timyang.net/tag/redis/

redis支持很多客户端(http://redis.io/clients),我们使用的php(phpredis)和python(redis-py)当然都有,代码从memcached切换到redis几乎不用做改动,转移成本极小。

昨晚redis顺利部署到线上。切换后总结带来的好处如下:
1、当然是完成了切换到redis的初衷——保持web服务器内存中数据的完整性,避免类似memcached的LRU那样踢数据。
2、之前用memcached的时候,必须在线上用脚本将后台postgresql的关系数据“跑”进内存(memcached)里,这个步骤比较费时,在线上跑并不是很合适;现在用redis可以用线下服务器将关系数据跑进内存里,生成磁盘文件,再把该文件上传到线上服务器即可,线上服务器短时间就可以完成数据更新的切换(相当于把线下服务器的内存“拷贝”到了线上服务器的内存)。数据更新部署的流程简化多了。
3、不再担心重启memcached服务甚至重启服务器时,带来的内存中数据长时间空缺导致线上服务受到影响(见上一条“必须在线上用脚本将后台postgresql的关系数据“跑”进内存(memcached)里,这个步骤比较费时”),redis服务本身的维护也相当方便。

当然,基于切换的初衷,我们更多的还是把redis当作一个更合适的memcached来用,所以我们没有启用redis的VM特性(内存足够,性能是唯一要求)。redis更多强大功能,暂时还没有体会。

Redis官方网址:http://redis.io/

简短地址:http://ncblog.net/915/
«
»
评论
思杰马克丁软件 @ 2011-07-09 14:22 留言:
沙花下,恭喜切换成功 :mrgreen:

夜知 @ 2011-07-18 10:43 留言:
恭喜恭喜。 现在有些人主张用redis做主数据库,用mysql做缓存,我理解不了,大牛能给讲讲吗?

› nicrosoft @ 2011-07-18 11:48 留言:
我也理解不了。

› akira @ 2012-02-24 21:21 留言:
应该是为了解决redis的数据持久化问题吧。

Trackback url | Rss 2.0