文章目录
- 一、前言
- 二、Redis为什么这么快(相对于关系型数据库)
- 三、Redis为什么这么快(相对于非关系型数据库)
- 四、尾声
一、前言
二、Redis为什么这么快(相对于关系型数据库)
我们用MySQL跟Redis对比,如下图:
解释上图:左边为mysql的介绍,mysql中的innodb存储引擎,分为内存部分和硬盘部分两层结构:内存部分存放索引,如a b c,磁盘部分中存放具体的值Apple banana China;
右边为redis的介绍,redis只有内存一层结构:为什么没有磁盘?因为Redis是纯粹在内存里的,不涉及磁盘,除非RDB持久化和AOF持久化。所以,从这个图上上面,我们可以知道redis为什么比mysql快的第一个理由,因为redis是完全基于内存的。
Redis加快速度的六个设计
1、Redis由C语言编写,采用的是基于内存的采用的是单进程单线程模型的 KV 数据库,官方提供的数据是可以达到100000+的QPS(每秒内查询次数)。
2、丰富的数据结构,对数据操作也简单,Redis中的数据结构是专门进行设计的;
3、完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。它的,数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);
4、采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
5、多路I/O复用模型,非阻塞IO:使用多路I/O复用模型,非阻塞IO;
6、Redis自己构建了 VM 机制代替系统调用系统函数:使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM 机制代替系统调用系统函数,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
三、Redis为什么这么快(相对于非关系型数据库)
Memcache | redis | |
数据类型(Redis速度快的第二个原因) | 数据结构:只支持 K-V 结构,不提供持久化和主从同步功能。且在k-v结构:key 不能超过 250 个字节;value 不能超过 1M 字节;key 的最大失效时间是 30 天(数据类型是Memcache的最大劣势,是大家选择Redis、MongoDB的重要原因) | 数据类型:相比 MC,Redis 还有一个非常大的优势,就是除了 K-V 之外,还支持多种数据格式,例如 list、set、sorted set、hash 等。 |
基于内存(Redis速度快的第三个原因) | 基于内存:MC 功能简单,基于内存存储数据,注意MC的内存结构以及钙化问题; | 基于内存:Redis 支持持久化,所以 Redis 不仅仅可以用作缓存,也可以用作 NoSQL 数据库(解释:redis基于内存可以作为缓存,但是持久化到磁盘就可以成为NoSQL数据库了,然后,RDB作为全量复制的冷备份,slave第一次接入集群的时候master发送,AOF作为热备份,slave每次接收master的同步)。 |
多线程or单线程(Redis速度快的第四个原因) | 多线程:MC 处理请求时使用多线程异步 IO 的方式,可以合理利用 CPU 多核的优势,性能非常优秀; | 单线程:Redis 采用单线程模式处理请求。 |
缓存失效 | 缓存失效时间:MC 对缓存的数据可以设置失效期,过期后的数据会被清除;失效的策略采用延迟失效,即当再次使用数据时检查是否失效;当容量存满时,会对缓存中的数据进行剔除,剔除时除了会对过期 key 进行清理,还会按 LRU 策略对数据进行剔除。 | key 失效机制:Redis 的 key 可以设置过期时间,过期后 Redis 采用主动和被动结合的失效机制,一个是和 MC 一样在访问时触发被动删除,另一种是定期的主动删除。 |
集群(Redis集群优势) | 无 | 集群:Redis 提供主从同步机制,以及 Cluster 集群部署能力,能够提供高可用服务。 |
Redis相对于Mencached的优点(数据结构优势+集群优势)
第一,数据结构,Redis 支持复杂的数据结构
解释:Redis 相比 Memcached 来说,拥有更多的数据结构,能支持更丰富的数据操作。如果需要缓存能够支持更复杂的结构和操作, Redis 会是不错的选择。
第二,集群,Redis 原生支持集群模式
解释:在 redis3.x 版本中,便能支持 Cluster 模式,而 Memcached 没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据。
第三,性能对比:redis单核100k以下数据好,Memcached 多核100k以上数据好
解释:由于 Redis 只使用单核,而 Memcached 可以使用多核,所以平均每一个核上 Redis 在存储小数据时比 Memcached 性能更高。而在 100k 以上的数据中,Memcached 性能要高于 Redis,虽然 Redis 最近也在存储大数据的性能上进行优化,但是比起 Remcached,还是稍有逊色。
四、尾声
Redis理论上可以达到10万qps,Redis速度之快最重要的有三个原因,如下:
1、基于内存(这是三个原因之首,最重要的原因);
2、Redis是单线程处理客户端请求,只有main线程,没有线程切换/线程竞争产生的开销;
3、Redis独特的多路复用结构,可以做到同步非阻塞。
问题:Redis设计为单线程会不会影响性能?
回答:第一,单线程已经足够了:单线程最多只能使用一个cpu,但是在Redis运行中,cpu从来都不是性能瓶颈,而是 内存和网络延迟 ,所以单线程已经是足够了;
第二,Redis单线程是指单线程处理客户端请求,但是处理后台一直是多线程,Redis 4.0 之后就是后台处理多线程,Redis 6.0 之后还优化了 io多线程 ,从 内核态-用户态-客户端 ,如果开启io多线程,可以提供三倍效率。
Redis为什么这么快,完成了。
天天打码,天天进步!