每天一套面试题Day17-小米高频(3)
13.Redis中的Zset怎么实现的?
小林
小林压缩列表(ziplist)-连续内存卡组成的顺序型(节约内存)
- ziplist: 在 ziplist 中,成员(member) 和 分值(score) 是成对依次存放的。并且,所有元素会按照分值从小到大进行排序。
- skiplist :一个 skiplist 编码的 Zset,在 Redis 底层实际上是由 一个字典(Dict) 和 一个跳跃表(Skip List) 共同构成的数据结构。 字典(Dict)能够在 O(1) 时间复杂度内直接通过成员名找到其分值。
跳跃表(Skip List) 作用:提供以分值为基础的排序功能,支持 O(logN) 复杂度的插入、删除、查找以及范围查询。
[小林Listpack](https://xiaolincoding.com/redis/data_struct/data_struct.html#listpack
- Listpack 压缩列表存在问题连锁更新->Listpack(列表包)(在删除或更新元素时可能会引发连锁更新(cascade update)。因为每个entry中存储了前一个entry的长度(prevlen),而prevlen本身是变长的(1字节或5字节)。当某个entry被更新或删除时,如果导致下一个entry的prevlen字段长度发生变化,那么就可能需要连续地更新多个entry。在最坏情况下,需要重新分配整个ziplist。)
取消前向指针,解决连锁更新。 每个 entry 的结构:编码类型+数据 + 整个 entry 的总长度(encoding-type 字段的长度+element-data 字段的长度+ element-total-len 字段本身的长度)
14.说说Redis的大key,为什么会产生大key?
小林大key
Redis大key指存储超大值(如字符串过大、集合元素过多)的键。
第一,设计阶段的不合理。
数据模型不当:比如在做社交项目时,把一个百万粉丝的大V的所有粉丝ID存成一个Set,这个Key就会巨大无比。或者在电商场景,把一场热门活动的所有商品ID塞进一个List。
职责边界不清:没有清晰界定Redis和MySQL的职责,把本该由数据库承担的海量数据存储和复杂查询,图方便都塞进了Redis。
第二,开发阶段的不良习惯。
滥用聚合数据:比如把一个用户的所有信息(基础信息、扩展属性、偏好设置)全部序列化后存成一个巨大的String,或者用一个巨大的Hash来存,而不是进行合理的拆分。
对于单个会增长的集合,缺乏有效的清理机制(如长度控制、时间淘汰)会导致它本身膨胀成大Key。而没有设置TTL会让这个问题更加严重,因为即使这个Key已经不再使用,它也会永久占用内存。
15.什么是进程和线程?进程和线程的区别?
进程是操作系统中资源分配的基本单位,线程是进程中执行的基本单位,进程拥有独立的内存空间,而线程共享进程的内存空间和资源。
- 资源开销 进程:创建和切换开销大。 线程:创建和切换开销小。
- 通信方式 进程:通过进程间通信(IPC)进行数据交换,如管道(父子进程之间),共享内存,消息队列,命名管道(FIFO)(可以在无亲缘关系的进程间)套接字(网络通信) 线程:通过共享内存直接通信,速度快但需注意同步。
16.建索引时需注意哪些事项?
建索引时需注意以下事项:首先,选择合适的列进行索引,优先考虑经常用于查询条件、排序和连接的列;其次,避免在频繁更新的列上建立索引,以减少维护开销;此外,控制索引的数量,过多的索引会影响写入性能(当数据变更时,数据库需要更新所有相关的索引);同时,注意索引的选择性,选择性高的索引能更有效地过滤数据;最后,定期分析和优化索引,以适应数据和查询模式的变化
17.如何评估 / 判断索引是否生效?常见索引失效场景有哪些?
评估索引是否生效需“三看”:看执行计划是否命中索引(EXPLAIN)、看扫描行数是否骤降(rows)、看查询耗时是否锐减(性能监控);
失效:
- 索引列用函数/参与计算
- 最左前缀原则
- LIKE以通配符 % 开头
- 使用 OR 连接条件,如果 OR 连接的条件中有一个列没有索引,那么整个查询可能无法使用索引。
- 使用 NOT IN, <>, != 操作符 这些否定操作符通常难以利用索引,因为它们代表的是一个非常大的范围,数据库倾向于全表扫描。
18.MySQL 中的 MVCC 是什么?Read View 在 MVCC 中如何工作?如果没有 MVCC 会怎样?
MVCC 是 InnoDB 实现高并发的核心技术,它通过维护数据的多个版本来让读写操作不再相互等待。 Read View 是 MVCC 的“裁判”,它定义了一套清晰的规则,来决定在某个特定时刻,一个事务能看到哪些数据版本。 没有 MVCC,读写冲突加剧、性能骤降、死锁频发。 我的博客详解
#面试真题#记录刷过的面试真题

查看26道真题和解析