- 博客(31)
- 资源 (1)
- 收藏
- 关注
原创 php随机发红包问题
一、随机发红包,100元随机分给10个人:<?phpfunction hongBao($total, $num, $min = 0.01) { $array = []; for ($i = 1; $i < $num; $i++) { // 剩余的每个人最多可以平均分配到多少钱 $safe_total = ($total - ($num - $i) * $min) / ($num - $i);//随机安全上限 $money = mt_rand($min * 100, $
2020-05-11 13:54:57
294
原创 PHP适配器模式
我们有两个现成的第三方平台的登录类 QQ 和 Alipay 和自己的登陆类 MyLogin , 他们各自提供了不同的登录方法,为了在我们的主业务代码中能够调用统一的接口来执行登录,我们设计了一个适配器接口Adapter, 在不需要修改原类的情况下,通过新增QQAdapter、AlipayAdapter、MyLoginAdapter分别继承原有代码并实现Adpater接口来实现,不同平台登...
2019-08-27 18:15:14
210
原创 Apache 和 Nginx 的 IO 模型
网络IO的本质是 socket 的读取, socket 在 linux 系统中被抽象为流,IO 可以理解为对流的操作。对于一次 IO 访问,数据会先被拷到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间,所以说当一个 read 操作发生时,它会经历两个阶段:第一阶段:等待数据准备 (Waitingforthe data to be ready)。第二阶...
2019-08-03 16:09:47
635
原创 Redis的复制机制
一、复制过程Step 1:从节点执行 slaveof 命令。Step 2:从节点只是保存了 slaveof 命令中主节点的信息,并没有立即发起复制。Step 3:从节点内部的定时任务发现有主节点的信息,开始使用 socket 连接主节点。Step 4:连接建立成功后,发送 ping 命令,希望得到 pong 命令响应,否则会进行重连。Step 5:如果主节点设置了权限,那么就...
2019-08-03 00:09:16
249
原创 输入URL后经过的流程
1、URL 是什么?统一资源定位符,是因特网上标准的资源的地址,用于定位互联网上资源,俗称网址。scheme://host.domain:port/path/filename协议://主机.域名:端口号/路径/文件名而 URI 是统一资源标识符,是一个用于标识某一互联网资源名称的字符串。URL 是 URI 的子集。2、域名解析因为浏览器并不能直接通过域名找到对应的...
2019-08-02 23:46:03
240
原创 GET和POST本质上没有区别
GET 和 POST 本质上是没有区别的, GET 和 POST 是 HTTP 协议中的两种发送请求的方法。而HTTP 是基于 TCP/IP 的关于数据如何在万维网中如何通信的协议。也就是说,HTTP 的底层是 TCP/IP ,而 GET 和 POST 又是 HTTP 中的方法,所以, GET 和 POST 都是 TCP 链接, GET 和 POST 能做的事情是一模一样的。由于 HTTP 的规...
2019-08-02 18:31:52
522
原创 并发的原子性和数据库中的原子性有何区别
问题:并发编程中的原子性是什么?数据库的ACID中,A也是指原子性,这两个原子性之间完全一样吗?解答:原子性是指:一个操作是不可中断的,要全部执行完成,要不就都不执行。数据库事务中,保证原子性通过事务的提交和回滚,但是在并发编程中,是不涉及到回滚的。所以,并发编程中的原子性,强调的是一个操作的不可分割性。所以,在并发编程中,原子性的定义不应该和事务中的原子性完全一样。它应...
2019-08-02 11:34:57
948
原创 limit分页优化
mysql 查询使用select命令,通常配合limit , offset参数可以读取指定范围的记录,我们经常用来分页。但是,你有发现吗?问题:当 offset (偏移量)越大时,sql 的查询速度就越慢。也就是说,当数据很大时:select * from tb_a limit 0, 100;select * from tb_a limit 1000000, 100;...
2019-08-01 23:25:15
1245
2
原创 Redis的持久化机制
Redis共有2种持久化方式:RDB 和 AOF 。一、RDB 持久化(Redis默认的持久化方式)Redis所生成的 RDB 文件是一个压缩的二进制文件,通过该文件可以还原 RDB 文件时的数据库状态。(数据库状态是指 Redis 服务器的非空数据库以及他们键值对的统称)1、 RDB 文件的创建我们可以通过 save 或者 bgsave 命令生成 RDB 文件,两者的区别...
2019-08-01 11:24:56
213
原创 一条SQL语句执行得很慢的原因有哪些?
这个问题可以涉及到MySQL的很多核心知识,我们从两个方面进行详解。一、情况分类1、大多数情况是正常的,只是偶尔会出现很慢的情况。2、在数据量不变的情况下,这条SQL语句一直以来都执行的很慢。二、偶尔很慢的情况针对这种情况,这条SQL的书写本身可能是没有什么问题的,而是其它原因导致的:1、数据库在刷新脏页(flush)当我们要往数据库插入一条数据、或者要...
2019-07-31 17:02:30
328
原创 阿里面试问MySQL索引知识
本文来源于一公众号文章。阿里的面试官并不会像有一些公司一样拿着题库一道一道的问,而是会根据面试者做过的事情以及面试过程中的一些内容进行展开。我们以对话的形式展开:一、索引概念、索引模型Q:你们每天这么大的数据量,都是保存在关系型数据库中吗?A:是的,我们线上使用的是MySQL数据库 。Q:每天几百万数据,一个月就是几千万了,那你们有没有对于查询做一些优化呢?A:我们在...
2019-07-31 10:12:59
690
原创 mysql的死锁情况
mysql锁机制分为表级锁和行级锁还有页级锁,其中还有乐观锁和悲观锁、共享锁和排他锁。myisam 和 memory 存储引擎采用的是 表级锁;innodb 存储引擎既支持行级锁,也支持表级锁,但默认情况下采用行级锁。共享锁又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。排他锁又称为写锁,简称X锁,顾名思义,排他锁...
2019-07-30 21:12:07
329
原创 数据库索引原理
我们先了解下 二叉树——>平衡二叉树——>B-树——>B+树 ,一步步深入了解数据库索引底层原理吧。二叉树(Binary Search Trees)二叉树是每个结点最多有两个子树的树结构。其中的子树一般被称为“左子树”和“右子树”,二叉树常被用于实现二叉查找树和二叉堆。二叉树有以下特点:每个结点都包含一个元素以及n个子树,这里0≤n≤2。 左子树和右子树是有顺...
2019-07-30 00:33:25
957
原创 PHP与Ajax跨域
简单说一下php解决跨域的问题:在php脚本中设置响应头:注:服务器端Access-Control-Allow-Credentials = true时,参数Access-Control-Allow-Origin的值不能为'*'。服务端:test-a.php , 所在域名:http://a.test.com<?php// 允许多个域名访问$origin = iss...
2019-07-28 20:32:58
174
原创 Centos7编译安装nginx1.16
1.依赖环境安装yum -y install gcc gcc-c++ make automake autoconf pcre pcre-devel zlib zlib-devel openssl openssl-devel libtool2.下载解压nginx包wget http://nginx.org/download/nginx-1.16.0.tar.gztar xvf ng...
2019-07-27 20:48:14
339
原创 阿里云CentOs连接SSH老是自动断开
(1)打开配置文件;vim /etc/ssh/sshd_config(2)找到下面两行;#ClientAliveInterval 0#ClientAliveCountMax 3(3)去掉注释,并修改其值;ClientAliveInterval 30ClientAliveCountMax 86400或ClientAliveInterval 120Client...
2019-07-27 20:12:36
747
原创 解决Swoole无法使用异步客户端问题(例如‘swoole_redis’ not found)
先说下问题:Fatal error: Uncaught Error: Class 'swoole_redis' not found in xxx相信很多人在给swoole安装hiredis扩展的时候都会遇到这样的问题。原因:从版本4.3.0开始,异步客户端和API被移到单独的PHP扩展 swoole_async 了。因此,我们也就不用装 hiredis 了,只需要安装 swoole_a...
2019-07-24 19:40:44
3095
1
原创 阿里云CentOs7.3编译安装PHP7、Git和Swoole
一、下载解压phpwget https://www.php.net/distributions/php-7.2.20.tar.bz2tar -xjvf php-7.2.20.tar.bz2cd php-7.2.20注意:如果解压不成功,可能是因为没有bzip2解压工具yum install -y bzip2安装依赖包:yum install -y gcc autoco...
2019-07-23 16:35:26
565
原创 Nginx和Apache限制IP并发数
Nginx限制下载速度# 如果想设置用户下载文件的前10m大小时不限速,大于10m后再以128kb/s限速可以增加以下配内容,修改nginx.conf文件location /download { limit_rate_after 10m; limit_rate 128k; } Nginx限制并发数注:limit_zone只能定义在http作用域,li...
2019-07-17 16:44:13
494
原创 nginx和apache防盗链
nginx防盗链一、针对不同文件类型location ~ .*\.(wma|wmv|asf|mp3|mmf|zip|rar|jpg|gif|png|swf|flv)$ { # 对指定后缀文件实行防盗链 valid_referers none blocked *.example.com example.com; # 对这2个来路进行判断 if ($invalid_ref...
2019-07-17 11:26:50
256
原创 Nginx参数优化
一、一般来说nginx 配置文件中对优化比较有作用的为以下几项:1. worker_processes 8;nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如,2个四核的cpu计为8)。2. worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 100000...
2019-07-17 09:35:34
1261
原创 系统瓶颈分析
分析系统瓶颈:系统瓶颈大致分为内存瓶颈、IO瓶颈、CPU瓶颈,系统响应变慢,首先得定位大致的问题出在哪里,使用top工具能够比较全面的查看我们关注的点:进入交互模式后:输入M,进程列表按内存使用大小降序排序,便于我们观察最大内存使用者使用有问题(检测内存泄漏问题); 输入P,进程列表按CPU使用大小降序排序,便于我们观察最耗CPU资源的使用者是否有问题;top第三行显示当前系统...
2019-07-15 09:48:55
1508
原创 Laravel+Redis抢购优惠券
听到“抢购”一词,这就肯定和高并发有关系了。而Redis在高并发方面做得很出色,因此,使用Redis的队列和有序集合就能很好的实现抢购功能。 基本思路:(准备3个队列:优惠券队列、用户抢购队列、抢购成功队列)数据表:优惠券表和用户优惠券兑换表; 点击“发布”后,将优惠券存入redis队列; 将抢购用户存入队列(可进行用户过滤); 用户点击“抢购”按钮后,Ajax访问后台...
2019-07-10 19:47:54
1136
原创 Laravel限时特价
在维护电商项目的时候,产品大大突然提出做一个限时特价的功能,简单4个字概括了他的需求(Excuse me?能说清楚点吗?),相信很多做电商网站的程序猿都会遇到这样的需求。一、理解需求: 限时特价!某个时间区段内,在起始时间点去做一件事,在终止时间点去做另一件事,最后事物恢复为最初始的状态(即和之前相比没有产生变化)。也就是说,站在用户的角度,在起始时间点用户看到产品的价...
2019-07-10 15:24:34
274
原创 Laravel自动取消订单
最近的业务需要做15分钟内未完成支付就自动取消订单的功能,类似的功能还有很多,例如:订单完成后自动确认收货、完成付款5分钟后发送短信通知等等,这些看起来就像定时任务,即多久后去做什么事。 实现上述功能的简单办法有两种:一种是Laravel的任务调度+crontab定时去执行任务;另一种是使用Redis的键过期事件去执行任务。对于业务量小的场景且不严格要求实时性的,推荐第一种方法;...
2019-07-10 00:31:58
1449
原创 栈和堆的区别
数据结构中的栈和堆:栈:一种具有先进后出性质的数据结构。堆:一种经过排序的树形数据结构,每个结点都有一个值,根结点的值最小(或最大),且根结点的两个子树也是一个堆。内存中的栈和堆:1、空间分配:栈:由操作系统自动分配释放(程序编译时),存放函数的参数值,局部变量的值等,操作方式类似于数据结构中的栈。栈上的空间是自动分配自动回收的,所以栈上的数据的生存周期只是在函数的运行...
2019-07-08 20:46:15
165
原创 使用MySQL中Merge引擎分表
Merge引擎将多个使用MyISAM引擎且表结构相同的数据表合并为一个表,使得查询速度更快,同时也方便了维护数据。优点:只需查询总表即可,无需分别查询各个子表; 查询速度比查询一张大表快; 按照相应规则进行分表,维护数据变得更加方便; 多个子表映射到一个总表的速度极快。缺点:总表必须是Merge引擎,子表必须是MyISAM引擎,且表结构必须相同(即每张表的字段顺序、字段...
2019-07-08 16:55:40
279
原创 Ajax是单线程还是多线程
首先明确一点:Ajax是单线程的,因为JavaScript是单线程的,Ajax属于JavaScript范畴,因此Ajax是单线程的。之所以我们可以利用Ajax做到多线程,这取决于Web服务器,服务端使用多线程处理请求。 然后再明确一点:浏览器是多进程的。如图,google浏览器每打开一个tab标签页就会有一个子进程。 因为JS运行在浏览器中,是单线程的,每个wind...
2019-07-08 15:27:22
3489
原创 Mycat单库分表
前两天,发现数据库中有张表已经到达了百万级别,因此需要做分表的工作,网上查阅了下,最常见的做法就是:利用mysql的merge引擎做分表;使用中间件做分表。 这次主要介绍使用中间件Mycat来做单库分表(目前业务还未到达多库分表的需要),这里不再重复Mycat的安装与配置了,网上有很多教程。 实现单库分表需要配置3个文件:server.xml、rule.xml、sche...
2019-07-08 11:59:35
311
转载 PHP写时分离与写时改变
首先要明确PHP是弱类型语言,所谓的弱类型就是说一开始并不严格规定变量的数据类型,因为PHP可以进行数据类型的转换。也就是说,在PHP中,一个变量可以保存为任何的数据类型。 然后我们开始认识PHP变量中的结构体:zval(这里我们称为“变量容器”)。struct _zval_struct { /* Variable information */ zvalue...
2019-07-06 14:03:30
299
转载 简单理解PHP内存机制
首先要理解PHP的内存分配是一次性向系统申请开辟的,PHP自身有个内存管理池,每次申请内存都会先在管理池中寻找合适的内存块,找不到才向系统申请内存,因此,脚本运行的时间越长(例如守护进程运行的脚本),PHP占有的内存也就越大,所以及时释放内存很重要(PHP5.3后引入新的垃圾回收机制),释放后的内存不交回给系统,而是放在内存管理池中继续使用;但是,PHP这种机制可以有效避免了频繁向系统申请...
2019-07-06 10:59:03
489
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人