ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[TOC] # **自我介绍** ``` 您好, 我是董金鑫,本科计算机专业, 之前工作主要做的是: 1. 做为出口跟外部业务 啥的去对接需求 2. 主要做一些api接口这类的,去跟携程 美团 之类对接接口 3. 服务端的一些开发 之前有做过toB项目(会议服务平台模块化的项目 跟大型的企业去对接), toC项目(即刮彩彩票直播平台,gp投资服务平台,大王商城项目) ``` # **实际项目相关问题** ***** ### **一个项目是怎样做的?** ### **第三方接口加密?** > 微信加密流程: > 1.签名算法 > 第一步:将发送/接受的数据按照ASCII码字典序排列,使用url键值对格式拼接成字符串。 > 第二步:再将刚生成的字符串拼接上用户自己的密钥key,然后进行md5加密,加密后再将字符串所有的字母转化为大写字母。 > 携程加密流程: > 1.通过接口,使用接入账号和密码获取令牌ticket > 2.再通过令牌进行用户单点登录,检验身份是否合法。 > 生成签名Signature方式是,将发送的数据参数值按照携程规定的顺序拼接,再拼接上md5后的接入密码(AppSecurity)值,生成字符串,再将新字符串MD5. # **php** ***** ### **php7和php5的区别?** > 1、性能提升:PHP7比PHP5.0性能提升了两倍。 > 1.1.变量存储字节减小,减少[内存](http://www.solves.com.cn/it/yj/nc/)占用,提升变量操作速度 1.2.改善数组结构,数组元素和hash映射表被分配在同一块内存里,降低了内存占用、提升了 cpu 缓存命中率 1.3.改进了函数的调用机制,通过优化参数传递的环节,减少了一些指令,提高执行效率 > 2、以前的许多致命错误,现在改成抛出异常。 > 3、PHP 7.0比PHP5.0移除了一些老的不在支持的SAPI(服务器端应用编程端口)和扩展。 > 4、PHP 7.0比PHP5.0新增了空接合操作符。 > 5、PHP 7.0比PHP5.0新增加了结合比较运算符。 > 6、PHP 7.0比PHP5.0新增加了函数的返回类型声明。 > 四种不同的返回类型可用-bool,int,string和float。 > 7、PHP 7.0比PHP5.0新增加了标量类型声明。 > 8、PHP 7.0比PHP5.0新增加匿名类。 > 9、错误处理和64位支持 ### **垃圾回收机制?** > 本质是引用计数 > php5.3之前判断垃圾的标准是看:是否有变量名指向变量容器zval,也就是说看refcount是否等于0,若没有则认为是垃圾释放掉。 > 但是会因为环形引用,产生内存泄漏。 > 所以从php5.3开始的GC中,对垃圾的说明如下, > 1.当refcount增加的时候,肯定不是垃圾,不用放到缓冲区中。 > 2.当refcount减少到0的时候,肯定是垃圾,zval会被立即释放,不是GC处理的垃圾对象不会进入缓冲区 > 3.当refcount减少之后大于0的时候,可能是垃圾,会进入缓冲区进入处理。 ### **大文件读取上传?** ### **isset和empty的区别?** ### **session与cookie的区别?** 1、cookie数据存放在客户的浏览器上,session数据放在服务器上。 2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗    考虑到安全应当使用session。 3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能    考虑到减轻服务器性能方面,应当使用COOKIE。 4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。 ### **session共享?** ### **session_Id的传递方式?** > 1.使用post方式传递, 隐藏表单 > 2.通过url传参的方式 > 3.header() > 4.文件形式 > 在生成session文件的代码中获取session\_id并将其写入文件中,那么其他页面可以通过获取该文件内的session\_id,进而获取session文件中的内容 > session.use\_only\_cookies=1 > session.use\_trans\_sid=0 ### **常见的加密算法?** > 对称加密:加密与解密**密钥相同** > `DES`、加密算法是一种**分组密码**,以`64`位为**分组对数据**加密,它的**密钥长度**是`56`位,**加密解密**用**同一算法** > `3DES`:基于`DES`的**对称算法**,对**一块数据**用**三个不同的密钥**进行**三次加密**,**强度更高** > `AES`:该加密算法采用**对称分组密码体制**,密钥长度的最少支持为`128`位、`192`位、`256`位,分组长度`128`位,算法应易于各种硬件和软件实现。这种加密算法是美国联邦政府采用的**区块加密标准**。 > 非对称加密:加密密钥与解密**密钥不同** > `RSA`、`DSA` > 散列算法:**不需要密钥** > `SHA-1`:比`MD5`的**安全性更强**,对于长度小于`2 ^ 64`位的消息,`SHA1`会产生一个`160`位的**消息摘要**。 > `MD5`:都会输出长度为`128bits`的一个串 (通常用`16`**进制**表示为`32`个字符)。 ### **常见php框架的优缺点(结合实际项目使用感受)?** # **数据库** ***** ### **explain的几个重要参数?** ### **事物的隔离级别?** > read uncommitted(读取未提交的) > read committed(读取已提交的) > repeatable read(可重复读) > serializable(串行化) 脏读 不可重复读(需要行锁) 幻读(需要表锁) 不可重复读侧重于修改,幻读侧重于新增或删除 show global variables like ‘tx\_isolation’;查看mysql的默认事务隔离级别 select @@ tx_isolation 查看当前会话的隔离级别 select @@ global.tx_isolation 查看系统的隔离级别 set session transtion isolatin level serializable 设置当前会话的隔离级别 set global trastion isolation level serializable 设置系统的隔离级别 ### **联合索引?** ``` abc 只能命中 a, ab, abc三种其余都不可命中。 ac 只能命中a ``` ### **InnoDB 和 MysIAM的区别?** > 1. i支持事物,M不支持 > 2. i支持外键,M不支持 > 3. i是聚集索引(B+树),M是非聚集索引 > 4. i不保存表的具体行数,m保存集体的行数的 > 5. i5.7之前不支持全文索引 之后支持了,M支持全文索引 > 6. i有行(默认),表级锁 m是只有表锁 > 7. i必须有主键, > 8. i支持奔溃后的安全恢复, m不支持 > 9. Innodb存储文件有frm、ibd,而Myisam是frm、MYD、MYI > Innodb:frm是表定义文件(show table status 查看的相关信息),ibd是数据文件 > Myisam:frm是表定义文件,myd是数据文件,myi是索引文件 ### **sql语句优化方案?** ![](https://img.kancloud.cn/e1/da/e1da79d7554c2d071622aeeeeb7d08f2_2422x1430.jpg) ### **数据库优化方案?** ``` (1)、根据服务层面:配置mysql性能优化参数; (2)、从系统层面增强mysql的性能:优化数据表结构、字段类型、字段索引、分表,分库、读写分离等等。 (3)、从数据库层面增强性能:优化SQL语句,合理使用字段索引。 (4)、从代码层面增强性能:使用缓存和NoSQL数据库方式存储,如MongoDB/Memcached/Redis来缓解高并发下数据库查询的压力。 (5)、减少数据库操作次数,尽量使用数据库访问驱动的批处理方法。 (6)、不常使用的数据迁移备份,避免每次都在海量数据中去检索。 (7)、提升数据库服务器硬件配置,或者搭建数据库集群。 (8)、编程手段防止SQL注入:使用JDBC PreparedStatement按位插入或查询;正则表达式过滤(非法字符串过滤); ``` ![](https://img.kancloud.cn/4f/c4/4fc46aa916946f1a3e28d3a2dec008e5_627x465.png) # **redis** ### **redis的各种类型和应用场景?** > string > 缓存功能 计数器(视频播放器) > hash > list > 双向链表 > 点赞 回复 > set > 数据没有顺序,并且每一个值不能重复 > 去重 抽奖(srandmember) > zset > 有序的 > 排行榜 延时任务 ### **redis+lua?** > $redis->eval($lua,array('key1','key2','first','second'),2) > redis拓展执行脚本,第一个是脚本代码,第二个是一个数组,参数数组,第三个参数是个整数,表示第二个参数中的前几个键名参数,剩下的都是附加参数 > [EVALSHA](http://redis.readthedocs.org/en/latest/script/evalsha.html#evalsha "(in Redis 命令参考 v2.8)") SCRIPT LOAD通过构建函数名,直接调用 Lua 中已定义的函数,从而执行相应的脚本 ### **lua的8数据类型以及和redis类型的转化?** 1 number 实数 ,可以是整数,浮点数 2.string 字符串,一旦赋值不能被修改,可以通过方法string.gsub()来修改 3.nil 全局变量没被赋值默认为nil,删除变量就赋值为 nil 4.boolean(bool) false 和nil为假 ,其它都为真 5.function 函数 6.table 数组、容器 7.userdata (类,其它语言转换过来就变成userdata类型) 8.thread 线程 ### **redis和memcache的区别?** > **数据结构不同** Memcache对数据类型支持相对简单。 Redis有复杂的数据类型。 > **存储方式** > memcache把数据全部存在内存之中,断电会挂掉,数据不能超过内存大小 > Redis有部份存在硬盘上,这样能保证数据的持久性 > 使用RDB快照的方式,将内存中的数据不断写入磁盘;或使用类似MySQL的AOF日志方式,记录每次更新的日志 > **内存管理机制不同** >redis 当物理内存用完时,Redis可以将一些很久没用到的value交换到磁盘,Redis只会缓存所有的key的信息 (实现:Redis发现内存的使用量超过了某一个阀值,将触发swap的操作,Redis根据“swappability = age\*log(size\_in\_memory)”计算出哪些key对应的value需要swap到磁盘。然后再将这些key对应的value持久化到磁盘中,同时在内存中清除) >memcache >它首先从操作系统申请一大块内存,并将其分割成各种尺寸的块Chunk,并把尺寸相同的块分成组Slab Class。其中,Chunk就是用来存储key-value数据的最小单位。每个Slab Class的大小,可以在Memcached启动的时候通过制定Growth Factor来控制 >redis >为了方便内存的管理,在分配一块内存之后,会将这块内存的大小存入内存块的头部(ret_ptr zmalloc.h和zmalloc.c两个文件) >定义一个数组(zmalloc_allocations)来记录所有的内存分配情况,这个数组的长度为ZMALLOC\_MAX\_ALLOC\_STAT。数组的每一个元素代表当前程序所分配的内存块的个数,且内存块的大小为该元素的下标. zmalloc.c中有一个静态变量used\_memory用来记录当前分配的内存总大小 > **数据持久化支持不同** >Redis虽然是基于内存的存储系统,但是它本身是支持内存数据的持久化的,而且提供两种主要的持久化策略:RDB快照和AOF日志。而memcached是不支持数据持久化操作的。 >**过期策略的不同** >memcache在set时就指定 >Redis可以通过例如expire 设定 >**灾难恢复的不同** >memcache挂掉后,数据不可恢复; redis数据丢失后可以通过aof恢复 >**线程模型的不同** >redis(单线程) >内部使用文件事件处理器 `file event handler`,这个文件事件处理器是单线程的,所以 redis 才叫做单线程的模型。它采用 IO 多路复用机制同时监听多个 socket,将产生事件的 socket 压入内存队列中,事件分派器根据 socket 上的事件类型来选择对应的事件处理器进行处理 >其中文件处理器包括:多个 socket, IO 多路复用程序,文件事件分派器,事件处理器(连接应答处理器、命令请求处理器、命令回复处理器) >memcache >单进程多线程模型,通过主进程分发给work线程 >**应用场景的不同** >Redis出来作为NoSQL数据库使用外,还能用做消息队列、数据堆栈和数据缓存等; >Memcached适合于缓存SQL语句、数据集、用户临时性数据、延迟查询数据和session等。 备选答案: > **主从模式** Redis支持主从模式的应用 > **value大小** > Redis单个value的最大限制是1GB,而Memcached则只能保存1MB内的数据 > **性能方面** > redis只能使用单核,而memcache可以使用多核,所以在比较上,平均每一个核上redis在储存小数据时比memccache性能更高。而却100K以上数据中,memcache性能要高于redis,虽然redis最近也在储存大数据的性能上进行优化,但是比起memcached还是有点逊色。 > **开销方面** > 1.Memcached的内存管理不像Redis那么复杂,元数据metadata更小,相对来说额外开销就很少。 > 2. Memcached唯一支持的数据类型是字符串string,非常适合缓存只读数据,因为字符串不需要额外的处理。 >**使用底层模型不同** > 它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。 > Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。 ### **为啥redis效率那么高?** > * 纯内存操作。 > * C 语言实现,一般来说,C 语言实现的程序“距离”操作系统更近,执行速度相对会更快。 > * 核心是基于非阻塞的 IO 多路复用机制。 > * 单线程反而避免了多线程的频繁上下文切换问题,预防了多线程可能产生的竞争问题。 ### **redis的垃圾回收?** > 定期删除+惰性删除+内存淘汰机制 > 定期删除:隔100ms`随机`抽取设置了过期时间的key,并对其进行检查,如果已经过期则删除 > 惰性删除:每次获取key时会对key进行判断是否还存活,如果已经过期了则删除。 > Redis配置文件中可以设置maxmemory,内存的最大使用量,到达限度时会执行`内存淘汰机制` > 内存淘汰机制: > volatile-lru 从已设置过期时间的数据集中挑选最近最少使用的数据淘汰 volatile-lfu 从已设置过期时间的数据集中挑选最不经常使用的数据淘汰 volatile-ttl 从已设置过期时间的数据集中挑选将要过期的数据淘汰 volatile-random 从已设置过期时间的数据集中挑选任意数据淘汰 allkeys-lru 当内存不足写入新数据时淘汰最近最少使用的Key allkeys-random 当内存不足写入新数据时随机选择key淘汰 allkeys-lfu 当内存不足写入新数据时移除最不经常使用的Key no-eviction(默认)当内存不足写入新数据时,写入操作会报错,同时不删除数据 # **kafka** ***** ### **常见配置?** [https://blog.csdn.net/m0\_37989911/article/details/103667412](https://blog.csdn.net/m0_37989911/article/details/103667412) *log.dirs*:Kafka把所有的消息都保存在磁盘上,存放这些数据的目录通过log.dirs指定。 *num.partitions*: 每个新建主题的分区个数。这个参数一般要评估,比如,每秒钟要写入和读取1GB数据,如果现在每个消费者每秒钟可以处理50MB的数据,那么需要20个分区,这样就可以让20个消费者同时读取这些分区,从而达到设计目标。 ### **Kafka 存储在硬盘上的消息格式是什么**? > 消息由一个固定长度的头部和可变长度的字节数组组成。头部包含了一个版本号和 CRC32 > 校验码。 > 消息长度: 4 bytes (value: 1+4+n) > 版本号: 1 byte > CRC 校验码: 4 bytes > 具体的消息: n bytes ### **Kafka 判断一个节点是否还活着有那两个条件***? (1)节点必须可以维护和 ZooKeeper 的连接,Zookeeper 通过心跳机制检查每个节点的连接 (2)如果节点是个 follower,他必须能及时的同步 leader 的写操作,延时不能太久 ### **ZooKeeper 的作用***? > zookeeper 是一个分布式的协调组件,早期版本的kafka用zk做meta信息存储,consumer的消费状态,group的管理以及 offset的值。考虑到zk本身的一些因素以及整个架构较大概率存在单点问题,新版本中逐渐弱化了zookeeper的作用。新的consumer使用了kafka内部的group coordination协议,也减少了对zookeeper的依赖, > 但是broker依然依赖于ZK,zookeeper 在kafka中还用来选举controller 和 检测broker是否存活等等。 ### **数据传输的事物定义有哪三种***? > 最多一次: 消息不会被重复发送,最多被传输一次,但也有可能一次不传输 > (2)最少一次: 消息不会被漏发送,最少被传输一次,但也有可能被重复传输. > (3)精确的一次(Exactly once): 不会漏传输也不会重复传输,每个消息都传输被一次而 > 且仅仅被传输一次,这是大家所期望的 ### ****Kafka 的设计时什么样的呢*****? > Kafka 将消息以 topic 为单位进行归纳 > 将向 Kafka topic 发布消息的程序成为 producers. > 将预 topics 并消费消息的程序成为 consumer. > Kafka 以集群的方式运行,可以由一个或多个服务组成,每个服务叫做一个 broker. > producers 通过网络将消息发送到 Kafka 集群,集群向消费者提供消息 ### **Kafka中是怎么体现消息顺序性的** > kafka每个partition中的消息在写入时都是有序的,消费时,每个partition只能被每一个group中的一个消费者消费,保证了消费时也是有序的。 > 整个topic不保证有序。如果为了保证topic整个有序,那么将partition调整为1. # **操作系统和网络** ***** ### **从用户输入地址到解析到页面过程?** > 1. 用户在浏览器中输入地址; > 2. 解析ip地址; 先看本地hosts有没有记录,有直接返回没有则通过DNS获取域名对应的ip地址 > 3. 将http请求发送到nginx服务器(建立tcp链接) > 4. nginx根据访问的url和后缀判断请求是否是静态资源,如是直接返回,如果是动态内容 > 5. nginx会将请求分发给fastcgi,fastcgi 会通过fastcgi_pass将请求发送给php-fpm,php-fpm接受到请求后会启动worker进程处理请求,处理完进程后会将结果返回给nginx > 6. nginx再通过http返回给浏览器 fastcgi(快速通用网关接口) fastcgi_pass(127.0.0.1:9000) php-fpm(进程管理器 是 FastCGI 的实现,并提供了进程管理) ### **git常用命令?** > **提交** > git init > git add > git commit -m > git push > **合并分支** >git branch 新建分支 git checkout 切换分支 git merge 合并分支 git branch -d 删除分支 **撤销** git revert HEAD 撤销前一次commit git reset --hard 撤销所有本地修改 git reset --hard HEAD^撤销所有本地到上一次修改 git reset --soft HEAD 撤销上一次commit,将commit的文件撤回暂存区 > 要是想撤销到上上次,就是HEAD^^ ,以此类推。 > git revert 是撤销某次操作,此次操作之前的commit都会被保留 > git reset 是撤销某次提交,但是此次之后的修改都会被退回到暂存区 ### **nginx和apache的区别?** # **数据结构和算法** ***** ### **常见的数据结构?** 数组,栈,链表,队列,树,图,堆,散列表 > **数组** > 可以再内存中连续存储多个元素的结构,在内存中的分配也是连续的 > 栈(先进后出) > 队列(先进先出), > 链表 > 一个是存储元素的数据域 (内存空间),另一个是指向下一个结点地址的指针域 > 树 > 由n个有限节点组成一个具有层次关系的集合 **图** 由结点的有穷集合V和边的集合E组成 有向图和有向图 **堆** 看做一棵树的数组对象 堆中某个节点的值总是不大于或不小于其父节点的值; 堆总是一棵完全二叉树。 **散列表** 是根据关键码和值 (key和value) 直接进行访问的数据结构 # **系统设计和架构** ***** ### **负载均衡是什么?常见算法?** > 部署多台服务器,将用户的请求分发到不同的服务器用来提高网站、应用、数据库或其他服务的性能以及可靠性 > **轮询**:为第一个请求选择健康池中的第一个后端服务器,然后按顺序往后依次选择,直到最后一个,然后循环。 > **最小连接**:优先选择连接数最少,也就是压力最小的后端服务器,在会话较长的情况下可以考虑采取这种方式。 > **散列**:根据请求源的 IP 的散列(hash)来选择要转发的服务器。这种方式可以一定程度上保证特定用户能连接到相同的服务器。如果你的应用需要处理状态而要求用户能连接到和之前相同的服务器,可以考虑采取这种方式。 ### **如果让你实现一个秒杀系统,或者抢票系统,你想怎么做(论述方案就行)?你会哪些关键的点?怎么处理?** ![](https://img.kancloud.cn/6a/07/6a0734b95186e5699294e5505a794312_800x459.png) # **linux** ***** ### **linux常用命令?** ``` 文件管理 1.chmod 修改权限 chomd 777 file.txt 2.chown 修改所属者 chown root file.txt 压缩管理 3.tar 压缩:tar -cvf 包名.tar.gz 源文件 解压:tar -zxf 包名 4.unzip 解压:unzip 包名 进程管理 5.crontab -e ***** 分时曰月周 * 都 1-3 1点到3点 1,3 1,3点 /4 每隔4分钟 6.ps 查看当前运行进程 (ps aux) 7.top 查看资源利用 8.kill kill -9 进程号 网络管理 9.curl curl 链接 例: http://www.linux.com >> linux.html 10.netstat 显示各种网络相关信息 netstat -antp 11.wget 下载资源 wget 链接 12. sed 替换 ```