• 04:33下午

Redis内核概念

在Redis里的每一个东西都是用字符串表示的。即使像列表,集合,有序集合和图都是字符串的组合。Redis定义了一个特殊的结构,它调用一个叫”简单动态字符串”(Simple dynamic string, SDS)。这个结构有3个部分组成,分别是:

  • buff — 一个存储字符串的字符型数组
  • len — 一个长整型记录buff数组的长度
  • free — 可用的额外的字节数

虽然你会觉得分开地存储数组长度会造成额外的开销,因为这应该可以很容易地根据buff数组来计算出它的长度,但是这样做允许字符串长度的检索在固定的时间内完成。

Redis将它的数据集保存在主内存中,在需要的时候才持久性地写到磁盘上。不像MongoDB,它不使用内存映射文件来达到那个目的。确实,Redis实现有它自己的虚拟内存子系统。当一个数值被交换到硬盘时,一个指向那个硬盘页面的指针和它的键值一起存储。关于虚拟内存的技术文档,可以在此地址阅读http://code.google.com/p/redis/wiki/VirtualMemorySpecification.

除了虚拟内存管理,Redis还包含一个事件库以帮助协调非死锁(non-locking)的socket操作。
为什么Redis不依靠操作系统的虚拟内存的交换机制呢?

Redis不依赖操作系统的内存交换,因为:

  • Redis对象不能一对一地映射到交换虚拟内存的页面。交换页面是4,096字节长而Redis对象可以跨越一个以上的交换页面。类似地,一个以上的Redis对象也可能在一个交换页面上。所以,即使是一小部分Redis对象被访问,有可能涉及到很多个交换页面。是操作系统来监控交换页面的访问。所以,即使是在交换页面中的一个字节被访问,这都会将要移交到(操作系统的)交换系统。
  • 不像MongoDB, Redis数据格式在RAM中和在硬盘上是不一样的。在硬盘上的数据比它在内存中时要压缩了很多倍。这样,使用自实现的交换涉及到更少的磁盘I/O。

Salvatore Sanfillipo, Redis的作者,在他的博客中有谈到Redis的虚拟内存系统,“Redis Virtual Memory: the story and the code,” at http://antirez.com/post/redis-virtual-memory-story.html.

  • 09:55上午

NoSql Notes

In NoSQL stores, the create and read operations are more important than the update and delete operations, so much so that sometimes those are the only operations.