redis面试题-2023

发布时间 2023-03-29 16:11:48作者: hechengQAQ

思维导图知识点整理:

 

一、认识 Redis

1、Redis是什么?

Redis 是一种基于内存的数据库,对数据的读写操作都是在内存中完成,因此读写速度非常快,常用于缓存,消息队列、分布式锁等场景。有多种数据类型,并且对数据类型的操作都是原子性的,因为执行命令由单线程负责的,不存在并发竞争的问题。(除此之外,Redis 还支持事务 、持久化、Lua 脚本、多种集群方案(主从复制模式、哨兵模式、切片机群模式)、发布/订阅模式,内存淘汰机制、过期删除机制等等)

2、Redis和Memcached有什么区别?

很多人都说用 Redis 作为缓存,但是 Memcached 也是基于内存的数据库,为什么不选择它作为缓存呢?要解答这个问题,我们就要弄清楚 Redis 和 Memcached 的区别。 Redis 与 Memcached 共同点:

  1. 都是基于内存的数据库,一般都用来当做缓存使用。
  2. 都有过期策略。---康
  3. 两者的性能都非常高。

Redis 与 Memcached 区别:

  • Redis 支持的数据类型更丰富(String、Hash、List、Set、ZSet),而 Memcached 只支持最简单的 key-value 数据类型;
  • Redis 支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用,而 Memcached 没有持久化功能,数据全部存在内存之中,Memcached 重启或者挂掉后,数据就没了;
  • Redis 原生支持集群模式,Memcached 没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据;
  • Redis 支持发布订阅模型、Lua 脚本、事务等功能,而 Memcached 不支持;

3、为什么用 Redis 作为 MySQL 的缓存?

mysql是将数据存储在磁盘中,当大量的高并发访问到来时,mysql会因为频繁的IO导致数据响应慢或无法响应的问题,而redis是基于内存的数据库,天然支持高并发的访问,高性能的支持,QPS是mysql的数十倍倍,完全可以将高频数据放入redis来提高程序的响应速度,减轻mysql的压力。

二、Redis数据结构

问题的答案看链接。

补充的知识点:

SDS:简单动态字符串,是 Redis 中的一种字符串类型,它是 Redis 用来做字符串的底层实现。

listpack:在Redis中,listpack是一种用来取代ziplist的数据结构,从5.0版本开始引入。

压缩列表:压缩列表是一种数据结构,旨在节省内存。Redis使用压缩列表作为列表和哈希表键值对的底层实现。ziplist,有连锁更新的性能问题,所以之后的redis版本使用listpack紧凑的列表实现,但这消耗了更多的内存。

quicklist:quicklist是Redis中一种新型的数据结构,它是由双向链表和压缩列表或listpack共同构成的。在Redis 3.2之后,List对象的底层是由quicklist实现的。

跳表:跳表是一种基于链表的数据结构,可以用来快速地查找元素。跳表的实现使用了空间换时间的思想,通过增加索引层来加速查找的速度。

三、Redis线程模型

1、Redis是单线程吗?

Redis 单线程指的是「接收客户端请求->解析请求 ->进行数据读写等操作->发送数据给客户端」这个过程是由一个线程(主线程)来完成的,这也是我们常说 Redis 是单线程的原因。但redis程序并不是单线程的,启动redis后,会启动后台线程来处理一些耗时任务,而不去打扰主线程,防止主线程阻塞(更详细的解答见链接)

 

参考链接:https://xiaolincoding.com/redis/base/redis_interview.html#%E8%AE%A4%E8%AF%86-redis

 

持续更新中。。。。。。