2022-Java 后端工程师面试指南 -(Redis)

说说什么是 redis 吧

Redis 是一个开放源代码(BSD 许可)的内存中数据结构存储,用作数据库,缓存和消息代理。它支持数据结构,例如字符串,哈希,列表,集合,带范围查询的排序集合,位图,超日志,带有半径查询和流的地理空间索引。Redis 具有内置的复制,Lua 脚本,LRU 逐出,事务和不同级别的磁盘持久性,并通过 Redis Sentinel 和 Redis Cluster 自动分区提供了高可用性。

说说 Redis 有哪些优缺点

优点

  • 性能优异, Redis 能读的速度是 110000 次/s,写的速度是 81000 次/s。

  • 数据持久化,支持 AOF 和 RDB 两种持久化方式。

  • 事务,Redis 的所有操作都是原子性的,同时 Redis 还支持对几个操作合并后的原子性执行。

  • 结构丰富,除了支持 string 类型的 value 外还支持 hash、set、zset、list 等数据结构。

  • 主从复制,主机会自动将数据同步到从机,可以进行读写分离。

缺点

  • 库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此 Redis 适合的场景主要局限在较小数据量的高性能操作和运算上。

  • 宕机,宕机前有部分数据未能及时同步到从机,切换 IP 后还会引入数据不一致的问题,降低了系统的可用性。

  • redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费。

说说为啥要用缓存

主要是为了提高系统的吞吐量,应对高并发,高性能场景

为什么要用 Redis 而不用 map/guava 做缓存?

  • Java 实现的 Map 是本地缓存,如果有多台实例(机器)的话,每个实例都需要各自保存一份缓存,缓存不具有一致性

  • Redis 实现的是分布式缓存,如果有多台实例(机器)的话,每个实例都共享一份缓存,缓存具有一致性。

  • Java 实现的 Map 不是专业做缓存的,JVM 内存太大容易挂掉的。一般用做于容器来存储临时数据,缓存的数据随着 JVM 销毁而结束。Map 所存储的数据结构,缓存过期机制等等是需要程序员自己手写的。

  • Redis 是专业做缓存的,可以用几十个 G 内存来做缓存。Redis 一般用作于缓存,可以将缓存数据保存在硬盘中,Redis 重启了后可以将其恢复。原生提供丰富的数据结构、缓存过期机制等等简单好用的功能。

Redis 为什么这么快

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

2、数据结构简单,对数据操作也简单,Redis 中的数据结构是专门进行设计的;

3、采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗(绝大多数的瓶颈不在 cpu)

4、使用多路 I/O 复用模型,非阻塞 IO;

5、使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis 直接自己构建了 VM 机制 ,使用了 resp 协议

聊聊 resp 协议吧

Redis 是 Redis 序列化协议,Redis 客户端 RESP 协议与 Redis 服务器通信。Redis 协议在以下几点之间做出了折衷:

  • 简单的实现

  • 快速地被计算机解析

  • 简单得可以能被人工解析

其实就是一个二进制的序列化协议,举几个简单的例子哈在 RESP 中,某些数据的类型取决于第一个字节:

“+”代表简单字符串 Simple Strings

“+”代表错误类型

“:”代表整数

基于这种协议的话,其实我们可以自己去实现一个 redis 的客户端

你可能感兴趣的:(后端,redis,java,面试,分布式,经验分享)