持续更新。。。。php
autoload
Autoload
的加载机制,
当经过 new 来实例化一个类时,PHP 会经过定义的 autoload 函数加载相应的文件,若是这个类文件使用了 extends 或者 implements 须要用到其余的类文件,php 会从新运行 autoload 去进行类文件的查找和加载,若是发生了两次对同一类文件的请求,就会报错。
静态局部变量的特色:
1.不会随着函数的调用和退出而发生变化。
2.静态局部变量只会初始化一次。
3.静态属性只能被初始化为一个字符值或一个常量,不能使用表达式。
4.当屡次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。
strtr
和 str_replace
有什么区别,二者分别用在什么场景下?str_replace()
以其余字符替换字符串中的一些字符(区分大小写)strtr()
转换字符串中特定的字符。5.6版本 str_replace 比 strtr 效率高10+倍, 7.0 版本效率基本相同, 但 5.6 的 str_replace 竟比 7.0 高 3倍
__construct()
:类的默认构造方法,若是 __construct() 和与类同名的方法共同出现时,默认调用__construct()而不是同类名方法。__call()
:当调用不存在或者不可访问的方法时,会调用 __call ( $name, $arguments )方法。__toString()
:当打印对象时会被直接调用。__clone()
:当对象被拷贝时直接调用。__isset()
:对不存在或者不可访问的属性使用 isset() 或者 empty() 时,__isset() 会被调用;__destruct()
:类的析构函数,当该对象的全部引用都被删除,或者对象被显式销毁时执行。__sleep()
执行 serialize() 函数时会调用foreach ($array as $key => $item) { $array[$key + 1] = $item + 2; echo "$item"; } print_r($array);
结果示例: $array = [3,6,7,8];
html
3678 //echo 输出数组内元素的值 Array ( [0] => 3 //$key 保持不变 [1] => 5 //每次的$eky + 1,对应的值加2, [2] => 8 [3] => 9 [4] => 10 )
递归是一种函数调用自身(直接或间接)的一种机制
,这种强大的思想能够把某些复杂的概念变得极为简单。逻辑上的递归能够无次数限制, 但语言执行器或者程序堆栈会限制递归的次数.
php 手册注解:可是要避免递归函数/方法调用超过 100-200 层,由于可能会使堆栈崩溃从而使当前脚本终止。 无限递归可视为编程错误。
递归的两个基本条件
:前端
递归的退出条件
,这是递归可以正常执行的必要条件,也是保证递归可以正确返回的必要条件。缺少这个条件,递归就会无限进行,直到系统给予的资源耗尽。若是碰到“max nest level of 100 reached”(php 中,超出递归限制)是没有正确的退出条件,致使了递归深度过大或者无限递归。递推过程
。由一层函数调用进入下一层函数调用的递推。如:$arr = [10,4,6,4,19,3,5];mysql
array_multisort
能够用来一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序。array_unique
代码:linux
function bubbleSort(array $arr){ $count = count($arr); //数组长度 for($i = 1;$i < $count;$i++){ for ($k = 0;$k < $count - $i;$k++){ if ($arr[$k] > $arr[$k+1]){ $temp = $arr[$k]; $arr[$k] = $arr[$k+1]; $arr[$k+1] = $temp; } } } return array_unique($arr); } bubbleSort($arr);
是一种程序设计范型,同时也是一种程序开发方法。它将对象做为程序的基本单元,将程序和数据封装其中,以提升软件的重用性、灵活性和可扩展性。
标量进行强制类型转换的 object
,没有一个类和它对象。此时,PHP 中的一个称为“孤儿”的 stdClass
类就会收留这个对象)。一、foreach 也叫加强 for 循环,foreach 实际上是 for 循环的一个特殊简化版。
二、foreach 适用于只进行集合或数组遍历, for 则在较复杂的循环中效率更高。
三、foreach 不能对数组或集合进行修改(添加删除操做),若是想要修改就要用 for 循环。
因此相比较下来 for 循环更为灵活。laravel
二者的使用不一样:web
array_values
($arr):得到数组的值array_keys
($arr):得到数组的键名array_flip
($arr):数组中的值与键名互换(若是有重复前面的会被后面的覆盖)in_array
("apple",$arr): 在数组中检索applearray_search
("apple",$arr): 在数组中检索apple ,若是存在返回键名array_push
($arr,"apple","pear"):将一个或多个元素压入数组栈的末尾(入栈),返回入栈元素的个数array_pop
($arr):将数组栈的最后一个元素弹出(出栈)array_shift
($arr):数组中的第一个元素移出并做为结果返回(数组长度减1,其余元素向前移动一位,数字键名改成从零技术,文字键名不变)array_unshift
($arr,"a",array(1,2)):在数组的开头插入一个或多个元素ajax
echo date('Y-m-d H:i:s',strtotime('-1 day',time()));
error_reporting
函数的做用error_reporting() 设置 PHP 的报错级别并返回当前级别。正则表达式
function getExt2($url) { $urlinfo = pathinfo($url); if(isset($urlinfo['extension'])) { if(strpos($urlinfo['extension'],'?') !== false) return explode('?',$urlinfo['extension'])[0]; else return $urlinfo['extension']; } return 'no extension'; }
public function strrev($str) { $newstr = ''; $len = strlen($str); //获取字符串长度 for($i = $len; $i >= 0; $i--) { $newstr .= $str{$i}; //从最大下标拼接至最小便是反转了 } return $newst; }
http 状态码
及其做用Name | Academy | score |
---|---|---|
200 | OK | 请求成功,服务器成功返回网页 |
301 | Moved Permanently | 永久跳转,请求的网页已永久跳转到新位置。 |
403 | Forbidden | 禁止访问,服务器拒绝请求 |
404 | Not Found | 服务器找不到请求的页面 |
500 | Internal Server Error | 服务器内部错误 |
502 | Bad Gateway | 坏的网关,通常是网关服务器请求后端服务时,后端服务没有按照 http 协议正确返回结果。 |
503 | Service Unavailable | 服务当前不可用,可能由于超载或停机维护。 |
504 | Gateway Timeout | 网关超时,通常是网关服务器请求后端服务时,后端服务没有在特定的时间内完成服务。 |
function check_email($email){ $preg = "/^\w+([-_.]\w+)*@\w+([-_.]\w+)*(\.\w+){0,3}$/i"; preg_match($preg,$email,$res); return $res;//匹配成功返回1,匹配失败返回0 }
MVC
是模型( model ) -视图( view )-控制器( controller )的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑汇集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不须要从新编写业务逻辑。redis
php的内存管理机制是:预先给出一块空间,用来存储变量,当空间不够时,再申请一块新的空间。
虽然删除后内存变小了,但仍是比没定义变量以前时大,这是由于虽然删除了变量的值,但变量名没有被删除。
php垃圾回收机制
垃圾回收:
zval容器
中的refcount
在增长,说明不是垃圾。若是发现一个zval容器
中的refcount
在减小,若是减到了 0,直接当作垃圾回收。若是发现一个 zval 容器中的 refcount 在减小,并无减到 0,PHP 会把该值放到缓冲区,当作有多是垃圾的怀疑对象。当缓冲区达到了临界值,PHP 会自动调用一个方法去遍历每个值,若是发现是垃圾就清理laravel
ThinkPHP
Yaf
依赖注入
,实质是经过构造函数或者某些状况下经过 setter 方法将类依赖注入到类中
。通俗的讲就是一个类中要屡次引入某个 model 的时候,能够在构造函数中一次引入,类中的方法直接调用便可。
Composer
是一款跨平台的 PHP 依赖管理工具。让 组件式编程 成为可能,编写软件时,就如拼接乐高玩具同样。极大的提升了开发的效率和代码的可复用性,解放了生产力。Laravel 使用 Composer 来做为扩展包的管理工具。
public/index.php
文件。index.php
文件载入 Composer
生成的自动加载设置,而后从 bootstrap/app.php
脚本获取 Laravel 应用实例,Laravel 的第一个动做就是建立服务容器实例
。HTTP
内核或 Console
内核(分别用于处理 Web 请求和 Artisan 命令),这取决于进入应用的请求类型。服务提供者
,应用的全部服务提供者都被配置在 config/app.php
配置文件的 providers
数组中。首先,全部提供者的 register
方法被调用,而后,全部提供者被注册以后,boot
方法被调用。Request
将会被交给路由器进行分发,路由器将会分发请求到路由或控制器,同时运行全部路由指定的中间件。
服务提供者
是启动 Laravel 应用中最关键的部分,应用实例被建立后,服务提供者被注册,请求被交给启动后的应用进行处理,整个过程就是这么简单!
int(M) M 指示最大显示宽度
,在数据库里面存储的都是4个字节的长度。最大有效显示宽度是255。该可选显示宽度规定用于显示宽度小于指定的列宽度的值时从左侧填满宽度
。显示宽度并不限制能够在列内保存的值的范围,也不限制超过列的指定宽度的值的显示。
优势:
缺点:
因为 mysql
主从复制是基于 binlog 的一种异步复制
,经过网络传送 binlog 文件,理所固然网络延迟是主从不一样步的绝大多数的缘由,特别是跨机房的数据同步出现这种概率很是的大,因此作读写分离,注意从业务层进行前期设计。
因为 mysql 主从复制是主数据库上面启动1个 io 线程,而从上面启动1个 sql 线程和1个 io 线程,当中任何一台机器的负载很高,忙不过来,致使其中的任何一个线程出现资源不足,都将出现主从不一致的状况。
主数据库上面设置的
max_allowed_packet
比从数据库大,当一个大的 sql 语句,能在主数据库上面执行完毕,从数据库上面设置太小,没法执行,致使的主从不一致。
order_id | user_id | goods |
---|---|---|
100000 | 100 | 苹果 |
100001 | 100 | 苹果 |
100002 | 101 | 橘子 |
100003 | 102 | 苹果 |
100004 | 102 | 香蕉 |
sql:
SELECT order_id,user_id,COUNT(order_id) AS count FROM order GROUP BY user_id ORDER BY count DESC limit 2
原子性
(Atomicity)原子性是指事务包含的全部操做要么所有成功,要么所有失败回滚。
一致性
(Consistency)一致性是指事务执行以前和执行以后都必须处于一致性状态。
隔离性
(Isolation)隔离性是当 多个用户并发访问数据库时,好比操做同一张表时, 数据库为每个用户开启的事务,不能被其余事务的操做所干扰,多个并发事务之间要相互隔离。
持久性
(Durability)持久性是指一个事务一旦被提交,对数据库中的数据的改变就是永久性的
若是不考虑事务的隔离性,会发生的几种问题:
脏读
(dirty read) :指在一个事务处理过程里读取了另外一个未提交的事务中的数据。不可重复读
(unrepeated read):指在对于数据库中的某个数据,一个事务范围内屡次查询却返回了不一样的数据值,这是因为在查询间隔,被另外一个事务修改并提交了。幻读
(phantom read):一个事务执行两次查询,第二次查询比第一次多出或少一些数据,形成两次结果不一致。只是另外一个事务在这两次查询中间插入或者 删除了数据形成的。第一类丢失更新
(lost update): 在彻底未隔离事务的状况下,两个事物更新同一条数据资源,某一事物异常终止,回滚形成第一个完成的更新也同时丢失 。第二类丢失更新
(second lost updates):是不可重复读的特殊状况,若是两个事务都读取同一行,而后两个都进行写操做,并提交,第一个事务所作的改变就会丢失。 1. Serializable 串行化
2. Repeatable Read 可重复读
3. Read Commited 可读已提交
4. Read Uncommited 可读未提交
并发控制:
@@tx_isolation
,表示当前的事务隔离级别。JDBC 数据库链接使用数据库系统默认的隔离级别。mysql查看当前事务隔离级别:select @@tx_isolation
设置事务隔离级别:set [glogal | session] transaction isolation level 隔离级别名称;
或set tx_isolation=’隔离级别名称;’
悲观锁
正如其名,它指的是对数据被外界(包括本系统当前的其余事务,以及来自外部系统的事务处理)修改持保守态度,在整个数据处理过程当中,将数据处于锁定状态
。基于数据库的锁机制实现
(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,不然,即便在本系统中实现了加锁机制,也没法保证外部系统不会修改数据)。
在Hibernate使用悲观锁十分容易,但实际应用中悲观锁是不多被使用的,由于它每次发送的SQL语句都会加上"for update"用于告诉数据库锁定相关数据,大大限制了并发性
,数据库性能的大量开销
乐观锁
乐观锁,大可能是基于数据版本( Version )记录机制实现。何谓数据版本?即为数据增长一个版本标识,在基于数据库表的版本解决方案中,通常是经过为数据库表增长一个 "version" 字段来实现
。
乐观锁的工做原理:读取出数据时,将此版本号一同读出,以后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,若是提交的数据版本号大于数据库表当前版本号,则予以更新,不然认为是过时数据。
概念:用户能够在多个列上创建索引
,这种索引叫作复合索引(组合索引);复合索引在数据库操做期间所需的开销更小,能够代替多个单一索引;
窄索引
是指索引列为1-2列的索引,宽索引
也就是索引列超过2列的索引;
设计索引的一个重要原则就是能用窄索引不用宽索引
,由于窄索引每每比组合索引更有效;
like写法通常为select cat from animal where name like '%猫%'
用explain
解释来看 sql 语句并无运用索引(name 已经建立索引),而是全表扫描。
like '%..%'
like '..%..'
(不以 % 开头), 对于 like '%...'
的 (不以 % 结尾),加个 reverse 函数,又能够用上索引了'(须要反向索引的支持)SQL> select * from test_like where reverse(object_name)like reverse('%AS');
使用locate
函数代替like
LOCATE(substr,str)
返回字符串substr
中第一次出现子字符串的位置 str
。LOCATE(substr,str,pos)
返回 substr
在 str
中第一次出现的位置,若是 substr
在 str
中不存在,返回值为 0
。若是pos
存在,返回 substr
在 str
第pos
个位置后第一次出现的位置,若是 substr
在 str
中不存在,返回值为0
。$request_time
列出 php 页面请求时间超过3秒的页面,并统计其出现的次数,显示前100条
cat access.log|awk '($NF > 1 && $7~/\.php/){print $7}'|sort -n|uniq -c|sort -nr|head -100
crond
是 linux 下用来周期性的执行某种任务或等待处理某些事件的一个守护进程。
* 用户任务调度:用户按期要执行的工做,好比用户数据备份、定时邮件提醒等。用户可使用 crontab 工具来定制本身的计划任务。全部用户定义的 crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。
语法:minute
hour
day
month
week
command
还可使用如下特殊字符:
经常使用的几种方式:
轮询 (Round Robin)
根据Nginx配置文件中的顺序, 每一个请求按时间顺序逐一分配到不一样的后端服务器,若是后端服务器 down 掉,能自动剔除。
upstream web { server server1; server server2; }
Web 请求会被转发到 链接数最少的服务器上。least_conn 算法很简单,首选遍历后端集群,比较每一个后端的 conns/weight,选取该值最小的后端。若是有多个后端的 conns/weight 值同为最小的,那么对它们采用加权轮询算法。
upstream web { least_conn; server server1; server server2; }
同一客户端连续的 Web 请求可能会被分发到不一样的后端服务器进行处理,所以若是涉及到会话 Session,可使用基于 IP 地址哈希的负载均衡方案。这样的话, 同一客户端连续的 Web 请求都会被分发到同一服务器进行处理(每一个请求按访问 ip 的 hash 结果分配,这样每一个访客固定访问一个后端服务器,能够解决 session 的问题)。
upstream web { ip_hash; server server1; server server2; }
能够根据服务器的性能情况有选择的分发 web 请求。指定轮询概率,weight 越高、访问比率越大。weight=2,意味着每接收到3个请求,前2个请求会被分发到第一个服务器,第3个请求会分发到第二个服务器,其它的配置同轮询配置。
upstream web { server server1 weight=2; server server2; }
基于权重的负载均衡和基于 IP 地址哈希的负载均衡能够组合在一块儿使用。
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream web { server server1; server server2; fair; }
按访问 url 的 hash 结果来分配请求,使每一个 url 定向到同一个后端服务器,后端服务器为缓存时比较有效。 hash_method 是使用的 hash 算法
upstream web {
server server1:3128; server server1:3128; hash $request_uri; hash_method crc32;
}
每一个设备的状态设置为:
1.down 表示单前的 server 暂时不参与负载
2.weight 默认为1.weight 越大,负载的权重就越大。
3.max_fails:容许请求失败的次数默认为1.当超过最大次数时,返回 proxy_next_upstream 模块定义的错误
4.fail_timeout:max_fails 次失败后,暂停的时间。
5.backup: 其它全部的非 backup 机器 down 或者忙的时候,请求 backup 机器。因此这台机器压力会最轻。sorry server 提供非业务功能。
Keepalived
是经过VRRP(虚拟路由器冗余协议)协议实现高可用
功能的。VRRP 出现的目的就是为了解决静态路由单点故障问题的,它可以保证当个别节点宕机时,整个网络能够不间断地运行。
它们都是
多模式编辑器
,不一样的是 vim 是 vi 的升级版本,它不只兼容 vi 的全部指令,并且还有一些新的特性在里面。vim 的这些优点主要体如今如下几个方面:
咱们知道在 vi 里,按 u 只能撤消上次命令,而在 vim 里能够无限制的撤消。
vi只能运行于 unix 中,而 vim 不只能够运行于 unix,windows ,mac 等多操做平台。
vim 能够用不一样的颜色来加亮你的代码。
就是说 vim 不只能够在终端运行,也能够运行于 x window、 mac os、 windows。
某些状况下,你能够把 vim 当成 vi 来使用。vi 和 vim 都是 Linux 中的编辑器,不一样的是 vim 比较高级,能够视为 vi 的升级版本。vi 使用于文本编辑,可是 vim 更适用于 coding。
AWK
是一种处理文本文件的语言
,是一个强大的文本分析工具。一般,awk 是以文件的一行为处理单位
的。awk 每接收文件的一行,而后执行相应的命令,来处理文本。
语法:awk '{pattern + action}' {filenames}
pattern
表示 AWK 在数据中查找的内容,而action
是在找到匹配内容时所执行的一系列命令。花括号({}
)不须要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。pattern
就是要表示的正则表达式,用斜杠括起来。
总结:
采用非对称加密算法管理对称算法的密钥,而后用对称加密算法加密数据,这样咱们就集成了两类加密算法的优势,既实现了加密速度快的优势,又实现了安全方便管理密钥的优势。
客户端检测缓存
(有缓存且较新,客户端直接读取本地缓存进行资源展现,有缓存可是不新,准备 http 请求包,发送至服务端进行缓存校验)。DNS 域名解析
获取服务 IP(DNS 缓存递归等)。TCP 链接
,进行 http 请求
报文数据发送,其中重点就三次握手进行描述(客户端向服务端发送 syn,服务端向客户端发送 syn、ack,客户端向服务端发送 syn,ack,data)。服务端程序接受请求
,定向到请求路径处理程序,准备http响应。返回
相关的 http
响应报文及 http 状态信息
,而后根据实际状况看是否关闭链接( Connection的keep-alive )。TCP 链接关闭
经历 4 次握手。客户端
拿到 http 响应的报文信息,通过一系列前端处理过程最终将请求的资源
进行展现
。session 锁
php 的 session 默认用文件存储,当请求一个须要操做 session 的 php 文件(session_start())时,这个文件是会被第一个操做 session 的进程锁定,致使其余请求阻塞。其余请求会挂起在 session_start() 直到s ession文件解锁。这样保证了读取-写入,读取-写入的顺序。对数据流来讲很理想,可是,对于目前这种页面大量应用ajax的状况,全部请求排队处理,将大大加大页面展示的耗时,甚至出现请求超时等不可用故障。
解决
:因为锁定的 session 文件直到脚本执行结束或者 session 正常关闭才会解锁,为了防止大量的 php 请求(须要使用 $_SESSION 数据)被锁定,能够在写完 session 后立刻关闭(使用session_write_close()
),这样就释放了锁;
Memcache 或者 Redis 作 session 的存储,是能解决“锁定”的问题,但处理很差会致使链接数飙高(在 session 操做后若是有耗时操做,链接是不回收的,能够主动在 session 写操做完成后作 session_write_close() 操做);
XSS
:跨站脚本
一种网站应用程序的安全漏洞攻击,是代码注入
的一种。它容许恶意用户将代码注入到网页上。一般包含了 HTML 以及用户端脚本语言。防护
:页面上直接输出的全部不肯定(用户输入)内容都进行 html 转义;对用户输入内容格式作校验;script 脚本中不要使用不肯定的内容; CSRF
:跨站请求伪造
是一种挟制用户在当前已登陆的 Web 应用程序上执行非本意的操做
的攻击方法;防护:
验证 HTTP Referer 字段;在请求地址中(或 HTTP 头中)添加 token 并验证;SSRF
:模拟服务器对其余服务器资源进行请求,没有作合法性验证
。构造恶意内网IP作探测,或者使用其他所支持的协议对其他服务进行攻击。防护:禁止跳转,限制协议,内外网限制,URL 限制。绕过:使用不一样协议,针对IP,IP 格式的绕过,针对 URL,恶意 URL 增添其余字符,@之类的。301跳转 + dns rebindding。SQL注入
:是经过把 SQL 命令插入到Web表单提交或输入域名或页面请求的查询字符串,欺骗服务器执行恶意的 SQL 命令。防护
:过滤特殊符号特殊符号过滤或转义处理(addslashes
函数);绑定变量,使用预编译语句; NPM 是 Node.js(一个基于 Google V8 引擎的 JavaScript 运行环境)的包管理和分发工具。
Yarn 是 Facebook 在 2016 年 10 月开源的一个新的包管理器,用于替代现有的 NPM 客户端或者其余兼容 NPM 仓库的包管理工具。Yarn 在保留 NPM 原有工做流特性的基础上,使之变得更快、更安全、更可靠。
* Boolean(布尔): 存储布尔( true/false )值。
* 快速排序
快速排序:我先选一个标尺,用它把整个队列过一遍筛选,以保证其左边的元素都不大于它,其右边的元素都不小与它
function quickSort($arr){ // 获取数组长度 $length = count($arr); // 判断长度是否须要继续二分比较 if($length <= 1){ return $arr; } // 定义基准元素 $base = $arr[0]; // 定义两个空数组,用于存放和基准元素的比较后的结果 $left = []; $right = []; // 遍历数组 for ($i=1; $i < $length; $i++) // 和基准元素做比较 if ($arr[$i] > $base) { $right[] = $arr[$i]; }else { $left[] = $arr[$i]; } } // 而后递归分别处理 left 和 right $left = quickSort($left); $right = quickSort($right); // 合并 return array_merge($left,[$base],$right); }
思路:法如其名,就像冒泡同样,每次从数组中冒出一个最大的数
好比:2,4,1
第一次冒出4:2,1,4
第二次冒出2:1,2,4
function bubbleSort($arr){ // 获取数组长度 $length = count($arr); // 第一层循环控制冒泡轮次 for ($i=0; $i < $length-1; $i++) { // 内层循环控制从第0个键值和后一个键值比较,每次冒出一个最大的数 for ($k=0; $k < $length-$i; $k++) { if($arr[$k] > $arr[$k+1]){ $tmp = $arr[$k+1]; $arr[$k+1] = $arr[$k]; $arr[$k] = $tmp; } } } return $arr; }
思路:每次选择一个相应的元素,而后将其放到指定的位置.使用双重循环完成,外层控制轮数,当前的最小值,内层控制比较次数
function selectSort($arr){ // 获取长度 $length = count($arr); for ($i=0; $i < $length - 1; $i++) { // 假设最小值的位置 $p = $i; // 使用假设的最小值和其余值比较,找到当前的最小值 for ($j=$i+1; $j < $length; $j++) { // $arr[$p] 是已知的当前最小值 // 判断当前循环值和已知最小值的比较,当发下更小的值时记录下键,并进行下一次比较 if ($arr[$p] > $arr[$j]) { $p = $j; // 比假设的值更小 } } // 经过内部 for 循环找到了当前最小值的 key,并保存在 $p 中 // 判断 当前 $p 中的键和假设的最小值的键不一致增将其互换 if ($p != $i) { $tmp = $arr[$p]; $arr[$p] = $arr[$i]; $arr[$i] = $tmp; } } // 返回最终结果 return $arr; }
优势:
一、读写性能优异二、支持数据持久化,支持 AOF 和 RDB 两种持久化方式
三、支持主从复制,主机会自动将数据同步到从机,能够进行读写分离。
四、数据结构丰富:除了支持 string 类型的 value 外还支持 string、hash、set、sortedset、list等数据结构。
缺点:
一、 Redis 不具有自动容错和恢复功能,主机从机的宕机都会致使前端部分读写请求失败,须要等待机器重启或者手动切换前端的 IP 才能恢复。二、 主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,下降了系统的可用性。
三、 redis 的主从复制采用
全量复制
,复制过程当中主机会 fork 出一个子进程对内存作一份快照,并将子进程的内存快照保存为文件发送给从机,这一过程须要确保主机有足够多的空余内存。若快照文件较大,对集群的服务能力会产生较大的影响,并且复制过程是在从机新加入集群或者从机和主机网络断开重连时都会进行,也就是网络波动都会形成主机和从机间的一次全量的数据复制,这对实际的系统运营形成了不小的麻烦。四、 Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,这对资源形成了很大的浪费。
* 缓存——热数据
计数器
* 命令:INCRBY
队列
分布式锁与单线程机制
最新列表
排行榜
缺点
一、 不支持事务操做
二、 占用空间过大
三、 MongoDB 没有如 MySQL 那样成熟的维护工具
四、 没法进行关联表查询,不适用于关系多的数据
五、 复杂聚合操做经过 mapreduce 建立,速度慢
六、 模式自由,自由灵活的文件存储格式带来的数据错误优势
一、 文档结构的存储方式,可以更便捷的获取数据
二、 内置 GridFS,支持大容量的存储
三、 内置 Sharding,分片简单
四、 海量数据下,性能优越
五、 支持自动故障恢复(复制集)
参考:https://www.cnblogs.com/shiji...
内容为本人收集整理,若有表达错误欢迎指正。