百万级运维经验二:Redis和Memcached的选择
看到很多人推荐使用Redis代替Memcached,我觉得这两个是不一样的东西,它们的关系应该是共存而不是替代。
Memcached是个纯内存型的缓存系统,支持数据类型单一,单个缓存数据有限制,支持分布式,我觉得这是个很理想的缓存系统。
Redis是个简单的NOSQL数据库,支持几种简单的数据类型,支持主从复制,支持持久化,可以看作是个内存型数据库。
由此可见,Memcached是正宗的缓存系统,Redis是个可以做缓存系统的内存型数据库。
由于Redis的数据可以设置过期时间,支持多种数据类型,数据大小无限制,支持持久化等特点,貌似怎么看都稳压Memcached一筹,替代它好像是大势所趋。
事实并非如此。
网站需要缓存的数据可以分为两种,一种是可丢失性的缓存,这种缓存不在乎被丢失,丢失了就再从数据库或其它地方再读回来,如Session,从数据库查询的数据,应用代码的缓存等;另一种是不可丢失性的缓存,就是其它地方没保存有,只有Redis缓存有的数据。
先说下Memcached和Redis的优缺点:
Memcached是纯内存型的缓存,占用内存小,运行稳定,读写数据很快。Redis的数据可以持久化到硬盘,占用内存大,占用硬盘IO高,在写频繁的时候而硬盘性能又不高的时候(目前只有SSD固态硬盘的性能才高,机械硬盘性能都不高),大大占用CPU资源,读写性能会急剧降低,甚至会崩溃,不稳定。
为什么说Memcached可以缓存Session数据?有的人说,Memcached崩溃会造成Session丢失,我觉得这个可能性真的不大。Session是每个页面都需要读,每个新用户都需要写的,而且大部分的Session数据都是可丢失性的数据(一般网站陌生人Session比登录用户Session要多的多),数据量也很小,非常适合保存在Memcached。
Memcached其实是非常稳定的,目前我们网站每天百万PV,没出现过Memcached崩溃的问题。只要服务器不崩溃,不是人为关闭,Memcached几乎没有崩溃的可能。如果服务器经常崩溃的话,我觉得应该考虑换个好点的服务器而不是把Memcached换成Redis。
当然了,Redis也有其适用的场合,我会在下一篇博文中,详细介绍我的网站使用Redis保存哪些不可丢失性数据。