高级部分

1、有没有用过Linux?都用它来做什么?

Linux是一个长时间运行比较稳定的操作系统,所以我们一般会拿它作为服务器(web,db,app等)。
Linux本身具有C语言编译环境,我们的一些软件包(Redis,nginx等)需要在Linux编译环境编译得到软件包。

2、说一下Linux中的一些常用命令

  • 常用命令:
    pwd:获取当前路径
    cd: 调转到目录
    su -u:切换到管理员
    ls:列举目录
  • 文件操作命令:
    tail:查看 文件
    rm -r:删除文件
    vi:删除文件

3、怎么操作Linux服务器?

  • 怎么连接远程服务器?
    需要依赖于Linux服务器安装ssh服务器,一般ssh服务器端口为22。
    然后使用ssh客户端(putty、xshell)连接Linux服务器。这有点像windows下面的远程连接,但是Linux通过ssh连接上以后是没有图形界面的,全是命令行。
  • 怎么上传文件到远程服务器?
    需要依赖于Linux服务器安装sftp服务器,一般sftp服务器端口为25。
    然后使用sftp客户端(winscp、xftp)来连接sftp服务端,来上传和下载文件(安装包,修改的文件等)。
    企业常用组合:
    putty+winscp
    xshell+xftp=xmanger

4、有没有使用过云主机?

云主机就是一些云服务运营商(阿里,华为,西部数码,新浪等)提供的远程服务器功能。我们开发者或者企业只需按需付费就可以租用对应的服务器。使用ssh和sftp来进行操作。

5、有没有做过数据库优化方面的事情?

  • 查找、定位慢查询并优化:
    (1) 创建索引:创建合适的索引,我们就可以先在索引中查询,查询到以后直接找对应的记录。
    (1) 当一张表的数据比较多或者一张表的某些字段的值比较多并且很少使用时,采用水平分表和垂直分表来优化。
    (3)读写分离:当一台服务器不能满足需求时,采用读写分离的方式进集群。
    (4) 缓存:使用Redis来进行缓存。
    (5) 一些常用的优化技巧。

6、如何查找并定位慢查询?

在项目自验或项目转测试之前,在启动MySQL数据库时开启慢查询,并且把执行慢的语句写到日志中,在运行一段时间后,通过查看日志找到慢查询语句。使用explain慢查询语句,来详细分析语句问题。

7、数据库表设计时需要遵循的范式?

首先符合1NF,才能满足2NF,进一步满足3NF。

  • 第一范式(1NF):是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。(列数据的不可分割
  • 第二范式(2NF):要求数据库表中的每个行必须可以被唯一区分,为实现区分通常需要为表加上一列,以存储每个行的唯一标识。(主键
  • 第三范式(3NF):要求一个数据库表中不包含在其它表中以包含的非主关键字信息。(外键
    反三范式:有时为了提高效率,可以设置重复或者可以推导出的字段。

8、选择合适的存储引擎

  • 在开发中我们常使用的存储引擎有:myisam、innodb、memory。
    myisam存储引擎:
    如果表对事务要求不高,同时是以查询和添加为主的,我们考虑使用mysiam存储引擎。比如bbs中的发帖表、回复表。
    innodb存储引擎:
    对事务要求高,保存的数据都是重要数据,我们建议使用innodb,比如订单表、账号表。
    memory存储引擎:
    数据变化频繁,不需要入库,同时又频繁的查询和修改,我们考虑使用memory,速度极快。
  • mysiam和innodb的区别?
    (1) 事务安全:mysiam不支持事务而innodb支持事务。
    (2) 查询和添加速度:mysiam不用支持事务就不用考虑同步锁,查找和添加的速度快。
    (3) 支持全文索引:mysiam支持innodb不支持。
    (4) 锁机制:mysiam支持表锁而innodb支持行锁(事务)。
    (5) 外键:mysiam不支持外键,innodb支持外键。

9、数据库索引

  • 分类:普通索引、唯一索引、主键索引、全文索引
    普通索引:允许重复的值出现。
    唯一索引:出了不能有重复的记录外,其他和普通索引一样。
    主键索引:是随着设定主键而创建的,也就是把某个列设为主键的时候,数据库就会给该列创建索引。这就是主键索引,唯一且没有null值。
    全文索引:用来对表中的文本域(char、varchar 、ext)进行索引。

10、索引使用小技巧

  • 索引弊端:
    (1) 占用磁盘空间。
    (2) 对dml(插入、删除、修改)操作有影响,变慢。
  • 使用场景:
    (1) 在经常使用的where条件中。如果不做查询就没有意义。
    (2) 该字段的内容不是唯一的几个值。
    (3) 字段内容不是频繁变化。
  • 具体技巧:
    (1) 对于创建的多行索引(复合索引),不是使用的第一部分就不会创建索引。
    (2) 对于使用like的查询,查询如果是‘%aaa’不会使用索引,而‘aaa%’会使用索引。
    (3) 如果条件中有or,有条件没有使用索引,即使其中有条件有索引也不会使用。换言之,就是要求使用的所有字段,都必须单独使用时能使用索引。
    (4) 如果列类型是字符串,那一定要在条件中将数据使用引号引起来,否则不使用索引。
    (5) 如果mysql估计使用全表扫描要比使用索引快,则不使用索引。

11、数据库优化之分表

  • 水平分表和垂直分表
    水平分表:根据经验,mysql表数据一般达到百万级别,查询效率会很低,容易造成表锁,甚至堆积很多连接,直接挂掉。水平分表能很大程度减少这些压力。
    垂直分表:如果一张表中某个字段值非常多(长文本、二进制等),而且只有在很少的情况下回查询,这时候就可以把这些字段单独放到一个表中,通过外键关联起来。
  • 水平分表策略
    按时间分表:这种分表方式有一定的局限性,当数据有较强的时效性。如微博发送记录、微信消息记录等,这种数据很少有用户查询几个月前的数据,就可以按月分表。
    按区间分表:一般在有严格的自增ID需求上,如按照user_id水平分表。
    hash分表:通过一个原始目标的ID或者名称通过一定的hash算法计算出数据存储表的表名,然后访问相应的表。

12、数据库优化之读写分离

一台数据库支持的最大并发连接数是有限的,如果用户并发访问太多,一台服务器满足不了需求时就可以集群处理。mysql的集群处理技术最常用的就是读写分离。
主从同步:
数据库最终会把数据持久化到磁盘上,如果集群必须确保每个服务器的数据是一致的。能改变数据库数据的操作都往主数据库上去写,而其它的数据库从主数据库上同步。
读写分离:
使用负载均衡来实现写的操作都往主数据库去,而读的操作都往从数据库上去。

13、数据库优化之缓存

在持久层(dao)和数据库(DB)之间添加一个缓存层,如果用户访问的数据已经缓存起来,在用户访问时直接从缓存中获取,不用访问数据库。而缓存是在操作内存级,访问速度快。
作用:减少数据库服务器压力,减少访问时间。
java中常用的缓存有:
(1) hibernate的二级缓存,该缓存不能完成分布式缓存。
(2) 可以使用Redis、memcache等来作为中间缓存,对缓存的数据进行集中处理。

14、语句优化小技巧

  • DDL优化:
    (1) 通过禁用索引来提高导入数据性能。
    (2) 关闭唯一校验。
    (3) 修改事务提交方式(导入)。
  • DML优化:
    合并多条语句为一条。
  • DQL优化:
    (1) order优化:多用索引排序。
    (2) group by 优化:使用order by null,取消默认排序。

15、批量插入几百万条数据怎么实现?

(1) 变多次提交为一次。
(2) 使用批量操作。
省出的时间非常可观。像这样的批量插入操作能不使用代码操作就不使用,可以使用存储过程。

16、Redis是什么?

Redis是一个key-value的nosql数据库,先存到内存中,会根据一定的策略持久化到磁盘,即使断电也不会丢失数据,支持的数据类型比较多。
主要用来做缓存数据库和web集群时当做中央缓存存放session。

17、Redis的使用场景

  • 缓存:
    把经常需要查询的、很少修改的数据,放到读速度很快的空间(内存),以便下次访问减少时间,减轻压力。
  • 计数器:
    Redis中的计数器是原子性的内存操作,可以解决库存溢出问题。
  • session缓存服务器:
    web集群时作为session缓存服务器。
  • 缓存队列等

18、Redis存储对象的方式

  • json字符串
    需要把对象转换成json字符串,当做字符串处理。直接使用set和get来设置和获取 。
    优点:设置和获取比较简单。
    缺点:没有提供专门的方法,需要把对象转换成json。(jsonlib)
  • 字节
    需要做序列化,就是把对象序列化为字节保存。

19、Redis数据淘汰机制

在Redis中允许用户设置最大使用的内存大小server_maxmemory,在内存限定的情况下是很有用的。比如在一台8g机子上部署四个Redis服务点,每一个服务点分配1.5g的内存,减少内存紧张的情况,由此获取更为稳健的服务。
Redis提供6中数据淘汰策略:
默认为no-eviction策略
(1) volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰。
(2) allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰。
(3) volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰。
(4) volatile-random:从已设置过期时间的数据集。(server.db[i].expires)中任意选择数据淘汰。
(5) allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰。
(6) no-enviction:禁止驱逐数据,永远不过期,仅对写操作返回一个错误,默认为该项。

20、java访问Redis和Redis集群

  • java访问Redis
    (1) 使用jedis java客户端访问Redis服务器,优点类似通过jdbc访问mysql一样。
    (2) 如果是和spring进行集成时,可以使用spring data来访问Redis,spring data是对jedis的二次封装。相当于jdbctemplate和jdbc关系一样。
  • Redis集群
    当一台数据库无法满足需求时,可以使用Redis来集群处理,类似于mysql的读写分离。

21、微信公众号分类和微信开发原理

  • 微信公众号分类
    公众号:个人和企业都可以申请
    服务号:企业才能申请
    企业号:企业才能申请
  • 微信开发原理
    微信公众平台开发者通过接入认证的方式,让我们的服务器能处理来自微信服务器转发的微信用户的请求,处理完成后返回给微信服务器,由微信服务器向对用户响应。

22、怎么把微信和业务平台进行绑定?

如何让微信用户和注册用户绑定,让微信用户也能完成注册用户的功能?
用户注册实体中包含一个微信字段,当进行绑定时就是修改用户的微信号字段。当然我们是无法直接获取微信号的,需要通过微信网页授权来获取微信号。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这篇文章主要涉及到MySQL的知识点: 索引(包括分类及优化方式,失效条件,底层结构) sql语法(join,un...
    一根薯条阅读 7,741评论 0 8
  • 索引 数据库中的查询操作非常普遍,索引就是提升查找速度的一种手段 索引的类型 从数据结构角度分 1.B+索引:传统...
    一凡呀阅读 8,142评论 0 8
  • 易说就懂|道听途说 原意不是传播小道消息,而且急于显摆学问。 原文:道听而涂说,德之弃也。 “涂”同“途”。”道听...
    雍善先生阅读 1,618评论 0 2
  • 翠蔓绿树村边合,汽车尾气天天闻。
    曈月阅读 1,040评论 0 0
  • 今天进入尾周末,我一点也不开心,原因说不清楚:不争取、放弃、没时间观念、麻木、自甘堕落、自我放逐,这几个同学的放弃...
    邓慧娟阅读 825评论 0 0