Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,所以Redis的性能非常出色。

   Redis最大的魅力是支持保存List链表和Set集合的数据结构,而且还支持对List进行各种操作,例如从List两端pushpop数据,取 List区间,排序等等,对Set支持各种集合的并集交集操作,此外单个value的最大限制是1GB,不像memcached只能保存1MB的数据,因 Redis可以用来实现很多有用的功能,比方说用他的List来做FIFO双向链表,实现一个轻量级的高性能消息队列服务,用他的Set可以做高性能的 tag系统等等。另外Redis也可以对存入的Key-Value设置expire时间,因此也可以被当作一个功能加强版的memcached来用。

    Redis内存要求很高,如果你的数据量很大的话,可能会导致系统使用swap,这会使性能急剧下降。此时更好的方法是通过consistent hashing把数据分布到多个服务器上。


-------------------顶爷打算补充一下的分割线-------------------------

  • 主从机制:

REDIS可以很方便的设置分布处理,主要是通过其内部的SLAVEOF,举例说明:

启动6379端口的REDIS服务,向里面写些测试数据,

COPY一份CONF把端口改一下(6380),并在SLAVEOF里,设置为127.0.0.1 6379这表示,这个REDIS进程是6379进程的SLAVE。

此时启动这个6380的REDIS,如果打开了LOG可以看到,在启动时,REDIS会自动从MASTER上把数据先同步过来,而无需我们手动进行。
14 Dec 15:23:12 -The server is now ready to accept connections on port 6380
14 Dec 15:23:12 . 0 clients connected (0 slaves), 412216 bytes inuse, 0 shared objects
14 Dec 15:23:12 - Connecting to MASTER...
14 Dec 15:23:13 - Receiving 30 bytes data dump from MASTER
14 Dec 15:23:13 - MASTER <-> SLAVEsync succeeded

之后,MASTER上每有一次落地保存,会自动向SLAVE进行同步。当然这里的问题是,如果MASTER不保存,SLAVE也就无法得到这些数据,这和REDIS本身的内存写磁盘逻辑是一样,用更新速度换取了一次操作的速度。

另一点,SLAVE再有SLAVE,所以与其说是SLAVEOF 不如说是COPYOF。

不过需要注意的是,与MYSQL一样,SLAVE并不代表着只听MASTER的话,如果我们连接上SLAVE的话,一样可以写数据的,此时数据就花了。

role:master
db0:keys=2,expires=0

role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:135
db0:keys=3,expires=0

所以不要向SLAVE中写入数据!

  • 过期机制

与memcached一样,REDIS也有一套数据过期机制,与MC不同的是,这个时间是在设置好的值上进行添加期限的,同样的,当达到了过期时间,这个值将会被删除。简单看了下,好像也是在下一次操作时,当发现该值已经过期,会对期进行清理。当内存溢出时好像也对这部分数据进行清理。具体的有待REDIS成熟可用后进行深入研究。

 

待解答问题,欢迎解答并提出新的问题:

  • ZSET,新版中添加的新的数据类型,目前没有太多详细说明
  • 内存处理机制