欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

整理的面试题及其答案

程序员文章站 2022-03-02 22:09:02
...

2、MySQL的锁并发?

并发产生的问题:1、脏读
                            2、不可重复读
                            3、幻读
MySQL中会使用锁来解决并发问题,MySQL中的锁分为排他锁喝共享锁,具体来说就是写锁和读锁,具体实现为,当一个sql语句进行写操作时加一个排他锁,防止其它线程操作数据库,保证写操作的安全。当一个sql语句进行读操作时会加一个共享锁,被加了共享锁的数据可以被其它线程进行读操作。共享锁还增大了多线程操作的并发量。
多版本的并发控制(MVCC):在InnoDB中引擎中是增加两个列,分别为更新版本号和删除版本号。每进行一次事务系统的版本号都加1.
死锁产生的条件:1、互斥条件,共享资源在同一时刻只能由一个操作单元持有。
                            2、不可剥夺条件,在一个操作单元持有时共享资源时,其它资源都不能剥夺共享资源,只能等待该操作单元释放共享资源。
                            3、请求与保持条件,一个操作单元在不是放当前共享资源的情况下去请求其它的互斥共享资源。
                            4、循环等待条件,多个操作单元持有互斥共享资源并请求其它互斥共享资源。
避免死锁方法:1、破坏造成死锁的四个条件
                        2、使用更低的隔离级别
                        3、拆分事务
                        4、使用更强大的存储引擎b并添加合适的索引

3、高并发场景下如何防止死锁,保证数据的一致性?

避免死锁方法:1、破坏造成死锁的四个条件
                        2、使用更低的隔离级别
                        3、拆分事务
                        4、使用更强大的存储引擎b并添加合适的索引。
如何保证数据的一致性:
                                      使用乐观锁,乐观锁有两种方式,版本控制以及CAS,每次更新数据时都会对version字段进行比较,若是当前对应的数值,则执行更新,若不是则重新查询数据再执行更新语句。通过比较与交换,update user set age=1 where age=2

4、集群和负载均衡的算法与实现?

负载均衡的五种算法 :一致性哈希算法:通过一定的算法,hash%2^32,这时这个点会在一个圆环上,然后沿顺时针遇到的第一个服务器就是该请求分配的服务器
                                轮询法:按照顺序进行分配,加入有十台服务器,那么发送的请求都会按照顺序分配给每台服务器,分配十个请求后再重新按顺序依次分配
                                加权轮询法:对每个服务器分权重,权重高的服务器分配的请求更多。
                                随机法:通过随机生成数来选取一个服务器
                                加权随机法:给每个服务器分配权重,获取权重更高的服务器,然后进行分配

5、简述分库与分表设计?。

分库分表的策略是提升单表的查询性能。
设计:1、分表是在一个数据库里对表进行拆分,分库是不同的库放的都是一样的表,这样的分库类似与主从库
            2、因此分库分表结合在一起就是在分库的同时进行分表,每个库中的表都存一部分数据,这样表不管多大都能增加库来负载这个数据量,但是数据的添加和获取需要一定的规则,常见的有散列、取模、范围区间等,可以用第三方框架来实现,比如mycat。
    设计分库分表的时候,可以按照数据量去设计,比如1-1000放在一个库中,1001-2000放在一个库,依次类推,可以在后面查询时快速定位到某个库。
分库分表的缺点:对于查询某个数据,可以很快的确定某个库,然后返回数据,但是对于做数据的统计会很慢,因为统计的话需要每个库都去遍历,数据量大的情况下不如一个库的效率好。针对这种情况,可以将数据汇总到一个仓库中,在仓库中进行统计,可以使用ES来实现。,海量数据可以做成大数据。
分库分表时也要实现高可用:每个库中都存在一张表,如果一个库宕机,则这个库数据就会请求失败,针对这种情况需要实现高可用来保障数据的正常查询,此时我们可以给每个库设置一个从库,这样每个主库出现问题,从库可以接替主库,同时还可以做读写分离,增加数据库的负载量。
最后的问题是在mycat中,已经处理好即使数据库出现问题也能保证数据的正常,但是如果mycat出现问题,那么所有的数据库都无法访问,所以就要保证mycat也要高可用,可以启动多个mycat,通过框架进行负载均衡。
垂直分表:对于表中字段过多的问题,可以使用垂直分表拆分表结构,将不经常使用以及长度较大的字段拆分成一个表。
垂直分库:在垂直分库中按照业务模块来划分不同的数据库,而不是将所有模块的数据表都放到一个数据库中。
水平分表:对于数据量过大的数据表,单表的操作已经会影响正常的使用,这时候采用水平分表,将数据按照一定的规律分布到不同的数据库表中,这样来降低单表的数据量,以此来提高性能。但是这样的水平分表依然是保存在同一个数据库中,所以还是会存在IO瓶颈。
水平分库分表:水平分库分表跟分表的策略相似,不同的是将拆分的表分布在不同的数据库中,在高并发和海量数据下,分库分表能缓解单库以及单表的压力,但是也会出现相应的问题,跨片的复杂查询、跨分片事务等。
分库分表难点:1、跨库join的问题:
                                解决方法:1、使用全局表,对于系统中所有模块读可能依赖到的表,将这些表都在每个数据库中做保存一份,
                                                2、字段冗余:这是一种反范式的做法,在用户商家表中可以新增一个company_name字段,这样在用户连接商家时使用商家名称可以直接使用商家名称而不需要再查询商家表。这是一种空间换时间的做法。
                                                3、数据同步:比如在A库中user_a表和B库中的user_b表关联,因此可以定时将指定的表做一个表同步。
                                                4、系统层组装:在系统层面调用不同的模块或者服务,获取到数据进行字段拼装。
                        2、跨库事务的问题:将业务拆分之后,不可避免就会出现分布式事务的问题,

6、分库分表带来的分布式困境与对应之策有哪些?

    分库分表难点:1、跨库join的问题:
                                解决方法:1、使用全局表,对于系统中所有模块读可能依赖到的表,将这些表都在每个数据库中做保存一份,
                                                2、字段冗余:这是一种反范式的做法,在用户商家表中可以新增一个company_name字段,这样在用户连接商家时使用商家名称可以直接使用商家名称而不需要再查询商家表。这是一种空间换时间的做法。
                                                3、数据同步:比如在A库中user_a表和B库中的user_b表关联,因此可以定时将指定的表做一个表同步。
                                                4、系统层组装:在系统层面调用不同的模块或者服务,获取到数据进行字段拼装。
                        2、跨库事务的问题:将业务拆分之后,不可避免就会出现分布式事务的问题

7、加锁的机制是什么?

在数据库中并发操作会出现的问题有脏读、不可重复读、幻读的问题,因此为了解决并发出现的问题,需要对数据库加锁,来解决此类问题。
数据库的加锁有乐观锁和悲观锁,乐观锁的实现有版本控制和CAS,悲观锁的方式是使用for update,对于悲观锁而言还涉及到排他锁和共享锁,排他锁是一个数据对象加排他锁之后其它事务不能获取该数据,直到它被释放,共享锁是加了锁的数据对象其它数据可以或者该数据,但是不能执行更新操作。
在数据库中使用这些锁来保证并发情况下数据的准确性,避免出现脏读、不可重复度、幻读等问题。

答案百度整理的,若有错请指正!