网上有一篇介绍Redis的文章,由浅入深地讲解了Redis:http://blog.mjrusso.com/2010/10/17/redis-from-the-ground-up.html。强烈建议对Redis有兴趣或需要使用的朋友阅读这篇文章。

提到Redis,第一反应就是内存k/v缓存,并且很多人会拿它与Memcached相比较,毕竟他们都是以内存作为存储介质的。 如果简单地比较Redis与Memcached的区别,大多数都会得到以下观点:

1  Redis不仅仅支持简单的k/v类型(map类型)的数据,同时还提供list,set,hash等数据结构的存储。

2  Redis支持数据的备份,即master-slave模式的数据备份。

3  Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。

抛开这些,可以深入到Redis内部构造去观察更加本质的区别,理解Redis的设计。我觉得最值得参考的就是Redis的内存模型设计。推荐参考这两篇文章:Redis Virtual Memory: the Story
and the Code
Redis Virtual Memory subsystem

Redis中,不是所有的数据都一直存储在内存中。这是和Memcached明显的区别。

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

同时由于Redis将内存数据swap到磁盘中,提供服务的主线程和进行swap操作的子线程会共享这部分内存,所以如果更新需要拿swap的数据,Redis将先阻塞这个操作,直到子线程完成swap操作后才可以进行修改。

可以参考使用Redis特有内存模型前后的情况对比:

VM off: 300k keys, 4096 bytes values: 1.3G used
VM on: 300k keys, 4096 bytes values: 73M used
VM off: 1 million keys, 256 bytes values: 430.12M used
VM on: 1 million keys, 256 bytes values: 160.09M used
VM on: 1 million keys, values as large as you want, still: 160.09M used 

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

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

最新文章

  1. 盒图(boxplot)
  2. app中Webview实现下载表格
  3. 储存与更新 access_token
  4. 查看TOMCAT的版本
  5. Android RecyclerView(瀑布流)水平/垂直方向分割线
  6. 比较合并工具vimdiff的主要用法归纳
  7. Android Calendar获取年月日时分秒毫秒
  8. 设计模式六大原则——合成/聚合复用原则(CARP)
  9. 莫名其妙的主机名 VM_32_234_centos
  10. 【HDOJ】4605 Magic Ball Game
  11. UVA 657 The die is cast
  12. Why is 0[0] syntactically valid in javascript?
  13. Illustrated C#学习笔记(一)
  14. 理解 ES6 语法中 yield 关键字的返回值
  15. yarn工作流程
  16. 如何调用别人提供的webservice接口
  17. python学习第一次笔记
  18. OO第二次作业总结
  19. Unity3D对apk反编译、重编译、重签名
  20. phpadmin试用

热门文章

  1. android Handler机制之ThreadLocal详解
  2. Linux 高性能服务器编程——socket选项
  3. 百度map 3.0初探
  4. linux下的环境变量
  5. socket系列之服务器端socket——ServerSocket类
  6. Cocos2D实现RPG游戏人物地图行走的跟随效果
  7. Android传感器概述-android学习之旅(七)
  8. Android Studio科普篇——1.几个个性化设置
  9. [GitHub]第六讲:开源项目贡献流程
  10. Android样式(style)和主题(theme)资源介绍-android学习之旅(五十六)