数据库大致分为关系型数据库和非关系型两种。在面试过程中问到的比较多的就是mysql和redis了,在这里整理了一下,分享给大家。

主要问的问题可以分为以下几类:搭建、使用、原理。

1、搭建

搭建的问题主要以某个细节来考察你是否真的操作和应用过,来看你的学习能力和动手实践能力。

比如:在你搭建完mysql,他就已经支持事务吗?


对于这个问题,你直接回答是或者不是,都是不对的。首先对于mysql常用引擎innodb和myisam来说,只有innodb是支持事务的。所以只有在mysql的默认存储引擎是innodb的时候才是支持事务的。


mysql不同版本的默认存储引擎是不同的。在ITOO中,我们使用的数据库是5.1.57,他是默认myisam的。但在mysql-5.6中,就变成了innodb了。具体的版本支持功能可以看mysql的官网 http://www.mysql.com/

当然redis方面也会问一些操作的问题,比如搭集群的时候需要配置哪些参数,出现哪些问题,是如何解决的等等。


小结:多操作多了解很重要


2、使用

使用方面可以分为基本操作和高级应用。基本操作一般不会问,有点太浪费大家的时间了,主要集中在高级应用方面。

mysql侧重于优化、主从复制、读写分离、分区分表等等,redis主要还是问集群,也会问与memcached的比较。


比如:项目中mysql的读写分离是怎么做的?


千万不能简单粗暴的说主写从读,这样就掉坑里了。比如主宕机了没办法写怎么办,从宕机没办法读了怎么办,主从都没宕机复制延迟了怎么办?对于写完数据马上要读的操作如何处理?


比较好的例子是一台读写数据库和一台读数据库,只能做到缓解一定程度的读的压力,而更多的读的压力一般都靠redis这样的nosql产品来缓解。


另外一种就是项目中使用的数据库中间件myCat,这样开发人员不需要考虑哪个库是读哪个库是写,将这些事情统统交给myCat去做。

比如:项目中分区分表是怎么做的?


多大的数据量要考虑分区分表?为什么要用?是横切还是纵切?


比如:有没有用mysql集群,数据量多大考虑用集群,用几个?


基本上只有主备。

小结:不要把高深的技术都罗列上去,你要判断自己了解的程度


3、原理

这部分内容在平时项目中很少能接触到,但了解这部分原理,既能体现自己的学习深度和能力,也能帮助我们解决项目中遇到的问题。


比如:redis和memcached的设计思想?


redis的哈希槽设计,现在有三主,如果加一台进来,哈希槽怎么分配?


redis如何实现一个key的值可以超过1M


主要涉及到了redis内存分配、LRU算法、数据存储、分片集群等内容,这些东西如果只从网上看博客的话,有点不太靠谱了,还是看官方的文档。最好自己学一下源码,毕竟代码是最不会骗人的。


而且这部分内容蕴含了很多设计的思想,很值得一看。