muzi

muzi

积分: 783
收藏: 0
注册时间: 10 月前
muzi 问题答案
muzi 10 月前 回答题目 对于大流量的网站,应该用什么方法来解决访问量?
  1. 首先确认服务器硬件是否满足支持当前的流量
  2. 优化数据库的访问
  3. 禁止外部盗链
  4. 控制大文件下载
  5. 使用不同的主机分流
  6. 使用流量分析统计
  7. 启用缓存
  8. 启用CDN
muzi 10 月前 回答题目 Apache 和 Nginx 有什么区别?

共同点:

  1. 都是内存数据库
  2. 都可以做一主多从的分布式集群

区别:

  1. Redis支持hash、list、set、sorted set等多种数据,Memcache 仅支持字符串键值数据。
  2. Redis 只使用单核;Memcache可使用多核多线程。所以100K以下数据Redis性能好,以上Memcache性能好。
  3. Redis 数据可以持久化到磁盘;Memcache 不支持数据持久化,关闭后数据随之消失
  4. Redis 单个key(变量)存放的数据有1GB的限制;Memcache 单个key(变量)存放的数据有1M的限制。
  5. Redis 利用单线程模型提供了事务的功能;Memcached提供了cas命令来保证数据一致性。
  6. redis 支持master-slave复制模式做分布式;memcache可以使用magent的一致性hash做分布式。

CAS(Check and Set)是一个确保并发一致性的机制,属于“乐观锁”范畴;
CAS原理很简单:拿版本号,操作,对比版本号,如果一致就操作,不一致就放弃任何操作

muzi 10 月前 回答题目 事务的四大特性是什么?
  1. 持久性
  2. 原子性
  3. 一致性
  4. 隔离性
muzi 10 月前 回答题目 悲观锁和乐观锁是什么?

悲观锁和乐观锁都是为保证一致性的一种锁。

1 悲观锁

在 MySQL 中,使用:

  1. 关闭autocommit=0;
  2. 在事务中使用 select .. from ... where ... for update;给行加排他锁
  3. select命中的行必须有索引,否则会锁表

优点:

  1. 保守策略,所以数据安全性高

缺点:

  1. 有加锁等额外开销,效率低
  2. 可能引起死锁
  3. 降低并行行,数据被锁住后其他事物必须等待

二、乐观锁

使用:

  1. 表中增加版本号或时间戳数据列
  2. 读取数据时同时读取版本号
    select num, version from t where id = 1;
  3. 更新数据时添加版本号为条件,同时版本号增加1
    update t set num = num - 1, version = version + 1 where id = 1 and version = 99;
  4. 如果更更新失败,提示用户

优点:

  1. 没有锁,效率高
  2. 不会引起死锁

缺点:

  1. 这里是列表文本遇到两个事务统一时间读取一行数据时,会引起问题
muzi 10 月前 回答题目 MySQL 有哪些存储引擎?
  1. InnoDB:默认存储引擎,行锁,支持事务,使用最广泛。
  2. MyISAM:表锁,不支持事务。
  3. Archive:适合日志和数据采集类应用。
  4. Memory:适合访问速度快,数据丢失也没有关系的场景。
  5. CSV:将普通csv保存再MySQL中,主要用于数据交换。

此外还有:BlackholeFederatedMergeNDB等存储引擎。

muzi 10 月前 回答题目 PHP json_decode() 函数如何返回关联数组?

指定第二个参数为true

echo json_decode($str, true);
muzi 10 月前 回答题目 POST 和 GET 有什么区别?

本质上来说,GET用于查询,POST用于修改

  1. GET参数通过URL传递,POST放在请求Body中。
  2. GET请求在URL中传送的参数是有长度限制的,而POST通过Body传送数据,长度没有限制。
  3. POST比GET更安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
  4. GET在浏览器回退时是无害的,而POST会再次提交请求。
  5. GET产生的URL地址可以被保存为书签,而POST不可以。
  6. GET请求会被浏览器主动cache,而POST不会,除非手动设置。
  7. GET请求只能进行url编码,而POST支持多种编码方式。
  8. GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
  9. GET产生一个TCP数据包,POST产生两个TCP数据包
muzi 10 月前 回答题目 vim 查找和替换命令

查找

/abc<回车>     #查找abc
/ abc <回车>   #查找abc单词(注意前后的空格)

使用了查找命令之后,使用如下两个键快速查找:

  • n:按照同一方向继续查找
  • N:按照反方向查找

替换

:s/abc/efg/     #替换当前行第一个 abc 为 efg
:s/abc/efg/g    #替换当前行所有 abc 为 efg
muzi 10 月前 回答题目 Linux 如何删除当前目录下及其子目录下所有名为 .git 的文件和目录?
find ./ -name ".git" | xargs rm -rf
muzi 10 月前 回答题目 如何查看 Nginx 使用哪个端口?

用下面命令查出Nginx master进程的PID:

$ ps aux | grep nginx
1234 root 0:00 nginx: master process nginx -g daemon off;
5678 nginx 0:00 nginx: worker process

然后根据PID查看Nginx使用的端口:

$ netstat -anp | grep 1234
tcp 0 0 127.0.0.11:43489 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1234/nginx: master pro

可以看到PID为1234的Nginx使用本地的80端口

muzi 10 月前 回答题目 如何查看 Linux 服务器的负载?

查看Linux服务器的负载,主要是观察CPU使用内存使用IO消耗3部分。

常见命令有:

  1. top:展示CPU和内存的使用情况
  2. iostat:查看 IO 开销
  3. uptime:查看过去1分钟、5分钟、15分钟的负载平均值
  4. w:功能同uptime
  5. free:内存剩余量
  6. df:磁盘使用情况
  7. du:文件占用信息,du -h --max-depth=1查看当前目录大小

解析

1 uptime 和 w

uptimew命令的结果就是top命令的第一行。

2 top

top命令结果:

top - 09:50:12 up 104 days, 16:11, 3 users, load average: 0.38, 0.49, 0.58
Tasks: 118 total, 1 running, 117 sleeping, 0 stopped, 0 zombie
%Cpu(s): 25.3 us, 17.8 sy, 0.0 ni, 56.4 id, 0.3 wa, 0.0 hi, 0.2 si, 0.0 st
KiB Mem : 4050852 total, 153828 free, 1308600 used, 2588424 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 2306416 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
9944 999 20 0 2302136 998.1m 11672 S 26.7 25.2 2197:16 mysqld
19595 www-data 20 0 414808 85620 64748 S 26.7 2.1 0:08.06 php-fpm
19605 www-data 20 0 338848 74796 56128 S 20.0 1.8 0:01.56 php-fpm

第一行解释

top - 09:50:12 up 104 days, 16:11, 3 users, load average: 0.38, 0.49, 0.58
  • 09:50:12:系统当前时间
  • up 104 days, 16:11:系统开机到现在经过了104天
  • 3 users:当前3用户在线
  • load average:0.04, 0.03, 0.05:系统1分钟、5分钟、15分钟的CPU负载信息

备注:load average后面三个数值的含义是最近1分钟、最近5分钟、最近15分钟系统的负载值。这个值的意义是,单位时间段内CPU活动进程数。如果你的机器为单核,那么只要这几个值均<1,代表系统就没有负载压力,如果你的机器为N核,那么必须是这几个值均<N才可认为系统没有负载压力。

第二行解释

Tasks: 118 total, 1 running, 117 sleeping, 0 stopped, 0 zombie
  • 118 total:当前有108个任务
  • 1 running:1个任务正在运行
  • 117 sleeping:117个进程处于睡眠状态
  • 0 stopped:停止的进程数
  • 0 zombie:僵死的进程数,不为0则表示有进程出现问题

第三行解释

%Cpu(s): 25.3 us, 17.8 sy, 0.0 ni, 56.4 id, 0.3 wa, 0.0 hi, 0.2 si, 0.0 st
  • 0.1 us:用户态进程占用CPU时间百分比
  • 0.2 sy:内核占用CPU时间百分比
  • 0.2 ni:renice值为负的任务的用户态进程的CPU时间百分比。nice是优先级的意思
  • 99.4 id:空闲CPU时间百分比
  • 0.0 wa:等待I/O的CPU时间百分比,wa占用超过30%则表示IO压力很大
  • 0.0 hi:CPU硬中断时间百分比
  • 0.0 si:CPU软中断时间百分比

    多核服务器在top命令中按1键可查看每个核的情况。

第四行解释

KiB Mem : 4050852 total, 153828 free, 1308600 used, 2588424 buff/cache
  • 4050852 total:物理内存总数
  • 153828 free:空闲的物理内存
  • 1308600 used: 使用的物理内存
  • 2588424 buff/cache:用作缓存的内存

第五行解释

KiB Swap: 0 total, 0 free, 0 used. 2306416 avail Mem
  • 0 total:交换空间的总量
  • 0 free:空闲的交换空间
  • 0 used: 使用的交换空间,如果Swap的used很高,表示系统内存不足。
  • 2306416 cached:缓存的交换空间

最后一行

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
  • PID:进程ID
  • USER:进程的所有者
  • PR:进程的优先级
  • NI:nice值
  • VIRT:占用的虚拟内存
  • RES:占用的物理内存
  • SHR:使用的共享内存
  • S:进行状态。S-休眠,R-运行,Z-僵尸进程,N-nice值为负
  • %CPU:占用的CPU
  • %MEM:占用内存
  • TIME+: 占用CPU的时间的累加值
  • COMMAND:启动命令

    使用Shift + p按CPU使用量排序,Shift + m按内存使用量排序。

3 iostat

如下开始监控输入输出状态,-x表示显示所有参数信息,1表示每隔1秒监控一次,10表示共监控`10次。

$ iostat -x 1 10
Linux 4.9.0-4-amd64 (product-pc) 03/21/19 _x86_64_ (2 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle
25.28 0.00 17.96 0.31 0.00 56.45

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 0.00 15.70 4.07 12.68 62.07 205.71 31.97 0.04 2.31 1.44 2.58 0.67 1.12

第一行是系统信息。

第二行是cpu属性值:

  • %user:CPU处在用户模式下的时间百分比。
  • %nice:CPU处在带NICE值的用户模式下的时间百分比。
  • %system:CPU处在系统模式下的时间百分比。
  • %iowait:CPU等待输入输出完成时间的百分比。如果%iowait的值过高,表示硬盘存在I/O瓶颈。
  • %steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。
  • %idle:CPU空闲时间百分比。

备注:%idle值高,表示CPU较空闲,如果%idle值高但系统响应慢时,有可能是CPU等待分配内存,此时应加大内存容量%idle值如果持续低于10,那么系统的CPU处理能力相对较低,表明系统中最需要解决的资源是CPU。

接下来是disk属性值:

  • rrqm/s: 每秒进行 merge 的读操作数目。即 rmerge/s
  • wrqm/s: 每秒进行 merge 的写操作数目。即 wmerge/s
  • r/s: 每秒完成的读 I/O 设备次数。即 rio/s
  • w/s: 每秒完成的写 I/O 设备次数。即 wio/s
  • rsec/s: 每秒读扇区数。即 rsect/s
  • wsec/s: 每秒写扇区数。即 wsect/s
  • rkB/s: 每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。
  • wkB/s: 每秒写K字节数。是 wsect/s 的一半。
  • avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区)。
  • avgqu-sz: 平均I/O队列长度。
  • await: 平均每次设备I/O操作的等待时间 (毫秒)。
  • svctm: 平均每次设备I/O操作的服务时间 (毫秒)。
  • %util: 一秒中有百分之多少的时间用于 I/O 操作,即被io消耗的cpu百分比

备注:如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;如果 await 远大于 svctm,说明I/O 队列太长,io响应太慢,则需要进行必要优化。如果avgqu-sz比较大,也表示有当量io在等待。

muzi 10 月前 回答题目 进程间通信有哪些方式?

进程间主要有8种通信方式:

  1. 匿名管道
  2. 高级管道
  3. 有名管道
  4. 消息队列
  5. 信号量
  6. 信号
  7. 共享内存
  8. 套接字
muzi 10 月前 回答题目 使用 Linux 将文件的最后 5 行输出到一个文件
tail -n 5 input.txt > output.txt
muzi 10 月前 回答题目 Java 有哪些集合类型?
  1. ArrayList
  2. LinkedList
  3. HashMap
  4. HashSet
muzi 10 月前 回答题目 Java Object 类包含哪些方法?
  1. clone(): 创建并返回对象到副本
  2. equals(): 判断另一个对象与此对象是否[相等]
  3. finalize(): 当垃圾回收机制确定该对象不再被调用时,垃圾回收器会调用此方法
  4. getClass(): 返回此对象的运行时类
  5. hashCode(): 返回此对象的散列码值
  6. toString(): 返回此对象的字符串表示形式
  7. notify(): 如果有多个线程等待,那么线程规划器随机挑选出一个wait的线程,对其发出通知notify(),并使它等待获取该对象的对象锁
  8. notifyAll(): 使所有正在等待队列中等待同一共享资源的全部线程从等待状态退出,进入可运行状态
  9. wait(): 使调用该线程的方法释放共享资源的锁,然后从运行状态退出,进入等待队列,直到再次被唤醒
muzi 10 月前 回答题目 Java String 对象为什么不可变?
  1. 节省了大量堆空间。字符串池之所以可能,就是因为字符串在 Java 中是不可变的。由此 Java 运行时环境节省了大量堆空间,因为不同的 String 变量可以引用池中的同一 String 变量。如果 String 不是不可变的, 则字符串驻留(String interning)将是不可能的,因为一旦任一变量更改所引用的String对象的值,它也会反映在其他变量中。
  2. 保证 String 不被篡改。如果字符串不是不可变的,那么它可能会对应用程序造成严重的安全威胁。例如,数据库用户名和密码都作为 String 传递以获取数据库连接,Socket 编程的主机和端口信息也是如此。由于字符串是不可变的,因此其值不能被更改。否则,任何黑客都可以篡改其引用的值,这会导致应用程序中的安全问题。
  3. 线程安全。由于 String 是不可变的,因此它对与多线程处理来说是安全的,并且可以在不同的线程之间共享单个 String 实例。这避免了为线程安全使用同步;字符串是隐式线程安全的。
  4. 保证类加载正确。字符串被用在 Java 类加载器中,其不可变性为类加载器加载正确的类提供了安全性。否则的话,请考虑这样一个危险的情况,在你尝试加载 java.sql.Connection 类时,你引用的值却被更改为 myhacked.Connection,并且它能对数据库执行你不需要的操作。
  5. 提高性能。由于 String 是不可变的,因此在它被创建时其散列码就被缓存,不需要再次计算。这使得它成为映射中键的理想对象,它的处理速度比其他 HashMap 键类型快。这就是为什么 String 是 HashMap 中最常用的键类型。
muzi 10 月前 回答题目 Java final, finally 和 finalize 有什么区别?
  • final 关键字用于在多个语境下定义只能分配一次的实体。
  • finally 代码块是用于执行重要代码 (如关闭连接、流等) 的代码块。无论是否处理异常,finally 代码块总会被执行。finally 代码块紧随 try 代码块或 catch 代码块。
  • 这是在删除或销毁对象之前垃圾回收器总会调用的方法,该方法使得垃圾回收机制能够执行清理活动。
muzi 10 月前 回答题目 jQuery 中 $("#content .abc") 和 $("#content").find(".abc") 哪个效率更高?

使用 find 效率更高,因为它使用原生的 document.getElementByNameID > Tag > Class

$("#content").find(".abc").find() 方法会调用浏览器的原生方法(getElementByIdgetElementByNamegetElementByTagName 等等),所以速度较快。比 $("#content .abc") 效率快很多。

$("#content .abc") 慢在于 jQuery 内部使用各种选择器链条的选择顺序是从右到左,所以这条语句是先选.abc,然后再一个个过滤出父元素 #content,这导致它慢很多。

muzi 10 月前 回答题目 Ajax 如何进行跨域访问?

跨域的存在是因为浏览器的同源策略,一个源表示协议、端口、域名都相同,否则就形成了跨域。

主要有3中解决办法,如下:

jsonp – 非官方协议,简单实用

通过JavaScript的 callback 方式调用,jQuery封装了jsonp方式的请求。

callback({"result": 0, "msg": "ok", "data": {xxx}})
服务器响应头
header("Access-Control-Allow-Origin: *"); /*星号表示所有的域都可以接受*/
header("Access-Control-Allow-Methods: GET, POST");
iframe实现跨域

如果两个窗口一级域名相同,只是二级域名不同,document.domain 设置为同一个主域

muzi 10 月前 回答题目 $(document).ready() 函数的作用域是什么?

ready()函数用于在当前文档结构载入完毕后立即执行指定的函数。

该函数的作用相当于window.onload事件。

可以多次调用该函数,从而绑定多个函数,jQuery将在DOM文档结构加载完毕后按照绑定顺序立即执行这些函数。

请注意:请不要在一个页面同时使用ready()函数和<body>元素的onload事件绑定函数,因为它们之间并不完全兼容。如果你必须使用load,那么请不要使用jQuery的ready()load()来为window或更多指定项(例如图片)添加load事件处理器。

该函数属于jQuery对象(实例)。