Redis面试题总结

什么是 Redis?它主要用来什么的?

Redis是一个基于Key-Value存储结构的Nosql开源内存数据库。
它提供了5种常用的数据类型,String、Map、Set、ZSet(有序集合)、List
redis5.0之后引入Stream
3种特殊的数据结构类型:Geospatial、Hyperloglog、Bitmap
Bitmaps :用一个比特位来映射某个元素的状态,在 Redis 中,它的底层是基于字符串类型实现的 ,可以把 bitmaps 成作一个以比特位为单位的数组

针对不同的结构,可以解决不同场景的问题。 因此它可以覆盖应用开发中大部分的业务场景,比如top10问题、好友关注列表、热点话题等。
其次,由于Redis是基于内存存储,并且在数据结构上做了大量的优化所以IO性能比较好,在实际开发中,会把它作为应用与数据库之间的一个分布式缓存组件。 并且它又是一个非关系型数据的存储,不存在表之间的关联查询问题,所以它可以很好的提升应用程 序的数据IO效率。
最后,作为企业级开发来说,它又提供了主从复制+哨兵、以及集群方式实现高可用在Redis集群里 面,通过hash槽的方式实现了数据分片,进一步提升了性能。

Redis 为什么这么快?


1/ 基于内存存储实现
我们都知道内存读写是比在磁盘快很多的, Redis 基于内存存储实现的数据库, 相对于数据存在磁盘的 MySQL 数据库,省去磁盘 I/O的消耗。

2/ 高效的数据结构
Redis 作为 K-V 型内存数据库,所有的键值就是用字典来存储。字典就是哈希表,比如 HashMap, 通过key 就可以直接获取到对应的 value。查询的时间复杂度为O(1)

3/合理的数据编码
Redis 支持多种数据数据类型,每种基本类型,可能对多种数据结构。什么时候,使用什么样数据结构,使用什么样编码,是 redis 设计者总结优化的结果。

String:如果存储数字的话, 是用 int 类型的编码;如果存储非数字,小于等于 39 字节的字符串,是 embstr;大于 39 个字节,则是 raw 编码。
List:如果列表的元素个数小于 512 个,列表每个元素的值都小于 64 字节 (默认),使用 ziplist 编码,否则使用 linkedlist 编码
Hash:哈希类型元素个数小于 512 个,所有值小于 64 字节的话,使用 ziplist 编码,否则使用 hashtable 编码。
Set:如果集合中的元素都是整数且元素个数小于 512 个,使用 intset 编码, 否则使用 hashtable 编码。
Zset:当有序集合的元素个数小于 128 个,每个元素的值小于 64 字节时,使 用ziplist 编码,否则使用 skiplist(跳跃表)编码

合理的线程模型 I/O 多路复用
在这里插入图片描述
多路 I/O 复用技术可以让单个线程高效处理多个连接请求,而 Redis 使用用 epoll 作为 I/O 多路复用技术实现。并且,Redis 自身事件处理模型将 epoll 中连接、读写、关闭都转换为事件,不在网络 I/O 上浪费过多时间。

什么是 I/O 多路复用?

IO多路复用是一种同步的IO模型。利用IO多路复用模型,可以实现一个线程监视多个文件句柄; 一旦某个文件句柄就绪,就能够通知到对应应用程序进行相应的读写操作;没有文件句柄就绪时就会 阻塞应用程序,从而释放出CPU资源。

IO多路复用机制,核心思想是让单个线程去监视多个连接,一旦某个连接就绪,也就是触发了读/写事件。 就通知应用程序,去获取这个就绪的连接进行读写操作。 也就是在应用程序里面可以使用单个线程同时处理多个客户端连接,在对系统资源消耗较少的情况下 提升服务端的链接处理数量。
在IO多路复用机制的实现原理中,客户端请求到服务端后,此时客户端在传输数据过程中,为了避免Server端在read客户端数据过程中阻塞,服务端会把该请求注册到Selector复路器上,服务端此时不需要等待,只需要启动一个线程,通过selector.select()阻塞轮询复路器上就绪的channel即可, 也就是说,如果某个客户端连接数据传输完成,那么select()方法会返回就绪的channel,然后执行 相关的处理就可以了。
在这里插入图片描述
常见的IO多路复用机制的实现方式有: select 、poll、epoll。 这些都是Linux系统提供的IO复用机制的实现,其中select和poll是基于轮询的方式去获取就绪连接。 而epoll是基于事件驱动的方式获取就绪连接。从性能的角度来看,基于事件驱动的方式要优于轮询的方式。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值