自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(24)
  • 收藏
  • 关注

原创 读写锁、悲观锁、乐观锁

在编程世界里,「锁」更是五花八门,多种多样,每种锁的加锁开销以及应用场景也可能会不同。如何用好锁,也是程序员的基本素养之一了。高并发的场景下,如果选对了合适的锁,则会大大提高系统的性能,否则性能会降低。所以,知道各种锁的开销,以及应用场景是很有必要的。读锁也叫共享锁 (shared lock)使用SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE即事务A 使用共享锁 获取了某条(或者某些)记录时,事务B 可以读取这些记录,可以继续添加

2021-08-12 17:24:06 568

原创 Redis持久化

Redis提供两种持久化机制RDB和AOF。了解 RDB 持久化和 AOF 持久化之间的异同是非常重要的, 以下将详细地介绍这这两种持久化功能, 并对它们的相同和不同之处进行说明。RDB用数据集快照的方式(半持久化模式)记录redis数据库的所有键值对,在某个时间点将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复。优点RDB是一个非常紧凑(compact)的文件 ,保存了 Redis 在某个时间点上的数据集。这种文件非常适合用于进行备份(比如可以在最近的 2

2021-04-07 15:36:58 136

原创 面试爱问的TCP问题

TCP 三次握手和四次挥手也是面试题的热门考点,它们分别对应 TCP 的连接和释放过程。下面就来简单认识一下这两个过程TCP 三次握手在了解具体的流程前,我们需要先认识几个概念| 消息类型 | 描述 ||-SYN-|-用来初始化和建立连接的-|| ACK | 帮助对方确认收到的SYN消息 || SYN-ACK | 本地的SYN消息和较早的ACK数据包 ||-FIN-|-用来断开连接的-|SYN:它的全称是 Synchronize Sequence Numbers,同步序列编号。是 TCP/

2021-02-25 10:28:16 144

原创 pcel安装扩展

安装pcel下载 pearcurl -O https://pear.php.net/go-pear.pharsudo php -d detect_unicode=0 go-pear.phar配置和安装 pear输入 1,回车输入 /usr/local/pear,回车输入 4,回车输入 /usr/local/bin,回车验证安装是否成功pear version官网使用接着,就可以使用 pecl 命令来安装 php 扩展了,如:pecl install redis安装完后需要在

2020-12-08 12:57:19 566

原创 composer记录

composer 安装时出现:Composer\Repository\RepositorySecurityException怀疑是镜像问题,更换后成功composer create-project --prefer-dist laravel/laravel blog

2020-11-07 21:33:57 132

原创 MySQL系列 - EXPLAIN详解

EXPLAIN关键字可以模拟MySQL优化器执行SQL语句,可以很好的分析SQL语句是否合适EXPLAIN输出列列含义idselect查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序select_type查询类型table对应行的表名称partitions匹配记录的分区type访问类型passible_keys可能用到的索引keys实际使用的索引key_len索引中使用的字节数,可通过该列计算查询中使用

2020-10-16 12:21:59 277

原创 PHP-自动加载

在编写面相对象编程(OOP)程序时,PHP文件顶部进程要引入文件,如include 'path/to/file1.php';include 'path/to/file2.php';你可能知道require(), require_once(), inclued(), inclued_onle()这些函数的作用。如果只需载入几个PHP脚本,使用这些函数能很好的完成工作。如果一次需要引入上百个PHP脚本,甚至更多,这时候这些函数就无法胜任。有了自动加载器,就无需像前面那样手动引入文件,自动加载策略能找

2020-10-14 23:47:58 274 1

原创 MySQL系列-4索引

索引的出现就是为了提高数据查询效率。索引常见模型1.哈希表哈希表是一种以键-值(key-value)存储数据的结构,2.有序数组3.搜索树

2020-10-02 17:32:17 136

原创 Redis 分布式锁

多线程情况下访问一些共享资源需要加锁,不如会出现数据被写乱多情况。对于分布式多锁服务,一般可以用Redis、数据库或ZooKeeper等实现。分布式锁有以下几个特点:1.安全性:任意时刻,只有一个客户端可以获得锁(排他性)2.避免死锁:无死锁。即使锁定资源的客户端崩溃或分区,也始终可以获得锁定。3.容错能力:只要锁服务集中群大多数Redis节点存活,客户端就可以获取和释放锁Redis 实现Redis官方文档加锁SET resource_name my_random_value NX PX m

2020-10-01 22:04:36 85

原创 设计模式

设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。单例模式:意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。主要解决:一个全局使用的类频繁地创建与销毁。何时使用:当您想控制实例数目,节省系统资源的时候。如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。关键代码:构造函数是私有的。

2020-09-24 15:09:30 66

原创 CGI、FastCGI和PHP-FPM的区别

CGI:通用网关协议,是web Server和运行其上的应用程序进行“交流”的一种约定。把HTTP Request的Header设置成进程的环境变量,HTTP Request的正文设置成进程的标准输入,而进程的标准输出就是HTTP Response包括Header和正文。CGI针对每个请求都是fork一个新进程来进行处理,处理过程包括解析php.ini文件,初始化执行环境等,然后这个进程会把处理完的数据返回给web服务器,最后web服务器把内容发送给用户,刚才fork的进程也随之退出。 如果下次用户还

2020-09-23 23:03:37 237

原创 网络协议考点

HTTP协议状态码:五类响应:1xx 接受请求,正在处理2xx 请求成功处理3xx 重定向,需要附加操作301 Moved Permanently(永久移除) Response中应该包含一个Location URL, 说明资源现在所处的位置302 Found(已找到) 请求的URL已移走。与状态码301类似。但这里的移除是临时的。303 See Other(参见其他) 类似302304 Not Modifie

2020-09-23 16:15:26 473

原创 PHP的COW机制

COW(Copy On Write),PHP采用这种方式来优化内存。COW:写时复制,即只有当对其中一个或多个变量进行写操作的时候,才会复制一份内存,对其内容进行修改。下面看一个例子$a = range(0, 1000);//分配给PHP的内存量var_dump(memory_get_usage()); $b = $a;var_dump(memory_get_usage());$a = range(10, 2000);var_dump(memory_get_usage());结果可

2020-09-22 21:23:19 317

原创 MySQL锁 详细介绍

本章聊的是MySQL的锁,锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁就是用来实现这些访问规则的重要数据结构。根据加锁的范围,MySQL里面的锁大致可以分成全局锁、表级锁和行锁三类全局锁全局锁就是对整个数据库实例加锁。MySQL提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWRL)。当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(

2020-09-16 22:38:38 170

原创 MySQL基础知识

1. 什么是关系型数据库?关系型数据库,是指采用了关系模型来组织数据的数据库,其以行和列的形式存储数据,以便于用户理解,关系型数据库这一系列的行和列被称为表,一组表组成了数据库。用户通过查询来检索数据库中的数据,而查询是一个用于限定数据库中某些区域的执行代码。简单来说,关系模式就是二维表格模型。2. 关系型数据库有什么优势?- 支持复杂查询,可以用 SQL 语句方便的在一个表以及多个表之间做非常复杂的数据查询。- 支持事务,可靠的处理事务并且保持事务的完整性,使得对于安全性能很高的数据访问要求得以

2020-09-16 21:43:31 105

原创 Redis的PubSub详解

Redis也可以使用list类型实现消息队列,但是不支持消息的多播机制。为了支持消息多播,Redis单独使用了一个模块来支持消息多播,也就是本章要讲的PubSub。Redis作为消息发布和订阅之间的服务器,起到桥梁的作用,在Redis里面有一个channel的概念,也就是频道,发布者通过指定发布到某个频道,只要有订阅者订阅了该频道,该消息就会发送给订阅者。Redis的发布与订阅的功能应用还是比较广泛的,它的应用场景有很多。比如:最常见的就是实现实时聊天的功能,还是有就是博客的粉丝文章的推送,当博主推送

2020-09-14 21:25:08 6298

原创 MySQL系列-2日志系统

前面讲解了一个查询语句的执行过程,一条查询语句的执行过程一般是经过连接器,解析器,优化器,执行器等模块,最后到存储引擎。执行更新语句时,解析器会通过词法和语法解析知道这是一条更新语句。优化器决定是否可使用索引。然后,执行器负责具体执行,找到这一行,然后更新。与查询流程不一样的是,更新流程还涉及两个重要的日志模块:redo log(重做日志),binlog(归档日志)。如果每一次的更新操作都需要写进磁盘,然后磁盘也要找到对应的那条记录,然后再更新,整个过程IO成本、查找成本都很高。于是MySQL用到了

2020-09-11 20:33:46 109

原创 MySQL系列-3事物隔离

事务用来保证一组数据库操作,要么全部成功,要么全部失败。在MySQL中,事务支持是在引擎层实现的。本篇文章里,将会以InnoDB为例,剖析MySQL在事务支持方面的特定实现。隔离性与隔离级别提到事务,你肯定会想到ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性)。先来说说其中I,也就是“隔离性”。当数据库上有多个事务同时执行的时候,就可能出现脏读(dirty read)、不可重复读(non-repeatable rea

2020-09-10 21:29:04 110

原创 MySQL系列-1架构基础

知道MySQL各组件之间如何协同工作,有助于深入理解MySQL,当遇到MySQL的一些异常或问题后,能更快的定位并解决问题。下面展示了MySQL的基本架构图。大体来说,MySQL可以分成Server层和存储引擎层Server层包含了大多数MySQL的核心服务功能,如连接器、查询缓存、分析器、优化器、执行器等,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。存储引擎负责MySQL中的数据存储和读取,每个存储引擎都有它的优势和劣势。

2020-09-08 23:03:40 87

原创 二分查找(中):变形问题

二分查找变形问题有很多,本章讲几个经典的,默认数据都是从小到大。4种常见的二分查找变形问题查找第一个值等于给定值元素查找最后一个值等于给定值元素查找第一个大于等于给定值元素查找最后一个小于大于给定值元素变体1. 查找第一个值等于给定值元素如果数据集中存在重复数据,如何找到第一个值等于给定值的元素比如这样一个有序数组,arr=[1,2,3,4,5,5,6,7,10,12,13],其中arr[4],arr[5]的值都是5,希望查找第一个等于5的数据,也就是下标为4的元素。示例:funct

2020-09-05 22:56:06 156

原创 二分法(上):原理讲解+简单实现

二分法依赖于有序的顺序表结构(数组),针对的是有序的数据,每次通过跟区间的中间元素比较,将待查找区间缩小为之前的一半,直到数据被找到,或区间缩小为0二分查找实现简单demopublic function binarySearch($arr, $target){ $low = 0; $high = count($arr) - 1; while ($low <= $high) { $mid = $low + (($high-$low)>>1);

2020-09-04 22:33:58 783

原创 快速排序(通俗易懂+例子+优化方案)

快速排序思想排序数组(下标从l到r),选择l到r之间任意一个数据作为povit(分区点)。遍历数组,将小于povit到放左边,大于povit到放右边,将povit放中间。处理后,数组l到r的数据分成了3部分,l到mid之间到数据都是小于povit的,povit在中间,后面mid+1到r的数据都是大于povit的。用递归排序下标l到mid之间到数据和mid+1到r之间到数据,直到区间缩小为1,这数组就有序了。递归公式:quick_sort(l…r) = quick_sort(l…mid-1) + q

2020-08-30 23:20:46 952

原创 归并排序

归并排序核心思想:如果要排序一个数组,先把数组从中间分成2部,然后对这2部分分别排序,再将排序好的数组进行合并。归并排序使用的是分治思想,即将一个大问题分解成小的子问题来解决,小的子问题解决了,大问题也就解决了。这里用递归来实现归并排序说下写递归代码的技巧:分析出递归公式,找到终止条件,最后将递归公式翻译成代码。递归公式:merge_sort(l…r) = merge_sort(l…mid) + merge_sort(mid…r)终止条件:l>=r解释下这个递归公式:merge_so

2020-08-26 17:47:34 111

原创 PHP创建Epub文件

cssssdd

2020-08-07 14:26:29 965 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除