redis为什么使用单线程
redis本身是基于内存的,所以redis的性能瓶颈更多的是在于内存和网络带宽,而不是CPU。而单线程的实现更加简单和经济
采用单线程,可以使指令串行,不用额外维护锁机制,避免了不必要的上下文切换和竞争条件,减少了CPU的消耗
redis单线程是如何承担大量并发请求的?
首先redis可以承担Redis读的速度是110000次/s,写的速度是81000次/s ,也就是说redis的qps大概在10W量级上,这个量是很大的,那么redis是如何做到能够这么快的呢?
1、基于内存
redis的数据都是存储在内存中的,所有读写速度很快
2、单线程,不用维护锁机制
redis采用单线程机制,指令串行,不用维护额外的锁机制,资源竞争等
3、数据结构简单,操作简单
自己内部实现了各种数据结构,根据情况进行了优化
(1)动态字符串结构
(2)hash的字典结构的容量大小取2^N,使取模运算可以转换为按位运算,更快。同时扩容缩容采用采用渐进式rehash
(3)zset采用跳表结构,范围查询更快
(4)list采用压缩链表结构,内存空间连续
4、采用了epoll多路复用器
能够接收大量socket连接,并且监控,能将有效socket传给内核执行后续读写操作
redis的VM机制
之前有看到不少博客都将redis的VM机制纳入redis快的原因之一,VM的操作是内存满了将冷数据保存到磁盘,之前了解到redis的淘汰策略是内存满了将冷数据删除,于是不禁产生这两个不是矛盾吗的疑问,进一步查询资料后发现VM机制在redis2.4的时候就已经弃用了,在redis2.6的时候删除了。使用VM反而存在性能问题,可能导致redis卡死,所以被弃用了。因此个人觉得VM机制不应该再作为redis快的原因
如果请求量大于10W的时候怎么办?
这时就要建立redis集群了,涉及到读写分离,主从同步,哨兵监控健康状态的知识点。