高级java开发工程师面试题之-----redis篇

本文详细介绍了Redis的单线程或多线程设计,缓存策略(包括缓存穿透、击穿、雪崩及其解决方案),内存淘汰策略,如何保证原子性,以及Redis的主从同步问题和数据结构。还讨论了分布式锁实现和Redisson工具的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

全是干货,话不多说,开整!

1 redi是单线程还是多线程

        

2 缓存穿透、缓存击穿、缓存雪崩

       缓存击穿:redis中没有找个数据,压力给到了DB。多线程下可能100个线程同时查询到了数据库,

        缓存击穿:热点key过期,没有被缓存的数据(代码根本不会缓存到redis)

        缓存雪崩:大批量的热点key过期,大批量的没有被缓存的数据

怎么解决? 传统办法上锁,抢到锁得线程去查询DB,再更新到redis中,没抢到的自旋或者等待。  另一个办法可以使用布隆过滤器(面试官可能会问到布隆过滤器原理 做好准备,此处不做解释,别问为什么,因为我还没来得及研究源码)

3、redis key过期策略(容易与内存淘汰策略混淆)

过期策略通常有以下三种:
1.定时过期
每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。
2.惰性过期
只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。
3.定期过期
每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。
Redis中同时使用了惰性过期和定期过期两种过期策略。

4、redis 内存淘汰策略

        首先说为什么要有内存淘汰策略

        有了以上过期策略的说明后,就很容易理解为什么需要淘汰策略了,因为不管是定期采样删除还是惰性删除都不是一种完全精准的删除,就还是会存在key没有被删除掉的场景,所以就需要内存淘汰策略进行补充。

        每进行一次redis操作的时候,redis都会检测可用内存,判断是否要进行内存淘汰,当超过可用内存的时候,redids 就会使用对应淘汰策略。

1. noeviction:当内存使用超过配置的时候会返回错误,不会驱逐任何键

2. allkeys-lru:加入键的时候,如果过限,首先通过LRU算法驱逐最久没有使用的键

3. volatile-lru:加入键的时候如果过限,首先从设置了过期时间的键集合中驱逐最久没有使用的键

4. allkeys-random:加入键的时候如果过限,从所有key随机删除

5. volatile-random:加入键的时候如果过限,从过期键的集合中随机驱逐

6. volatile

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值