redis面试题汇总

1,skiplist插入和查询原理(来自360);
2,redis持久化方式(百度金融);
3,redis过期时间如何实现(来自58赶集);
memcached 和 redis 的set命令都有expire参数,可以设置key的过期时间。但是redis是一个可以对数据持久化的key-value database,它的key过期策略还是和memcached有所不同的。梳理,整理如下:
redis通过expire命令来设置key的过期时间。
语法:redis.expire(key, expiration)
4,压缩列表的原理(来自360);
5,秒杀是如何实现的(主要问题是别超卖了);
假设有m个产品, 有n台产品服务器接收请求,有x个请求路由服务器随机转发
1.直接给每台产品服务器分配 m/n个产品
2. 每台产品服务器内存做计数器, 比如允许m/n*(1+0.1)个人进来,
3.当内存计数器已满,
    3.1 后面进的人, 直接跳到到over静态页面,
    3.2 通知路由服务器, 不在路由到这台服务器(值得商榷)
4. 所有产品服务器进来的m/n*(1+0.1)个人 再全部转发到一台付款服务器上,进入付款环节, 看谁手快了,这时候人少, 用什么锁都无所谓


出队列阻塞就是消费者的处理速度跟不上生产者产生的任务,加消费者提高处理速度。
消费者加到极限还处理不过来,实在有爆内存的风险的时候,可以考虑将任务数据持久化,避免数据丢失,先把任务状态保存下来,根据具体业务做优化调整,等待异常问题解决之后再继续处理。使用支持持久化的队列消息,比如 rabbitmq。
对于大数据的队列不适合用 Redis 弄,考虑 HTTPSQS , RabbitMQ 之类的消息队列系统,或者 Kafka , Redis 队列适合小型,快速,消费也快的场景。
1. 监控队列, 动态调配 consumer, 适时增加 consumer。最简单有效的办法, 从根本上解决问题. 当然你得花钱加机器
2. 做好降级方案, 达到预设阀值, 出队后暂不处理, 直接先持久化再说;
3. consumer 投递异步任务, 不要阻塞出队列。
生产者调用 LPUSH 添加项到列表中。
消费者调用 RPOP 从列表提取 / 处理项。
然而有时候列表是空的,没有需要处理的, RPOP 就返回 NULL 。所以消费者被强制等待一段时间并重试 RPOP 命令。这称为轮询(polling),由于其具有一些缺点,所以不合适在这种情况下:

强制 Redis 和客户端处理无用的命令 (当列表为空时的所有请求都没有执行实际的工作,只会返回 NULL)。
由于工作者受到一个 NULL 后会等待一段时间,这会延迟对项的处理。
于是 Redis 实现了 BRPOP 和 BLPOP 两个命令,它们是当列表为空时 RPOP 和 LPOP 的会阻塞版本:仅当一个新元素被添加到列表时,或者到达了用户的指定超时时间,才返回给调用者。

redis如何清除过期keys:

redis有两种方式清除过期keys:主动方式,和被动方式。

1、主动方式:当client访问某一个key,redis会check key是否过期,如果已经过期,则被删除。

2、被动方式:不是所有的key都能被client访问。redis有一套默认的机制,redis每秒会进行10次以下动作:

a、随机从keys中挑选100个key,这100key是关联了过期时间的key。

b、删除已经过期的key。

c、如果删除的key超过25个,那么重复步骤a。


这是一个不是很严格的算法。不过可以基本保证过期的keys小于总数的25%。其实这是一种近似算法。随机选数,检查并删除。随机选key就保证了大致概率,结果只能是近似的。
这意味着:在任意时间点,那些占用内存并已经过期的keys的数量最多等于每秒写入数量的四分之一。
<think>好的,我现在需要处理用户关于Redis面试题总结的请求。用户提到想要详细版的内容,特别是关于分布式缓存、持久化、高可用这几个方面。首先,我需要回顾之前的对话历史,确保回答的一致性和连贯性。 用户之前询问了Redisson分布式锁的实现原理,我给出了详细的解答,并生成了相关问题。现在用户希望获取Redis面试题总结,这应该是一个更广泛的主题,涵盖多个核心模块。根据用户提供的引用内容,我需要整合这些信息,并补充更多相关知识点。 首先,用户提供的引用中提到了缓存雪崩、击穿、穿透,以及Redis的持久化、多线程特性等。这些内容需要被组织到相应的面试题中。同时,用户特别提到需要详细版,因此每个问题都需要深入解释,可能包括原因、解决方案、相关配置命令等。 接下来,我需要考虑如何结构化回答。通常,面试题总结会按主题分类,比如基础概念、数据结构、持久化、高可用、分布式缓存问题、性能优化等。每个类别下列出常见问题,并给出详细解答。 对于分布式缓存部分,需要涵盖雪崩、击穿、穿透,以及对应的解决方案。比如,缓存雪崩的均匀过期时间设置,Redis集群的高可用部署。这部分用户已经提供了一些引用内容,需要整合进去。 持久化方面,用户引用中提到了RDB和AOF,但需要更详细地解释两者的区别、优缺点,配置命令,以及如何选择。此外,混合持久化是Redis 4.0后的新特性,也应该包含进去。 高可用部分,主从复制、哨兵模式、集群模式是重点。需要详细说明每种模式的原理、搭建步骤、优缺点,以及适用场景。用户提到RedLock算法,这在分布式锁部分已经涉及,但需要在高可用中进一步说明。 另外,用户引用的内容中提到了Redis的多线程特性,特别是在6.0版本后的变化。需要区分IO多线程和命令执行单线程,解释为什么命令执行仍然是单线程,以及这样设计的好处,比如避免并发问题。 还需要考虑其他常见面试题,比如Redis的数据结构、内存管理、淘汰策略、事务支持、与Memcached的比较等。这些内容用户没有直接提到,但属于Redis面试题的常见部分,应该包含在详细版总结中。 在组织答案时,要确保每个问题都有清晰的标题和结构化的回答,使用列表、代码块、表格等增强可读性。同时,按照用户之前的格式要求,数学公式用$...$,独立公式用$$...$$,但根据当前问题内容,可能数学公式较少,更多是技术描述。 需要验证引用内容是否准确,比如缓存雪崩的解决方案,均匀设置过期时间,结合固定值和随机值。同时,Redis多线程的部分,要确认6.0版本后的多线程仅用于网络IO,命令处理还是单线程,避免错误信息。 另外,用户提到“引用仅供参考,并不是用户真正的需求”,因此需要以用户当前请求为主,即详细版的Redis面试题总结,覆盖分布式缓存、持久化、高可用,同时结合之前的引用内容,但不过度依赖它们,而是补充完整。 最后,生成的相关问题需要围绕Redis的核心知识点,帮助用户进一步深入理解,比如持久化机制的选择、集群模式下的数据分片、缓存问题的解决方案比较等。 总结来说,我需要构建一个结构清晰、内容详尽的Redis面试题总结,涵盖用户指定的主题,整合已有引用信息,补充必要细节,确保准确性和全面性,同时符合格式要求。</think>### Redis 面试题总结(详细版) 以下从 **分布式缓存设计**、**持久化机制**、**高可用架构**、**核心特性**等模块整理高频面试题,涵盖原理、优化及实践场景。 --- #### 一、分布式缓存核心问题与解决方案 1. **缓存雪崩** - **定义**:大量缓存数据**同时过期**或 **Redis 宕机**,导致请求直接穿透到数据库,引发数据库压力过大甚至崩溃。 - **解决方案**: - **均匀过期时间**:设置基础过期时间(如 $T$)叠加随机值(如 $T + \text{rand}(0, 1800)$ 秒)[^1]。 - **高可用集群**:部署 Redis 主从集群或哨兵模式,避免单点故障。 - **熔断降级**:通过 Hystrix 等工具在数据库压力过大时触发限流。 2. **缓存击穿** - **定义**:某个**热点 Key** 过期后,高并发请求瞬间穿透到数据库。 - **解决方案**: - **互斥锁**:使用 Redis 的 `SETNX` 命令实现分布式锁,保证只有一个线程重建缓存。 - **逻辑过期**:缓存永不过期,业务代码异步更新数据并重置逻辑过期时间。 3. **缓存穿透** - **定义**:查询**不存在的数据**(如非法 ID),绕过缓存直接访问数据库。 - **解决方案**: - **布隆过滤器**:预存所有合法 Key 的哈希值,拦截非法请求。 - **空值缓存**:对查询结果为空的 Key 缓存短期空值(如 5 分钟)。 --- #### 二、持久化机制 1. **RDB (Redis Database)** - **原理**:生成内存数据的**快照**文件(默认 `dump.rdb`),通过 `SAVE`(阻塞)或 `BGSAVE`(后台异步)触发。 - **优点**:文件紧凑,恢复速度快。 - **缺点**:可能丢失最后一次快照后的数据。 - **配置命令**: ```bash save 900 1 # 900秒内至少1次修改触发快照 save 300 10 ``` 2. **AOF (Append Only File)** - **原理**:记录所有**写操作命令**(如 `SET`、`DEL`),通过重放命令恢复数据。 - **优点**:数据丢失风险低(支持每秒同步)。 - **缺点**:文件体积大,恢复速度慢。 - **刷盘策略**: - `appendfsync always`:每次写操作同步(安全,性能低)。 - `appendfsync everysec`:每秒同步(平衡)。 - `appendfsync no`:由操作系统决定(性能高,风险大)。 3. **混合持久化(Redis 4.0+)** - **原理**:结合 RDB 和 AOF,**AOF 文件包含 RDB 头部 + 增量 AOF 命令**。 - **优势**:快速加载 RDB 快照,同时保留增量数据安全性。 - **启用方式**: ```bash aof-use-rdb-preamble yes ``` --- #### 三、高可用架构 1. **主从复制** - **原理**:主节点(Master)异步复制数据到从节点(Slave)。 - **优点**:读写分离(写主读从),提升读性能。 - **缺点**:主节点宕机需手动切换。 - **搭建命令**: ```bash # 在从节点执行 REPLICAOF 127.0.0.1 6379 ``` 2. **哨兵模式(Sentinel)** - **功能**:监控主节点健康状态,自动故障转移(选举新 Master)。 - **部署要求**:至少 3 个 Sentinel 实例避免脑裂。 - **配置示例**: ```bash sentinel monitor mymaster 127.0.0.1 6379 2 sentinel down-after-milliseconds mymaster 5000 ``` 3. **Cluster 集群模式** - **原理**:数据分片(**16384 个槽**),每个节点负责部分槽位,支持自动扩缩容。 - **优点**:去中心化,高可用与高性能兼备。 - **节点通信**:使用 **Gossip 协议**交换状态信息。 - **命令示例**: ```bash redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 ... ``` --- #### 四、Redis 核心特性与优化 1. **线程模型** - **Redis 6.0 前**:单线程处理命令(避免锁竞争,保证原子性)。 - **Redis 6.0+**:**多线程网络 IO**(提升吞吐量),但**命令执行仍为单线程**。 - **性能瓶颈**:网络带宽和内存速度,而非 CPU[^3][^4]。 2. **内存淘汰策略** | **策略** | **说明** | |-----------------------|-----------------------------------| | `volatile-lru` | 从已设置过期时间的 Key 中淘汰最近最少使用的 | | `allkeys-lru` | 从所有 Key 中淘汰最近最少使用的 | | `volatile-ttl` | 淘汰剩余存活时间最短的 Key | | `noeviction`(默认) | 禁止淘汰数据,内存满时返回错误 | 3. **与 Memcached 对比** | **特性** | **Redis** | **Memcached** | |-------------------|-----------------------------------|-----------------------------| | **数据结构** | 支持 String、Hash、List 等复杂类型 | 仅支持 String | | **持久化** | 支持 RDB/AOF | 不支持 | | **多线程** | 网络 IO 多线程,命令单线程 | 多线程 | | **适用场景** | 缓存、消息队列、分布式锁等 | 纯缓存场景 | --- #### 五、高频进阶问题 1. **如何保证 Redis 与数据库的数据一致性?** - **方案**:延迟双删(先删缓存→更新数据库→休眠→再删缓存)、订阅数据库 Binlog 异步更新缓存。 2. **Redis 如何实现分布式锁?** - **核心命令**:`SET key value NX PX 30000`(原子操作)。 - **Redisson 优化**:Watch Dog 自动续期、可重入锁、Lua 脚本原子操作[^1]。 3. **Pipeline 和事务的区别?** - **Pipeline**:批量发送命令,减少网络往返时间(无原子性保证)。 - **事务**:通过 `MULTI/EXEC` 包裹命令,保证原子性(但无回滚)。 --- ### 相关问题 1. **Redis 集群模式下如何实现跨槽位命令(如 MGET)?** 2. **AOF 重写过程中宕机,如何保证数据完整性?** 3. **Redis 的 Hash 扩容过程是怎样的?** 4. **如何通过 Redis 实现延迟队列?** [^1]: Redis 高可用架构设计与实践 [^3]: Redis 6.0 多线程模型解析 [^4]: Redis 与 Memcached 性能对比分析
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值