1)Redis为什么使用单进程单线程方式也这么快?
Redis采用的是基于内存的采用的是单进程单线程模型的KV数据库,由C语言编写。官方提供的数据是可以达到100000+的qps。这个数据不比采用单进程多线程的同样基于内存的KV数据库Memcached差。
1:完全基于内存
2:数据结构简单,对数据操作也简单
3:使用多路 I/O 复用模型
多路 I/O 复用模型是利用select、poll、epoll可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有I/O事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络IO的时间消耗),且Redis在内存中操作数据的速度非常快(内存内的操作不会成为这里的性能瓶颈),
和Memcached不同,Redis并没有直接使用Libevent,而是自己完成了一个非常轻量级的对select、epoll、evport、kqueue这些通用的接口的实现。
--单进程单线程好处
1:代码更清晰,处理逻辑更简单
2:不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗
3:不存在多进程或者多线程导致的切换而消耗CPU
--单进程单线程弊端
无法发挥多核CPU性能,不过可以通过在单机开多个Redis实例来完善;
--其他一些优秀的开源软件采用的模型
多进程单线程模型:Nginx
单进程多线程模型:Memcached
2)五种类型数据类型
字符串、列表、散列表,集合、有序集合
3)内存中数据持久化
使用复制来扩展读性能:复制到多台服务器、提高读性能和可用性
使用分区来扩展写性能【hash一致性算法】:当数据量大的时候,把数据分散存入多个数据库中,减少单节点的连接压力
特点
完全基于内存
数据结构简单,对数据操作也简单
使用多路 I/O 复用模型
4)Redis 适用场景
1. 缓存 将热点数据放到内存中
2. 消息队列 List 类型是双向链表,很适合用于消息队列
3. 计数器 快速、频繁读写操作;string的单线性自增减 ++ --
4. 共同好友关系 set 交集运算,很容易就可以知道用户的共同好友
5. 排名 zset有序集合
5)持久化
快照持久化 将某个时间点的所有数据都存放到硬盘上,可以将快照复制到其它服务器从而创建具有相同数据的服务器副本
缺点:故障可能丢失最后一次创建快照之后的数据;如果数据量很大,保存快照的时间也会很长。
两种持久化机制RDB和AOF:
AOF持久化机制对每条写入命令作为日志,以append-only模式写入一个日志文件中,在redis重启的时候,可以通过AOF写入的指令来重新构建整个数据集。
RDB会执行以下操作:
1.redis调用系统的fork()函数创建一个子进程
2.子进程将数据集写入一个临时的RDB文件
3.当子进程完成对临时的RDB文件的写入时,redis用新的RDB文件来替换原来旧的RDB文件,并将旧的RDB文件删除
AOF的优点:
1:AOF可以更好的保护数据不丢失,一般AOF会以每隔1秒,通过后台的一个线程去执行一次fsync操作,如果redis进程挂掉,最多丢失1秒的数据。
2:AOF以appen-only的模式写入,所以没有任何磁盘寻址的开销,写入性能非常高。
3:AOF日志文件的命令通过非常可读的方式进行记录,这个非常适合做灾难性的误删除紧急恢复,如果某人不小心用flushall命令清空了所有数据,只要这个时候还没有执行rewrite,那么就可以将日志文件中的flushall删除,进行恢复。
AOF的缺点
1:对于同一份文件AOF文件比RDB数据快照要大。
2:AOF开启后支持写的QPS会比RDB支持的写的QPS低,因为AOF一般会配置成每秒fsync操作,每秒的fsync操作还是很高的
3:数据恢复比较慢,不适合做冷备。
RDB优点:
1:RDB会生成多个数据文件,每个数据文件都代表了某一个时刻中redis的数据,这种多个数据文件的方式,非常适合做冷备。
2:RDB对redis对外提供读写服务的时候,影像非常小,因为redis 主进程只需要fork一个子进程出来,让子进程对磁盘io来进行rdb持久化
3:RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。
RDB缺点
1:如果redis要故障时要尽可能少的丢失数据,RDB没有AOF好,例如1:00进行的快照,在1:10又要进行快照的时候宕机了,这个时候就会丢失10分钟的数据。
2:RDB每次fork出子进程来执行RDB快照生成文件时,如果文件特别大,可能会导致客户端提供服务暂停数毫秒或者几秒