常见的技术问题
浏览量:379
mysql
innodb myisam区别
(1)事务处理:
MyISAM是非事务安全型的,而InnoDB是事务安全型的(支持事务处理等高级处理);
(2)锁机制不同:
MyISAM是表级锁,而InnoDB是行级锁;
(3)select ,update ,insert ,delete 操作:
(4)查询表的行数不同:
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
事务隔离级别,grap锁
事务隔离级别 脏读 不可重复读 幻读 读未提交(read-uncommitted) 是 是 是 不可重复读(read-committed) 否 是 是 可重复读(repeatable-read) 否 否 是 串行化(serializable) 否 否 否 事务的基本要素
原子性:要么全部成功,要么全部失败
一致性:事务开始前后,两个任务是隔离的
隔离性:同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干
持久性: 事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。
事务的并发问题
分库分表,日期分表的优点和缺点
1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。
3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
linux
日志统计。。uniq -c 或者 awk
常用的负载指标查询。htop top: cpu 内存 glances: io 网卡
php
zval结构体
PHP每一个变量都放在zval变量容器中,zval变量容器中是不仅包含变量和值,还需要包含is_ref和refcount这两个值。is_ref:变量是否属于引用集合;refcount:指向变量容器的个数
垃圾回收,如何解决循环引用 (引用计数)
php5.2 :引用计数
php5.3是引用计数为基础,新增同步回收算法。不简简单单的依靠计数来作为准则。
php5.3特性:a.并不是每次refcount减少都会进入回收周期,必须在根部缓存区域满的时候才开始垃圾收回
b.可以解决循环引用的时候内存泄漏问题
c.可以把内存泄漏控制在一个阈值之下
php与垃圾收回相关的配置
php.ini中的zend.enable_gc来打开或关闭PHP的垃圾回收机制,也可以通过调用gc_enable()或gc_disable()打开或关闭PHP的垃圾回收机制。在PHP5.3中即使关闭了垃圾回收机制,PHP仍然会记录可能根到根缓冲区,只是当根缓冲区满额时,PHP不会自动运行垃圾回收,当然,任何时候您都可以通过手工调用gc_collect_cycles()函数强制执行内存回收。
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;
}
?>生成器,yield(php5.5.0以后)
优点:生成器对PHP应用性能有很大的影响
PHP运行代码的时候能节省大量的内存
比较适合计算大量的数据
魔术方法 (设计模式:单例、工厂、观察者)
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只能获取够用的内存,将不多的内存分配给其他的应用,这样系统用会更流畅
说下fastcgi/cgi,php运行原理(sapi/php/扩展/zend引擎)
nginx
nginx工作原理(epoll多路复用),为什么有惊群,如何解决。worker单线程如何高并发, io模型,ET和LT区别,ET为什么必须使用NIO
location的匹配规则有几种,分别是? break和last区别(nginx rewrite)
反向代理
网络
输入一个url到返回结果的过程,越详细越好。哪个过程可以优化
https原理
三次握手四次挥手,tcp头,滑动窗口和拥塞控制,time_wait
cookie session 自定义session 使用那些函数 存在tmp
解释下csrf和场景,怎么预防
http浏览器缓存相关
mc redis
二者区别
redis不仅仅支持key-value,而且支持各种数据格式,有序集合、集合、哈希、列表、事务等
redis支持主从模式应用
redis支持数据持久化
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真实使用的是,定期和惰性测试
mc内存结构
基本信息:slab:memcahce最小的单位,最大的存储容量是1M
slabclass:是特定大小的chunk数组
chunk:缓存的内存空间, 一个slab被划分若干个chunk组
item:存储数据的最小单元,每一个chunk都会包含一个item
factor:增长因子,默认为1.25,相邻slab中的item大小与factor成比例关系
redis持久化AOF和RDB区别 ,各自的机制是怎样的
AOF持久化日志的形式:每一个操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。
RDB持久化:指定时间内吧内存的数据快照写入磁盘,实际操作过程是fork一个子进程,先将数据写入临时文件,成功后替换之前文件
redis字符串和c字符串区别
redis字符串SOS:获取字符串的复杂程度是O(1)
api是安全的,不会造成缓存溢出
空间是预分配(根据分配策略),惰性空间释放,最多N次
保存二进制或者文本数据,根据的len的长度而不是\o
可以使用string库中一部分的函数
c字符串:获取字符串的复杂程度是O(N)
api是不安全的,或造成缓存的溢出
修改字符串N次就会造成N次内存的修改
只能保存文本数据
可以使用string库中的全部函数
其他
topk 问题
topk之单节点(根据值排序,根据频率排序)
topk之多节点
实时topk低请求率
实时topk高请求率
Approx topk
mapredeuce
分布式系统设计唯一自增uuid
如何设计一个日志系统
如何设计一个站内信,基于角色和用户,如何给大批量用户发站内信
亿级用户,并且保证线性增长,如何使用redis设计存储用户的高可用高扩展系统
如何设计微信红包
队列应用场景,好处,接口幂等性设计
最后
各种业务场景的架构设计和技术选型,高可用与容错容灾。
要抓住每个业务的核心点才是最关键的。
技术的广度深度高度。
数据结构和算法。
神回复
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。