1、讲下redis
答:非关系型数据库;本质上是一个key-value类型的内存数据库
支持String、Hash、List、Set、zset(sorted set:有序集合)这五种数据类型,redis持久化;RDB和AOF
RDB持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB持久化过程分为手动触发和自动触发
AOF(append only file)持久化:以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中命令达到恢复数据的目的。AOF的主要作用是解决了数据持久化的实时性,目前已经是Redis持久化的主流方式。
redis架构模式:
单机版、主从复制、哨兵、集群
redis相关的还有缓存雪崩和缓存穿透
缓存穿透:是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透
解决方法:
一、布隆过滤
二、缓存空对象. 将 null 变成一个值
缓存雪崩:如果缓存集中在一段时间内失效,发生大量的缓存穿透,所有的查询都落在数据库上,造成了缓存雪崩。
解决方法:
一、数据预热,设置不同的过期时间,让缓存失效的时间点尽量均匀
二、做二级缓存,或者双缓存策略
三、加锁排队
2、 讲下mysql,除了增删改查,mysql讲一下
答:
数据库优化
首先要根据需求写出结构良好的SQL,然后根据SQL在表中建立有效的索引。但是如果索引太多,不但会影响写入的效率,对查询也有一定的影响
根据数据库三范式来进行表结构的设计。设计表结构时,就需要考虑如何设计才能更有效的查询。
mysql索引数据结构是B+树;
索引优化方式
避免过度索引
避免重复和冗余索引
删除不需要使用的索引
复合索需要引遵循最左原则
合理使用短索引
避免索引失效
sql语句优化
在表中建立索引,优先考虑where、group by使用到的字段
尽量避免使用select *,返回无用的字段会降低查询效率;优化方式:使用具体的字段代替*,只返回使用到的字段。
尽量避免使用in 和not in,会导致数据库引擎放弃索引进行全表扫描;优化方式:如果是连续数值,可以用between代替;如果是子查询,可以用exists代替;
尽量避免在where条件中等号的左侧进行表达式、函数操作,会导致数据库引擎放弃索引进行全表扫描。
尽量避免进行null值的判断,会导致数据库引擎放弃索引进行全表扫描,需求调节允许的话,可以给字段添加默认值0,对0值进行判断
3、讲下索引数据结构
答:mysql索引的数据结构是树,常用的存储引擎innodb采用的是B+Tree
4、你登录了,但操作的时候有时候重定向,怎么确定是哪个用户登录的,登录的数据是从哪里取的?
session中
5、Session 怎么实现信息共享?
6、讲下cookie和session
答:cookie:
在客户端保存数据,不安全,别人可以分析保存在本地的cookie进行cookie欺骗。
只能保存字符串,且是少量数据
session:
在服务端保存数据,安全
可以保存对象数据,数据无限制(但,当访问过多,会比较占服务器的性能)
一般情况下,session生成的sessionid都是保存在cookie中
7、你的搜索模块,你搜索的时候,执行流程是怎样的?就是从前端到后端再到前端的实现流程?
8、联合索引
答:如果你经常要用到多个字段的多条件查询,可以考虑建立联合索引,一般是除第一个字段外的其它字段不经常用于条件筛选情况,比如说a,b 两个字段,如果你经常用a条件或者a+b条件去查询,而很少单独用b条件查询,那么可以建立a,b的联合索引。如果a和b都要分别经常独立的被用作查询条件,那还是建立多个单列索引
9、你们实例有多少个?
该点属于部署问题
10、如果你写登录这模块的话,你的思路是怎样的?
11、说下你知道的数据结构
答:数组,栈,链表,队列,树,图,堆,散列表等
12、红黑树特点
13、平时有看专业相关书籍吗?说几个书名。
14、简历上的项目相关的问题,问写你的模块等等