最新消息:我们是一群和平年代充满浮躁与抱怨的程序猿,心中充满抱负却无处撒野,明明是一匹野马,却找不到草原。

Redis在什么场景下会取代Memcache

技术经验 goomoon 2232浏览 0评论

        做Web网站的同仁们应该了解,通常会对前端的频繁访问的,或者读取成本较大的数据进行缓存,对于我们来说MySQL+MemCache的架构,是很合理的需求。通过Memcache把数据从mysql读取出来放到cache里。这种做法的确比较合理,对于很多小型的网站和公司也一直在使用。然而对于一些大并发量的网站来说,可能这种方法就有些捉襟见肘了,问题频出:

  1. 数据量的不断增大,带来的是Mysql分库分表,Memcache扩容。每次变动,成本都翻几番。。
  2. 当服务器很多时候,跨机房cache同步的问题
  3. Memcahce和Mysql同步的问题
  4. Memcache越来越庞大,当命中率低或者宕机时,大量并发直接访问msql,瓶颈问题严重

        为了解决Mysql等关系型数据库的这些瓶颈问题,近几年大量涌现了很多NoSQL产品,其中就包括Redis

        用一句话概括Redis解决的问题就是:少量数据存储,高速读写访问。

        Redis适用场景,如何正确的使用呢??

        Redis通过数据全部in-momery 的方式来保证高速访问,同时提供数据落地的功能,实际这正是Redis最主要的适用场景。其实Redis最适合所有数据in-momory的场景,虽然Redis也提供持久化功能,但实际更多的是一个disk-backed的功能,跟传统意义上的持久化有比较大的差别,那么可能大家就会有疑问,似乎Redis更像一个加强版的Memcached,那么何时使用Memcached,何时使用Redis呢??

        如果简单地比较Redis与Memcached的区别,大多数都会得到以下观点:

  1. Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,set,hash等数据结构的存储。
  2. Redis支持数据的备份,即master-slave模式的数据备份。
  3. Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。

        抛开这些,可以深入到Redis内部构造去观察更加本质的区别,理解Redis的设计。

        在Redis中,并不是所有的数据都一直存储在内存中的。这是和Memcached相比一个最大的区别。Redis只会缓存所有的 key的信息,如果Redis发现内存的使用量超过了某一个阀值,将触发swap的操作,Redis根据“swappability = age*log(size_in_memory)”计 算出哪些key对应的value需要swap到磁盘。然后再将这些key对应的value持久化到磁盘中,同时在内存中清除。这种特性使得Redis可以 保持超过其机器本身内存大小的数据。

        当然,机器本身的内存必须要能够保存所有的key,毕竟这些Key数据是不会进行Swap操作的。同时由于Redis将内存 中的value数据swap到磁盘中的时候,提供服务的主线程和进行swap操作的子线程会共享这部分内存,所以如果更新需要swap的数据,Redis将阻塞这个操作,直到子线程完成swap操作后才可以进行修改。

        当从Redis中读取数据的时候,如果读取的key对应的value不在内存中,那么Redis就需要从swap文件中加载相应数据,然后再返回给请求方。这里就存在一个I/O线程池的问题。在默认的情况下,Redis会出现阻塞,即完成所有的swap文件加载后才会响应。这种策略在客户端的数量较小,进行批量操作的时候比较合适。但是如果将Redis应用在一个大型的网站应用程序中,这显然是无法满足大并发的情况的。

        如果希望在海量数据的环境中使用好Redis,我相信理解Redis的内存设计和阻塞的情况是不可缺少的。

转载请注明:刘召考的博客 » Redis在什么场景下会取代Memcache

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址