1.Redis 为何这么快?
1.基于内存
2.单线程减少上下文切换,同时保证原子性
3.IO多路复用
2.Redis是如何处理并发访问的?
Redis是单线程的,通过使用I/O多路复用技术将并发请求串行化处理。它的设计目标是尽可能减小锁竞争、提高CPU的利用率,并通过非阻塞I/O降低系统开销。这种设计使得Redis能够高效地处理并发请求。
3.Redis的数据结构有哪些?
Redis支持多种数据结构,包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)以及位图(Bitmap)、地理位置(Geo)等。不同的数据结构适用于不同的场景和用例。
4.Redis的持久化机制是什么?它有哪些优缺点?
Redis支持两种持久化机制:
快照(RDB)和追加日志(AOF)。RDB以二进制形式保存数据库快照,而AOF记录操作日志。优点是RDB备份速度快、AOF提供了更精确的数据恢复,缺点是RDB可能会丢失一部分数据、AOF文件大小相对较大。可以根据需求选择适合的持久化方式。
5.Redis支持哪些数据淘汰策略?
Redis有三种数据淘汰策略,分别是最大内存限制、最小空闲内存和基于时间戳的自动清理。
volatile-lru:当内存不足以容纳新写入数据时,从设置了过期时间的key中使用LRU(最近最少使用)算法进行淘汰;
allkeys-lru:当内存不足以容纳新写入数据时,从所有key中使用LRU(最近最少使用)算法进行淘汰。
volatile-lfu:4.0版本新增,当内存不足以容纳新写入数据时,在过期的key中,使用LFU算法进行删除key。
allkeys-lfu:4.0版本新增,当内存不足以容纳新写入数据时,从所有key中使用LFU算法进行淘汰;
volatile-random:当内存不足以容纳新写入数据时,从设置了过期时间的key中,随机淘汰数据;。
allkeys-random:当内存不足以容纳新写入数据时,从所有key中随机淘汰数据。
volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的key中,根据过期时间进行淘汰,越早过期的优先被淘汰;
noeviction:默认策略,当内存不足以容纳新写入数据时,新写入操作会报错。
6.Redis的主从复制是如何工作的?
答案:Redis使用主从复制来实现数据的备份和高可用性。主节点将写操作同步到所有从节点,而从节点仅用于读取请求。当主节点失效时,从节点可以晋升为新的主节点。这种机制提供了数据冗余和故障恢复的能力。
7.Redis的事务支持是什么样的?
答案:Redis的事务允许客户端发起一系列命令的原子性执行。通过MULTI、EXEC和WATCH指令,可以将多个操作捆绑在一起作为一个事务提交。不过需要注意的是,Redis的事务是乐观锁,并不会实际锁定键。
8.Redis的过期策略
定时过期
每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即对key进行清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。
惰性过期
只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。
定期过期
每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。
9.缓存三大问题以及解决方案
缓存穿透:查询数据不存在
1.缓存空值
2.key 值校验,布隆筛选器
缓存击穿:缓存过期,伴随大量对该 key 的请求
1.互斥锁
2.热点数据永不过期
3.熔断降级
缓存雪崩:同一时间大批量的 key 过期
1.热点数据不过期
2.随机分散过期时间