redis实现轮询算法_如果面试官在问你有关redis的问题,你就这么说......

73d49e26c70f0dc7e9635b8a1a825c4b.png

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快照生成文件时,如果文件特别大,可能会导致客户端提供服务暂停数毫秒或者几秒

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值