Redis的高性能怎么做到的?
Redis这个NOSQL数据库在计算机界可谓是无人不知,无人不晓。只要涉及到数据那么就需要数据库,数据库类型很多,但是NOSQL的kv内存数据库也很多,redis作为其中一个是怎么做到行业天花板的呢?是怎么做到高性能的呢?怎么做到高可用的呢?今天这篇八股文我就整理一些redis的设计写写,本篇还是偏关于高性能这一块。
高效数据结构
Redis的数据库相比传统的关系数据库,在数据结构上也是比较特殊的,它的所有数据类型都可以看做是一个map的结构,key作为查询条件。
基本数据结构
Redis基于KV内存数据库,它内部构建了一个哈希表,根据指定的KEY访问时,只需要O(1)的时间复杂度就可以找到对应的数据,而value的值又是一些拥有各种特性的数据结构,这就给redis在数据操作的时候提供很好的性能了。
基于内存存储
相比传统的关系数据库,数据文件可能以lsm tree 或者 b+ tree形式存在硬盘上,这个时候读取文件要有io操作了,而redis在内存中进行,并不会大量消耗CPU资源,所以速度极快。
存储金字塔
内存从上图可以看到它介于硬盘和cpu缓存中间的,相比硬盘查找数据肯定是快的,当然这里笔者个人见解上,如果关系型数据库把一些平凡操作的数据库也放置在内存中缓存,也会得到一些性能的提升,像操作系统里面缺页异常一样处理,把数据片段通过一些特殊算法缓存在内存里面,减少文件io的开销。
io多路复用
传统对于并发情况,假如一个进程不行,那搞多个进程不就可以同时处理多个客户端连接了么?多进程是可以解决一些并发问题,但是还是有一些问题,上下文切换开销,线程循环创建,从PCB来回恢复效率较