每日一题

每日一题

1、mysql中,表person有字段id、name、age、sex,id是主键,name是普通索引,age和sex没有索引。select * from person where id=1 and name=james” and age=1 and sex=0。请问这条语句有几次回表?
参考答案:
mysql中,表person有字段id、name、age、sex,id是主键,name是普通索引,age和sex没有索引。select * from person where id=1 and name=‘james’ and age=1 and sex=0。请问这条语句有几次回表?
https://my.oschina.net/u/4553401/blog/4842433
答案是没有回表。
一般题目是判断有没有回表,而这道题是要说出有几次回表。
刚开始以为会用到回表。后来想了想,没有回表。id是等值查询,顶多命中1条数据。然后再对这1条数据做name过滤,就这么1条数据,没必要回表查询,连我都能想到,mysql的作者更能想到,mysql没那么傻。

2、网络调试工具都用了什么?
参考答案:
https://my.oschina.net/u/4553401/blog/4857494
wireshark、tcpdump、netstat、网络调试助手。
ip层: ping,tracert/traceroute,nslookup,router。
tcp/udp 层工具: telnet、sendip,netcat。
抓包和分析工具 :tcpdump, wireshark。

mysql中,表person有字段id、name、age、sex,id是主键,name是普通索引,age和sex没有索引。select * from person where id=1 and name=james” and age=1 and sex=0。请问这条语句有几次回表?

3、MQ中,如何保证消息的顺序性?
https://my.oschina.net/u/4553401/blog/4841508
生产者保证消息入队的顺序。
MQ 本身是一种先进先出的数据接口,将同一类消息,发到同一个 queue 中,保证出队是有序的。
避免多消费者并发消费同一个 queue 中的消息。

RabbitMQ:创建多个 queue,每个消费者固定消费一个 queue 的消息。或者,一个 queue 但是对应一个 consumer,consumer内部用内存队列做排队,分发给不同的worker。
Kafka:线程处理前增加个内存队列,每个线程只负责处理其中一个内存队列的消息。
RocketMQ:同一个任务的 binlog 进入到同一个 MessageQueue 中就可以了,MessageQueue内是有序的。

4、MQ中,如何保证消息不丢失?
https://my.oschina.net/u/4553401/blog/4839491
生产者丢失消息:如网络传输中丢失消息、MQ 发生异常未成功接收消息等情况。 解决办法:主流的 MQ 都有确认或事务机制,可以保证生产者将消息送达到 MQ。如 RabbitMQ 就有事务模式和 confirm 模式。

MQ 丢失消息:MQ 成功接收消息内部处理出错、宕机等情况。 解决办法:开启 MQ 的持久化配置。

消费者丢失消息:采用消息自动确认模式,消费者取到消息未处理挂掉了。 解决办法:改为手动确认模式,消费者成功消费消息再确认

5、如何保证MQ的高可用?
https://my.oschina.net/u/4553401/blog/4836180
ActiveMQ:
Master-Slave 部署方式主从热备,方式包括通过共享存储目录来实现(shared filesystem Master-Slave)、通过共享数据库来实现(shared database Master-Slave)、5.9版本后新特性使用 ZooKeeper 协调选择 master(Replicated LevelDB Store)。
Broker-Cluster 部署方式进行负载均衡。

RabbitMQ:
单机模式与普通集群模式无法满足高可用,镜像集群模式指定多个节点复制 queue 中的消息做到高可用,但消息之间的同步网络性能开销较大。

6、使用MQ的缺陷有哪些?
https://my.oschina.net/u/4553401/blog/4830374
系统可用性降低:以前只要担心系统的问题,现在还要考虑 MQ 挂掉的问题,MQ 挂掉,所关联的系统都会无法提供服务。
系统复杂性变高:要考虑消息丢失、消息重复消费、消息顺序性、消息堆积等问题。
一致性问题:多个 MQ 消费系统,部分成功,部分失败,要考虑事务问题。

7、redis中,rpop和brpop的区别?
https://my.oschina.net/u/4553401/blog/4819738
Redis Rpop 命令用于移除列表的最后一个元素,返回值为移除的元素。brpop是rpop的阻塞版本。Redis Brpop 命令移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

8、为什么整型的最小负数的绝对值比最大正数大1?
https://my.oschina.net/u/4553401/blog/4817089
两条规则:
规则1:最高位为1的数,必须取反加1后,才能按权展开计算出值,最后取相反数。
规则2:最高位为1的数是负数,最高位为0的数是非负数。

实例如下:
A=1111 1011取反加1后是B=0000 0101,这个时候可以按权展开了,B按权展开后是5,所以A=-5。
A=1000 0000取反加1后是B=1000 0000,这个时候可以按权展开了。根据规则1,B按权展开后是128,所以A=-128。B本来是128,但为了迎合规则2,所以B=-128,而不是128。所以最小负数的绝对值比最大正数大1。

有人说是为了避免+0和-0,其实并不是。0000 0000取反加1后还是0000 0000,也就是说0的补码就是0。

9、系统load过高,你怎么去查?
https://my.oschina.net/u/4553401/blog/4817043
1.top命令查看该机器的负载状况。
2.cd /proc/pid 查看对应高占用程序的位置。
3.进入对应程序中查看日志,根据CPU和内存这两个因素分析。
4.ps -ajxf 查看进程及其之下的线程,通过stat查看是否存在D僵尸进程。

10、java和go,如何高效的拼接字符串?
https://my.oschina.net/u/4553401/blog/4814500
java:
stringbuilder 线程不安全。
stringbuffer 线程安全。

go:
1.在已有字符串数组的场合,使用 strings.Join() 能有比较好的性能。
2.在一些性能要求较高的场合,尽量使用 buffer.WriteString() 以获得更好的性能。大量拼接用append方法性能最好。
3.较少字符串连接的场景下性能最好,而且代码更简短清晰,可读性更好。
4.如果需要拼接的不仅仅是字符串,还有数字之类的其他需求的话,可以考虑 fmt.Sprintf。
大量拼接效率排序:append> strings.Join() > bytes.writestring > fmt > +。

11、mysql的回滚机制是怎么实现的?
https://my.oschina.net/u/4553401/blog/4809075
在 MySQL 中,恢复机制是通过回滚日志(undo log)实现的,所有事务进行的修改都会先记录到这个回滚日志中,然后在对数据库中的对应行进行写入。

12、mysql中,可重复读是怎么实现的?
https://my.oschina.net/u/4553401/blog/4805841
快照读:就是select。MVCC。
select * from table ….;

当前读:特殊的读操作,插入/更新/删除操作,属于当前读,处理的都是当前的数据,需要加锁。为了解决当前读中的幻读问题,MySQL事务使用了Next-Key锁。
select * from table where ? lock in share mode;
select * from table where ? for update;
insert;
update ;
delete;

13、现场写代码,把CPU打满,java和go都行,并解释为什么。

https://my.oschina.net/u/4553401/blog/4794356
现在的电脑一般是多核的,单个for循环cpu是不会打满的。
我的电脑是四核八线程的,不管是java还是go,6个for循环就能把cpu打满,4个和5个cpu打不满。
为什么是6个线程?现在还不得而知,请直接评论。

14、多个线程同时写同一个日志文件,为什么相互写的内容不会被覆盖?
https://my.oschina.net/u/4553401/blog/4793360
这是道面试题,可惜我没什么思路,网上找了些答案。如果有更好的答案,请直接评论。
1.没看代码前,以为会用到缓存队列+组提交。
2.golang的日志源码位于log/log.go中的Output方法。加锁了。
3.系统级别。当打开文件并设置了O_APPEND标识,内核会共享文件写入游标,保证内容不会被覆盖。
这个问题涉及到 系统底层 ,这就要看 操作 系统, 与 Windows 不同, Linux 允许一个文件在写入的时候被读取(或者在被读取的时候写入)。
Linux 通过文件描述符表维护了打开的文件描述符信息,而文件描述符表中的每一项都指向一个内核维护的文件表,文件表指向打开的文件的 vnode(Unix) 和 inode。同时,文件表保存了进程对文件读写的偏移量等信息。
但是 那么我们要如何保证读取与写入的一致性呢? Linux 提供了 fcntl 系统调用,可以锁定文件。
文件锁是与进程相关的,一个进程中的多个线程/协程对同一个文件进行的锁操作会互相覆盖掉,从而无效。
fcntl 创建的锁是建议性锁,只有写入的进程和读取的进程都遵循建议才有效;对应的有强制性锁,会在每次文件操作时进行判断,但性能较差,因此 Linux/Unix 系统默认采用的是建议性锁。

15、i++是原子操作吗?为什么?

https://my.oschina.net/u/4553401/blog/4791227
不是原子操作。i++分为三个阶段:
1.内存到寄存器。
2.寄存器自增。
3.写回内存。
这三个阶段中间都可以被中断分离开

16、TCP中,慢启动是什么?
https://my.oschina.net/u/4553401/blog/4784629
简单回答:乘法增大。

17、mysql中,多个索引会有多份数据吗?

https://my.oschina.net/u/4553401/blog/4777152
数据不会有多份,索引有几个就有几份。聚簇索引存数据和索引,非聚簇索引存索引,聚簇索引只有一个,非聚簇索引可以有多个。

18、mysql 表中允许有多少个 TRIGGERS?

https://my.oschina.net/u/4553401/blog/4775598
在 Mysql 表中允许有六个触发器,如下:
BEFORE INSERT
AFTER INSERT
BEFORE UPDATE
AFTER UPDATE
BEFORE DELETE
AFTER DELETE

19、java中,生产环境服务器变慢,如何诊断处理?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值