服务端2月17日 21:47
Python 描述符是什么?数据描述符和非数据描述符优先级怎么排?描述符是实现了 `__get__`、`__set__`、`__delete__` 中任意一个的类,被赋值给另一个类的类属性后,会拦截那个属性的访问。Python 的属性查找有一套隐藏规则:当解释器在类(及其 MRO)的 `__dict__` 里找到的值是描述符时,不会直接返回它,而是调用描述符的 `__get__` 方法。这就是 `property`、`classmethod`、`staticmethod` 的底层原理——它们都是描述符。
## 追问
### 数据描述符和非数据描述符有什么区别?优先级怎么排?
关键区别是有没有 `__set__`。实现了 `__get__` + `...服务端2月17日 21:49
Python 列表推导式和生成器表达式有什么区别?什么时候该用哪个?区别就一个字:方括号 `[]` 立即算出所有结果放进列表,圆括号 `()` 返回一个生成器对象,用到哪个才算哪个。`[x**2 for x in range(10)]` 执行完内存里就有 10 个数;`(x**2 for x in range(10))` 执行完只多了一个 200 字节的生成器对象,值还没算。
## 追问
### 生成器只能遍历一次,踩过坑吗?
这是最常见的陷阱。你写 `gen = (x for x in range(5))`,第一次 `list(gen)` 得到 `[0,1,2,3,4]`,再 `list(gen)` 就是 `[]`——生成器耗尽了。如果后面的代码...服务端2月17日 20:41
Python 面向对象的核心概念有哪些?MRO 和描述符怎么理解?Python 面向对象的核心是四件事:用类组织数据和行为的封装机制、通过继承复用代码、用多态让不同对象响应同一接口、以及 Python 自己的特殊之处——MRO、描述符、__slots__ 这些面试高频考点。基础概念(类/实例/属性/方法)不展开,下面只说容易踩坑和被追问的部分。
## 追问
### Python 的 MRO 是怎么排的?为什么不用深度优先?
Python 3 用 C3 线性化算法计算 MRO。核心规则:子类排在父类前面,同一层按定义顺序排,不能违反前两条规定。为什么不用深度优先?因为菱形继承下深度优先会重复访问基类。经典例子:D 继承 B 和 C,B 和 C 都继...计算机基础2月19日 14:44
TCP Keep-Alive 机制是什么?为什么还需要应用层心跳?TCP Keep-Alive 是操作系统提供的连接存活检测机制:连接空闲一段时间后,内核自动发探测包,根据对端响应判断连接是否还活着。三个核心参数控制行为——空闲多久开始探测(tcp_keepalive_time,默认 7200 秒)、探测间隔(tcp_keepalive_intvl,默认 75 秒)、探测几次放弃(tcp_keepalive_probes,默认 9 次)。最差情况下,从连接断开到被检测出来要 7200 + 75×9 = 7875 秒,超过 2 小时。
## 追问
### 为什么默认 2 小时这么长?
RFC 1122 建议至少 2 小时,是出于对网络风暴的担忧——...计算机基础2月19日 14:45
什么是 TCP Nagle 算法?为什么会造成 40ms 延迟?Nagle 算法的核心规则只有一条:连接上有未被确认的小包时,不再发新的小包,等 ACK 回来再把缓冲区里的数据攒一起发。目的是减少小包数量——Telnet 按一个键就产生一个 41 字节的包,其中 40 字节是 TCP+IP 头部,有效载荷只有 1 字节,带宽利用率不到 3%。1984 年 John Nagle 在 RFC 896 里提出这个方案,解决的就是交互式应用疯狂发小包导致的广域网拥塞。
算法默认开启(RFC 1122 推荐),通过 TCP_NODELAY 选项关闭。
## 追问
### Nagle 和延迟 ACK 怎么会互相卡死?
Nagle 在发送端等 ACK,延迟...服务端2月19日 13:51
Redis 安全配置怎么做?生产环境加固 checklist 与漏洞防范## 核心回答
Redis 安全配置要从网络隔离、认证授权、数据保护和运行加固四个层面入手。生产环境最低要求三条:绑定内网 IP + 开启密码认证 + 禁用危险命令。做不到这三条,Redis 基本等于裸奔。
2015 年爆发的 Redis 未授权访问漏洞(CVE-2015-4335)让大量服务器被植入挖矿脚本和 SSH 公钥,根源就是默认配置下 Redis 无密码监听所有网卡。这个漏洞至今仍在被批量扫描利用,绝不是历史问题。每次安全加固的第一步,就是确保这三条底线全部到位。
## 网络层隔离
### 绑定监听地址
Redis 默认绑定 `0.0.0.0`,所有网卡都能连,这是最...服务端2月19日 13:30
Redis缓存穿透、击穿、雪崩有什么区别?Redis 缓存策略是使用 Redis 作为缓存时的核心问题,需要解决缓存穿透、缓存击穿、缓存雪崩等问题,同时需要设计合理的缓存更新策略。
## 缓存穿透:查不存在的数据怎么办?
缓存穿透是指查询一个数据库和缓存中都不存在的数据,请求每次都会穿过缓存直接打到数据库。典型场景:攻击者用不存在的 ID 批量请求接口,如 /user/-1。
**方案一:缓存空对象**
当数据库也查不到时,将空值写入缓存并设置短 TTL,避免同一 key 反复穿透。
```java
public User getUserById(Long id) {
User user = redis.get...服务端2月19日 13:50
Redis 如何进行监控和运维?Redis 监控和运维是保障线上稳定性的核心能力,面试中常从"监控哪些指标""用什么工具""遇到问题怎么排查"三个角度考察。
## 关键监控指标
### 内存指标
内存是 Redis 最核心的资源,重点监控以下项:
```bash
INFO memory
# 关键字段
used_memory # Redis 分配器分配的内存
used_memory_rss # 操作系统实际分配的内存
mem_fragmentation_ratio # 内存碎片率 = used_memory_rss / used_memory
maxmemory ...服务端2月19日 13:32
Redis 的过期策略和内存淘汰机制是什么?如何选择合适的策略?Redis 的过期策略和内存淘汰机制是两个不同层面的问题:过期策略决定「过期 key 何时被删」,内存淘汰策略决定「内存不够时删谁」。
## 过期策略
Redis 采用**惰性删除 + 定期删除**的组合策略,不使用定时删除。
**惰性删除**:访问 key 时才检查是否过期。由 `expireIfNeeded()` 函数实现,所有读写命令执行前都会调用。优点是 CPU 友好,缺点是过期 key 若不被访问就永远占内存。
**定期删除**:每秒执行约 10 次(受 `hz` 配置控制),每次随机抽取 20 个设置了过期时间的 key 检查,若过期则删除。若本轮过期 key 超过 ...服务端2月19日 13:29
Redis 主从复制、哨兵和集群模式有什么区别?高可用方案怎么选?Redis 的主从复制、哨兵模式和集群模式是三种不同层次的高可用方案,它们解决的核心问题不同,选择时需要根据业务的数据规模、可用性要求和读写瓶颈来决定。
## 主从复制:解决读瓶颈和数据备份
主从复制是最基础的方案。一个 Redis 节点作为 Master 负责写操作,一个或多个 Slave 节点从 Master 同步数据,只提供读服务。
同步过程分两个阶段:首次连接时 Master 执行 `BGSAVE` 生成 RDB 快照发送给 Slave(全量同步);之后的写命令通过 repl-backlog 缓冲区持续发送给 Slave(增量同步)。如果 Slave 断开时间过长,缓冲区被...