Redis学习

Aug 29, 2016


  Redis是Key——Value类型的内存数据库,其中Value可以是String、List、Set、SortedSet、Hash等类型数据结构。Redis通过异步操作定期把数据库数据flush到硬盘上保存。因为是纯内存操作,所以Redis的性能非常出色,每秒可以处理10万次以上的读写操作,是已知的速度最快的Key-Value数据库。

一、Redis的数据存储

  在Redis中,key使用的字符串存储,但是key中不能出现空格或者换行符“\n”,因为空格和换行符都是Redis的特殊字符,value可以使用任意字符。
  Redis支持多种数据类型,如String、List、Set、SortedSe、Hash等。每种数据类型都有其各自的特点。

  • String类型:String类型是二进制安全的,可以把图片和视频文件保存到String中。不过个人不建议这么做。
  • List类型:List数据类型指的是key对应的value是一个双向链表结构,所以List类型提供链表支持的所有操作。List类型在互联网应用中非常有用,例如存放微博中“我关注的列表”,或者论坛中所有同帖ID。
  • Set类型:Set类型是一种无序集合,在Redis内部通过HashTable实现。可以用于记录用户ID是否存在。

二、Redis事务处理

  Redis对事务处理的支持还比较简单,客户端连接执行multi命令后便会进入一个事务上下文,Redis把此连接发来的命令存入一个队列中。当此连接发出exec命令,Redis编开始按顺序执行队列中的所有命令,并将所有命令执行的结果打包返回客户端连接,然后次连接便结束事务上下文。

三、持久化

  Redis是基于内存的数据库,内存数据库有个严重的弊端:突然宕机或者断电时,内存的数据不会保存。为了解决这个问题,Redis提供了两种持久化方式:内存快照和日志追加。

1、内存快照

  内存快照将内存中的数据以快照的方式写入二进制文件中。Redis每隔一段时间进行一次内存快照操作。内存快照每次把数据完整的写入硬盘,而不是只写入增加的数据。所以,如果数据量巨大,比较频繁的写入操作会严重影响性能。

2、日志追加

  日志追加方式是把增加、修改数据的命令通过write函数追加到文件尾部,Redis重启时读取对应文件中所有命令并且执行,从而把数据写入内存中。日志追加方式有效的降低数据丢失的风险,同时也带来另一个问题,即持久化文件不断膨胀。Redis提供了命令对日志文件进行压缩。

四、主从同步

  主从同步可以防止主机坏掉导致网站不能正常工作。Redis支持只从同步,而且配置简单。Redis主从同步的优点如下:

  • Master可以有多个Slave。
  • 多个Slave连接到相同的Master,Slave还可以连接其他Slave形成图状结构。
  • 不会阻塞Master。
  • 主从同步用来提高系统的伸缩性。
  • 在Master服务器上禁止数据持久化,只在Slave服务器上进行数据持久化。

  Redis主从同步设置很简单,设置好Slave服务器后,Slave自动和Master建立连接,发送了SYNC命令。无论是第一次同步建立的连接还是连接断开后重新建立的连接,Master都会启动一个后台进程,将内存数据以快照方式写入内存中,同时Master主进程开始收集新的写命令并且缓存起来。Master后台进程完成内存快照操作后,把数据文件发给Slave,Slave将文件保存到磁盘上,然后把数据加载到内存中。接着Master把缓存的命令发给Slave,后续Master收到的写命令都通过开始建立的连接发送给Slave。当Master与Slave断开连接时,Slave自动重新建立连接。如果Master同时收到多个Slave发来的同步请求,其只启动一个进程写数据库镜像,然后发送给所有Slave。
  Redis主从同步过程分两个阶段,第一阶段如下:

  • Slave服务器主动连接到Master服务器。
  • Slave服务器发送SYCN命令到Master服务器请求同步。
  • Master服务器备份数据库到rdb文件。
  • Master服务器吧rdb文件传输给Slave服务器。
  • Slave服务器清空数据库数据,把rdb文件数据导入数据库表中。

  完成第一阶段,接下来Master服务器把用户所以更改数据的操作,通过命令的形式转发给所有Slave服务器,Slave服务器只需要执行Master服务器发过来的命令就可以达到同步的效果。

五、Redis虚拟内存

  当系统内存不足时,Redis使用虚拟内存技术。操作系统也有虚拟内存功能,为什么Redis要重复造轮子呢?主要是以下两点原因:

  • 操作系统的VM是基于也的概念,一般每个页都比较大(4KB)。而Redis大多数对象远远小于4KB,一页上可能有多个Redis对象。另外Redis的集合对象类型如List、Set可能存在于多个页上。故Redis自己实现可控制换入的力度。
  • Redis将交换到磁盘的对象压缩,保存到磁盘的对象可以去除指针和对象元数据信息。一般压缩后对象比内存中的对象小10倍,这样Redis的VM比操作系统的VM少做很多I/O操作。