Redis经典面试题

使用场景

image-20250302163913165

缓存

缓存穿透

image-20250302164028568

image-20250302164404573

布隆过滤器主要用于拦截不存在的数据

image-20250302164238043

image-20250302164326120

通过设置误判率来减少误判

image-20250302164520493

image-20250302164530491

缓存击穿

热门数据过期

image-20250302164638751

image-20250302164935831

逻辑过期是在缓存中添加一个过期时间的字段,而不再给key设置过期时间

互斥锁:强一致、性能差

逻辑过期:高可用、性能优

image-20250302165102098

image-20250302165116941

缓存雪崩

image-20250302165639914

image-20250302165711889

image-20250302165722570

image-20250302165851168

双写一致性

image-20250302165945892

image-20250302171326251

image-20250302171829371

两种情况都可能出现脏数据的问题

第二次删除缓存就是为了防止脏数据的情况出现

image-20250302172001293

延时的时间不好控制,也容易出现脏数据的风险

image-20250302172143392

使用Redis一般是读多写少的情况

image-20250302172303689

image-20250302172312705

读写锁:强一致,但是性能低

image-20250302172526400

image-20250302172602335

image-20250302172749563

image-20250302172759283

image-20250302172806342

持久化

image-20250302172843244

RDB:

image-20250302172951668

image-20250302173202730

AOF:

image-20250302173226934

image-20250302173300914

image-20250302173404225

比较:

image-20250302173559912

image-20250302173607850

数据过期策略

image-20250302173726377

惰性删除

image-20250302173802701

定期删除

image-20250302173912054

Redis的过期删除策略:惰性删除 + 定期删除两种策略进行配合使用

image-20250302174012328

image-20250302174018857

数据淘汰策略

image-20250302174103720

image-20250302174236107

使用建议

image-20250302174349728

场景题

image-20250302174450213

image-20250302174512730

image-20250302174523388

分布式锁

image-20250302210003368

image-20250302210129232

但是synchronized是本地的锁,锁只在一个JVM上生效,如果是多个服务器,则还是会出现超卖的情况

image-20250302210339253

Redis分布式锁

image-20250302210637492

image-20250302210807656

image-20250302210904192

lua脚本通过调用Redis命令,可以保证多条命令执行的原子性。

image-20250302211246302

可重入需要判断当前加锁的是否是同一个线程

image-20250302211413513

如果还没来得及同步数据,主节点宕机了,会在从节点中选择一个作为新的主节点,之前的数据没同步过来,所以新的线程也能加锁成功,就可能出现两个线程同时持有同一把锁。

解决方法

image-20250302211720489

image-20250302211832334

image-20250302211844385

其他面试题

集群

image-20250302211940044

主从复制

image-20250302212041329

image-20250302212946839

image-20250302213108369

image-20250302213208307

image-20250302213216783

哨兵模式

作用:

image-20250302213336244

image-20250302213502887

image-20250302213621213

老的master还被客户端写入新的数据,当老的master变成slave,需要同步新的master数据,导致自身的数据被覆盖丢失。

image-20250302213811643

image-20250302213939483

image-20250302213957455

分片集群

结构:

image-20250302214143217

image-20250302214246640

image-20250302214329224

image-20250302214337754

Redis是单线程的,但是为什么还那么快

image-20250302214459913

用户空间和内核空间

image-20250302214806742

主要影响性能的原因主要是等待数据和数据的来回拷贝

阻塞IO

image-20250302214955931

非阻塞IO

image-20250302215035696

IO多路复用

image-20250302215216917

image-20250302215310819

Redis网络模型

image-20250302215848063

多线程的使用主要减少了网络IO对性能的影响

image-20250302221509735

image-20250302221516847