Redis是什么

Redis是什么

面试官:你先来说下redis是什么吧

我:(心想:总结下redis的定义和特点,这个简单) Redis是一个由ANSI C语言编写,性能优秀、支持网络、可持久化的K-K内存数据库,并提供多种语言的API。可以用作数据库、缓存、消息中间件等。

我顿了一下,接着说:Redis作为一个内存数据库。

性能优秀,数据在内存中,读写速度非常快,支持并发10W+ QPS;

单进程单线程,是线程安全的,采用IO多路复用机制;

丰富的数据类型,支持字符串(strings)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等;

支持数据持久化。可以将内存中数据保存在磁盘中,重启时加载;

主从复制,哨兵,高可用;

可以用作分布式锁;

可以作为消息中间件使用,支持发布订阅

面试官:看来是做了一些准备啊,redis作为缓存大家都在用,它的“多线程模型”你了解吗?

我:您是想问Redis这么快,为什么还是单线程的吧。Redis确实是单进程单线程的模型,因为Redis完全是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章的采用单线程的方案了(毕竟采用多线程会有很多麻烦)。

面试官:嗯,那你能讲下Redis是单线程的,为什么还能这么快吗?

我:可以这么说吧。

第一:Redis完全基于内存,绝大部分请求是纯粹的内存操作,非常迅速,数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度是O(1)。

第二:数据结构简单,对数据操作也简单。

第三:采用单线程,避免了不必要的上下文切换和竞争条件,不存在多线程导致的CPU切换,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有死锁问题导致的性能消耗。

第四:使用多路复用IO模型,非阻塞IO。

面试官:那主从复制会存在哪些问题呢?

我:主从复制会存在以下问题:

一旦主节点宕机,从节点晋升为主节点,同时需要修改应用方的主节点地址,还需要命令所有从节点去复制新的主节点,整个过程需要人工干预。

主节点的写能力受到单机的限制。

主节点的存储能力受到单机的限制。

原生复制的弊端在早期的版本中也会比较突出,比如:redis复制中断后,从节点会发起psync。此时如果同步不成功,则会进行全量同步,主库执行全量备份的同时,可能会造成毫秒或秒级的卡顿。

面试官:那比较主流的解决方案是什么呢?

我:当然是哨兵啊

面试官: 你能说下哨兵的工作原理,以及底层机制么?

文章来源于微信公众号

你可能感兴趣的:(Redis是什么)