晓夏

北漂的女孩

Good Luck To You!

常见的技术问题

浏览量:379

mysql

  1. innodb myisam区别

(1)事务处理:

        MyISAM是非事务安全型的,而InnoDB是事务安全型的(支持事务处理等高级处理);

(2)锁机制不同:

        MyISAM是表级锁,而InnoDB是行级锁;

(3)select ,update ,insert ,delete 操作:

        MyISAM:如果执行大量的SELECT,MyISAM是更好的选择
        InnoDB:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表

(4)查询表的行数不同:

        MyISAM:select count(*) from table,MyISAM只要简单的读出保存好的行数,注意的是,当count(*)语句包含   where条件时,两种表的操作是一样的
        InnoDB : InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行
(5)外键支持:

        mysiam表不支持外键,而InnoDB支持

索引,聚簇索引,索引原理,为什么使用b+树,和b树的区别。最左原则,多个索引如何选择使用哪个

    表级锁,行级锁,共享锁,排它锁,乐观锁,悲观锁。

    为什么需要锁(并发控制):

         在多用户环境中,在同一时间可能会有多个用户更新相同的记录,这会产生冲突。这就是著名的并发性问题。

         典型的冲突有:
        1.丢失更新:一个事务的更新覆盖了其它事务的更新结果,就是所谓的更新丢失。例如:用户A把值从6改为2,用户B把值从2改为6,则用户A丢失了他的更新。
        2.脏读:当一个事务读取其它完成一半事务的记录时,就会发生脏读取。例如:用户A,B看到的值都是6,用户B把值改为2,用户A读到的值仍为6

    表级锁:开销小,加锁快。不会出现死锁,锁定粒度大,冲突高,并发底

    行级锁:开销大,加锁慢。会出现死锁,颗粒度小,冲突底,并发高

    共享锁:
          A:begin:   SELECT * from city where id = "1"  lock in share mode;

         B:update  city set name="666" where id ="1";  报错,A必须先comment

         lock in share mode

        加上共享锁后,也提示错误信息了,通过查询资料才知道,对于update,insert,delete语句会自动加排它锁的原因

    排它锁: 排它锁与共享锁相对应,就是指对于多个不同的事务,对同一个资源只能有一把锁。

                与共享锁类型,在需要执行的语句后面加上for update就可以了


    乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。乐观锁不能解决脏读的问题。

               update 表名称 set value = newValue,version =  versionValue + 1   where version = versionValue;

    悲观锁:对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态

               select … for update


  1. 事务隔离级别,grap锁

    1. 事务隔离级别脏读不可重复读幻读
      读未提交(read-uncommitted)
      不可重复读(read-committed)
      可重复读(repeatable-read)
      串行化(serializable)


      事务的基本要素

    2. 原子性:要么全部成功,要么全部失败

    3. 一致性:事务开始前后,两个任务是隔离的

    4. 隔离性:同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干

    5. 持久性: 事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

      事务的并发问题

        1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据

     2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。

     3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

  2. 分库分表,日期分表的优点和缺点


linux

  1. 日志统计。。uniq -c 或者 awk

  2. 常用的负载指标查询。htop top: cpu  内存    glances:  io 网卡

图片.png



php

  1. zval结构体

    PHP每一个变量都放在zval变量容器中,zval变量容器中是不仅包含变量和值,还需要包含is_ref和refcount这两个值。is_ref:变量是否属于引用集合;refcount:指向变量容器的个数

  2. 垃圾回收,如何解决循环引用 (引用计数)

    php5.2 :引用计数

    php5.3是引用计数为基础,新增同步回收算法。不简简单单的依靠计数来作为准则。

              php5.3特性:a.并不是每次refcount减少都会进入回收周期,必须在根部缓存区域满的时候才开始垃圾收回

                                   b.可以解决循环引用的时候内存泄漏问题

                                   c.可以把内存泄漏控制在一个阈值之下  


  3. php与垃圾收回相关的配置

    php.ini中的zend.enable_gc来打开或关闭PHP的垃圾回收机制,也可以通过调用gc_enable()或gc_disable()打开或关闭PHP的垃圾回收机制。在PHP5.3中即使关闭了垃圾回收机制,PHP仍然会记录可能根到根缓冲区,只是当根缓冲区满额时,PHP不会自动运行垃圾回收,当然,任何时候您都可以通过手工调用gc_collect_cycles()函数强制执行内存回收。                        

  4. trait(php5.4以后,实现了代码的复用)

     Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait   为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait   和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题。

    Trait 和 Class 相似,但仅仅旨在用细粒度和一致的方式来组合功能。   无法通过 trait 自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用的几个 Class 之间不需要继承。

    例子:

    <?php
    trait ezcReflectionReturnInfo {
        function 
    getReturnType() { /*1*/ }
        function 
    getReturnDescription() { /*2*/ }
    }

    class 
    ezcReflectionMethod extends ReflectionMethod {
        use 
    ezcReflectionReturnInfo;
    }

    class 
    ezcReflectionFunction extends ReflectionFunction {
        use 
    ezcReflectionReturnInfo;
    }
    ?>

  5. 生成器,yield(php5.5.0以后)

    优点:生成器对PHP应用性能有很大的影响

               PHP运行代码的时候能节省大量的内存

               比较适合计算大量的数据



  6. 魔术方法 (设计模式:单例、工厂、观察者)

  7. php-fpm如何优化配置

    a.nginx使用unix的socket通信(Nginx和php-fpm在同一个机器上)

       Unix域Socket因为不走网络,的确可以提高Nginx和php-fpm通信的性能,但在高并发时会不稳定

       Nginx会频繁报错:connect() to unix:/dev/shm/php-fcgi.sock failed (11: Resource temporarily unavailable) while connecting to upstream

       提高高并发时候的稳定性

              1.调高nginx下php-fpm的backlog

                方法:在nginx配置文件中,在域名server下,在listen 80后面添加default backlog=1024

                            还需要配置php-fpm.conf中的listen.backlog为1024,默认128

               2.增加sock文件和php-fpm实例数目

                    新建sock文件,在nginx中通过upstream模块将请求负载均衡两个sock文件背后的两套php-fpm上

     b.使用Opcode缓存

     c.php-fpm参数调优

         pm = dynamic;表示使用那种进程数量管理方式

         dynamic是动态管理,static是静态管理;

          pm.max_children = 300; 静态方式下开启的php-fpm进程数量
        pm.start_servers = 20; 动态方式下的起始php-fpm进程数量
      pm.min_spare_servers = 5; 动态方式下的最小php-fpm进程数量
      pm.max_spare_servers = 35; 动态方式下的最大php-fpm进程数量

          对于内存服务器来说,静态的管理更为妥当,这样不需要进行额外的进程数目控制,会提高效率。因为频繁关闭php-fpm的进程也会有时滞,所以内存够大的情况下开静态效果会更好,数量也可以根据内存/30Mdeidao ,比如8GB内存可以设置100个,php-fpm耗费2G-3G的样子,如果内存较小1G,那么指定静态的进程数更加有利于服务器的稳定,这样可以保证php-fpm只能获取够用的内存,将不多的内存分配给其他的应用,这样系统用会更流畅


  8. 说下fastcgi/cgi,php运行原理(sapi/php/扩展/zend引擎)




nginx

  1. nginx工作原理(epoll多路复用),为什么有惊群,如何解决。worker单线程如何高并发, io模型,ET和LT区别,ET为什么必须使用NIO

  2. location的匹配规则有几种,分别是? break和last区别(nginx rewrite)

  3. 反向代理

网络

  1. 输入一个url到返回结果的过程,越详细越好。哪个过程可以优化

  2. https原理

  3. 三次握手四次挥手,tcp头,滑动窗口和拥塞控制,time_wait

  4. cookie session  自定义session   使用那些函数    存在tmp 

  5. 解释下csrf和场景,怎么预防

  6. http浏览器缓存相关

mc redis

  1. 二者区别

     redis不仅仅支持key-value,而且支持各种数据格式,有序集合、集合、哈希、列表、事务等

     redis支持主从模式应用

     redis支持数据持久化

  2. redis应用场景 ,redis过期键删除的策略

     string:key=>value的方式,场景;用于点赞计数,评论计数,关注数,微博数

     hash哈希场景;存储部分变更数据,如用户信息等

     list列表场景;消息队列系统

    set无序集合场景:可以自动去除重复,可以非常方便的实现如共同关注、共同喜好、二度好友等功能Set是集合,

    是String类型的无序集合,set是通过hashtable实现的,概念和数学中个的集合基本类似,可以交集,并集,差集等等,set中的元素是没有顺序的

    sorted set有序集合场景:

    redis过期键删除的策略:

          a.定时删除,可以保证过期的键尽快删除,并释放出来键所占有的内存。缺点:对cpu时间不友好,删除过期的键需要占有一定的cpu时间,如果cpu比较紧张,无疑会对服务器的响应时间和吞吐量造成影响。

          b.惰性删除,用户在获取某个key的时候才会监测并删除,这样不会浪费cpu的时间,缺点:对内存不友好,如果键过期,数据库还会保留

          c.定期删除,结合定期和惰性删除,一段时间就会定期删除全部的键,并限制删除的时长和频率对cpu很友好,

    redis真实使用的是,定期和惰性测试


  3. mc内存结构

    基本信息:slab:memcahce最小的单位,最大的存储容量是1M

                    slabclass:是特定大小的chunk数组

                    chunk:缓存的内存空间, 一个slab被划分若干个chunk组

                    item:存储数据的最小单元,每一个chunk都会包含一个item

                    factor:增长因子,默认为1.25,相邻slab中的item大小与factor成比例关系


  4. redis持久化AOF和RDB区别 ,各自的机制是怎样的

       AOF持久化日志的形式:每一个操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。

       RDB持久化:指定时间内吧内存的数据快照写入磁盘,实际操作过程是fork一个子进程,先将数据写入临时文件,成功后替换之前文件

     


  5. redis字符串和c字符串区别

     redis字符串SOS:获取字符串的复杂程度是O(1)

                                    api是安全的,不会造成缓存溢出

                                    空间是预分配(根据分配策略),惰性空间释放,最多N次

                                    保存二进制或者文本数据,根据的len的长度而不是\o

                                    可以使用string库中一部分的函数

        c字符串:获取字符串的复杂程度是O(N)

                       api是不安全的,或造成缓存的溢出

                       修改字符串N次就会造成N次内存的修改

                       只能保存文本数据

                        可以使用string库中的全部函数

其他

  1. topk 问题

     topk之单节点(根据值排序,根据频率排序)

     topk之多节点

     实时topk低请求率

     实时topk高请求率

     Approx topk

     mapredeuce

  2. 分布式系统设计唯一自增uuid

  3. 如何设计一个日志系统

  4. 如何设计一个站内信,基于角色和用户,如何给大批量用户发站内信

  5. 亿级用户,并且保证线性增长,如何使用redis设计存储用户的高可用高扩展系统

  6. 如何设计微信红包

  7. 队列应用场景,好处,接口幂等性设计

最后

  1. 各种业务场景的架构设计和技术选型,高可用与容错容灾。

  2. 要抓住每个业务的核心点才是最关键的。

  3. 技术的广度深度高度。

  4. 数据结构和算法。



神回复

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。