2022面试总结
💡 根据 遗忘曲线:如果没有记录和回顾,6天后便会忘记75%的内容,读书笔记正是帮助你记录和回顾的工具,不必拘泥于形式,其核心是:记录、翻看、思考
日常工作怎么优化sql?
- 查询必要的列;
- 尽量使用覆盖索引;
- explain查询分析调整sql语句,添加索引;
- 主从架构,提升读性能;
- 分库分表;
- 在高并发情况下的查询操作,可以使用缓存(如 Redis)代替数据库操作,提高并发性能;
- 表字段比较复杂、易变动、结构难以统一的情况下,可以考虑使用 Nosql 来代替关系数据库表存储,如 ElasticSearch、MongoDB;
redis常用的数据类型有哪些?
字符串(strings),散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) ,范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询;
- 字符串使用场景:缓存数据、计数器、共享session;
- 哈希 hash使用场景:对象存储;
- 列表使用场景:消息队列、热销榜;
- 集合使用场景:标签、社交相关;
- 有序集合使用场景:排行榜、延迟队列;
各数据的使用场景可参考:https://mp.weixin.qq.com/s/-3fcK4WspGk6SEsaVrdx8A
redis持久化有几种方式?
Redis 支持 RDB 和 AOF 两种持久化机制,持久化功能有效地避免因进程 退出造成的数据丢失问题,当下次重启时利用之前持久化的文件即可实现数据恢复。
- RDB 是一次全量备份,AOF 日志是连续的增量备份, RDB 是内存数据的二进制序列化形式,在存储上非常紧凑,而 AOF 日志记录的是内存数据修改的指令记录文本。
- AOF 以独立日志的方式记录每次写命令, 重启时再重新执行 AOF 文件中的命令达到恢复数据的目的。AOF 的主要作用 是解决了数据持久化的实时性,目前已经是 Redis 持久化的主流方式。
AOF 日志在长期的运行过程中会变的无比庞大,数据库重启时需要加载 AOF 日志进行指令重放,这个时间就会无比漫长。所以需要定期进行 AOF 重写,给 AOF 日志进行瘦身。
常见的限流算法:
- 固定窗口(计数器算法);
- 滑动窗口;
- 漏桶算法;
- 令牌桶算法;
PHP垃圾回收机制:
https://www.php.net/manual/zh/features.gc.php
- 变量容器在”refcount“变成0时就被销毁. 当任何关联到某个变量容器的变量离开它的作用域(比如:函数执行结束),或者对变量调用了函数 unset()时,”refcount“就会减1。
- 由于数组元素“1”仍然指向数组本身,所以这个容器不能被清除 。因为没有另外的符号指向它,用户没有办法清除这个结构,结果就会导致内存泄漏。庆幸的是,php将在脚本执行结束时清除这个数据结构,但是在php清除之前,将耗费不少内存。
InnoDB和MyISAM的区别:
- InnoDB支持事务,MyISAM不支持;
- InnoDB支持外键,MyISAM不支持;
- InnoDB支持表锁、行锁,MyISAM只支持表锁;
- InnoDB是聚集索引,MyISAM是非聚集索引。
Mysql如何处理死锁?
当并发系统中不同线程出现循环资源依赖,涉及的线程都在等待别的线程释放资源时,就会导致这几个线程都进入无限等待的状态,称为死锁。
- 等待超时,可以通过参数innodb_lock_wait_timeout来设置;
- 开启死锁检测,通过innodb_deadlock_detect=on 进行设置,那么当InnoDB 发现有死锁发生时,直接回滚其中一个事务。
如何避免死锁:降低并发、拆分逻辑。
B+tree和hash区别:
https://mp.weixin.qq.com/s/qHJiTjpvDikFcdl9SRL97Q
Mysql 有哪些日志及作用描述:
- undo log(回滚日志),InnoDB引擎特有的日志,保证了事务的原子性;
- redo log(重做日志),InnoDB引擎特有的日志,保证了事务的持久性;
- binlog(归档日志),MySQL的Server层实现的,所有引擎都可以使用;
Mysql分库分表:
常见的http状态码:
[https://www.zhihu.com/search?type=content&q=HTTP%20%E7%8A%B6%E6%80%81%E7%A0%81](https://www.zhihu.com/search?type=content&q=HTTP 状态码)
301 | Moved Permanently | 永久性重定向 |
---|---|---|
302 | Found | 临时性重定向 |
304 | Not Modified | 资源未修改 |
403 | Forbidden | 禁止访问 |
404 | Not Found | 找不到资源 |
405 | Method Not Allowed | 请求方法不允许 |
502 | Bad Gateway | 从远程服务器接收到了一个无效的响应 |
504 | Gateway Timeout | 响应超时 |
trait的理解:
为了减少单继承语言的限制,实现代码复用;