邢栋博客

邢栋博客,Action博客,记录工作和生活中的点点滴滴

如何查询MySQL数据库所占用的空间大小
====进入终端=====
mysql -uroot -p
show databases;
use information_schema;

====1.查看数据库总大小====
select concat(round(sum(DATA_LENGTH/1024/1024),2),'MB') as data from tables;

====2.查询某个数据库的大小====
select concat(round(sum(DATA_LENGTH/1024/1024),2),'MB') as data from tables where TABLE_SCHEMA='wordpress';

====3.查询某个数据库下某个表的大小====
select concat(round(DATA_LENGTH/1024/1024,2),'MB') as data from tables where TABLE_SCHEMA='wordpress' and TABLE_NAME='wp_options';
常用正则表达式总结

一、校验数字的表达式

1 数字:^[0-9]*$
2 n位的数字:^\d{n}$
3 至少n位的数字:^\d{n,}$
4 m-n位的数字:^\d{m,n}$
5 零和非零开头的数字:^(0|[1-9][0-9]*)$
6 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$
7 带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})?$
8 正数、负数、和小数:^(\-|\+)?\d+(\.\d+)?$
9 有两位小数的正实数:^[0-9]+(.[0-9]{2})?$
10 有1~3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$
11 非零的正整数:^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$
12 非零的负整数:^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$
13 非负整数:^\d+$ 或 ^[1-9]\d*|0$
14 非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
15 非负浮点数:^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
16 非正浮点数:^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
17 正浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
18 负浮点数:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$
19 浮点数:^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$

二、校验字符的表达式

1 汉字:^[\u4e00-\u9fa5]{0,}$
2 英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
3 长度为3-20的所有字符:^.{3,20}$
4 由26个英文字母组成的字符串:^[A-Za-z]+$
5 由26个大写英文字母组成的字符串:^[A-Z]+$
6 由26个小写英文字母组成的字符串:^[a-z]+$
7 由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
8 由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$
9 中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$
10 中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
11 可以输入含有^%&',;=?$\"等字符:[^%&',;=?$\x22]+
12 禁止输入含有~的字符:[^~\x22]+

三、特殊需求表达式

1 Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
2 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
3 InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
4 手机号码:^(13[0-9]|14[0-9]|15[0-9]|16[0-9]|17[0-9]|18[0-9]|19[0-9])\d{8}$ (由于工信部放号段不定时,所以建议使用泛解析 ^([1][3,4,5,6,7,8,9])\d{9}$)
5 电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$ 
6 国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7} 
7 18位身份证号码(数字、字母x结尾):^((\d{18})|([0-9x]{18})|([0-9X]{18}))$
8 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
9 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$
10 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$  
11 日期格式:^\d{4}-\d{1,2}-\d{1,2}
12 一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$
13 一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$ 
14 钱的输入格式:
15    1.有四种钱的表示形式我们可以接受:"10000.00" 和 "10,000.00", 和没有 "分" 的 "10000" 和 "10,000":^[1-9][0-9]*$ 
16    2.这表示任意一个不以0开头的数字,但是,这也意味着一个字符"0"不通过,所以我们采用下面的形式:^(0|[1-9][0-9]*)$ 
17    3.一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?[1-9][0-9]*)$ 
18    4.这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧.下面我们要加的是说明可能的小数部分:^[0-9]+(.[0-9]+)?$ 
19    5.必须说明的是,小数点后面至少应该有1位数,所以"10."是不通过的,但是 "10" 和 "10.2" 是通过的:^[0-9]+(.[0-9]{2})?$ 
20    6.这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:^[0-9]+(.[0-9]{1,2})?$ 
21    7.这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$ 
22    8.1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$ 
23    备注:这就是最终结果了,别忘了"+"可以用"*"替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里
24 xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$
25 中文字符的正则表达式:[\u4e00-\u9fa5]
26 双字节字符:[^\x00-\xff]    (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))
27 空白行的正则表达式:\n\s*\r    (可以用来删除空白行)
28 HTML标记的正则表达式:<(\S*?)[^>]*>.*?</\1>|<.*? />    (网上流传的版本太糟糕,上面这个也仅仅能部分,对于复杂的嵌套标记依旧无能为力)
29 首尾空白字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$)    (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)
30 腾讯QQ号:[1-9][0-9]{4,}    (腾讯QQ号从10000开始)
31 中国邮政编码:[1-9]\d{5}(?!\d)    (中国邮政编码为6位数字)
32 IP地址:\d+\.\d+\.\d+\.\d+    (提取IP地址时有用)
33 IP地址:((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))    
sql日期截取以及数量累加

创建表+插入测试数据

CREATE TABLE `post` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(30) NOT NULL,
  `status` tinyint(1) NOT NULL,
  `cdate` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

insert into post (title,status,cdate)values('测试1',1,'2019-08-01 10:10:10');
insert into post (title,status,cdate)values('测试1',1,'2019-08-02 11:10:20');
insert into post (title,status,cdate)values('测试1',1,'2019-08-01 12:10:20');
insert into post (title,status,cdate)values('测试1',1,'2019-08-03 13:10:20');
insert into post (title,status,cdate)values('测试1',1,'2019-08-02 14:10:20');
insert into post (title,status,cdate)values('测试1',1,'2019-08-03 15:10:20');
insert into post (title,status,cdate)values('测试1',1,'2019-08-03 16:10:20');


sql练习

获取某个日期的2019-08-03
select * from post where left(cdate,10) ='2019-08-03'; //截取
select * from post where substring(cdate,1,10) ='2019-08-03';//截取
select * from post where DATE_FORMAT(cdate, '%Y-%m-%d')='2019-08-03';//格式化时间

//按照日期分组
select count(*),substring(cdate,1,10) from post group by  substring(cdate,1,10) 
order by count(*) desc;
//按照日期分组,优化下
select count(*) as count,substring(cdate,1,10) as cdate from post group by 
substring(cdate,1,10) order by count desc;

//累计之间的数量
set @tmptotal := 0;select cdate,(@tmptotal :=@tmptotal+count) as total 
from (select count(*) as count,substring(cdate,1,10) as cdate from post 
group by substring(cdate,1,10) order by cdate) as tmpdatas group by cdate;
//累计之间的数量,大于10的日期
set @tmptotal := 0;select cdate,(@tmptotal :=@tmptotal+count) as total 
from (select count(*) as count,substring(cdate,1,10) as cdate from post 
group by substring(cdate,1,10) order by cdate) as tmpdatas group by cdate 
having total > 10;



php简单工厂、工厂模式、抽象工厂实例总结

简单工厂


<?php
/**
 * Created by PhpStorm.
 * User: xingdong
 * Date: 2019/8/3
 * Time: 上午10:05
 */

//简单工厂
interface Product
{
    public function getPrice();
    public function getName();
}

class ProductA implements Product
{
    public function getPrice()
    {
        return 100;
    }

    public function getName()
    {
        return 'ProductA';
    }
}

class ProductB implements Product
{
    public function getPrice()
    {
        return 200;
    }

    public function getName()
    {
        return 'ProductB';
    }
}

class ProductC implements Product
{
    public function getPrice()
    {
        return 300;
    }

    public function getName()
    {
        return 'ProductC';
    }
}

class Factory
{
    public static function createProduct($type)
    {
        $product = null;
        switch ($type){
            case "A":
                $product = new ProductA();
                break;
            case "B":
                $product = new ProductB();
                break;
            case "C":
                $product = new ProductC();
                break;
        }
        return $product;
    }
}


$productA = Factory::createProduct('A');
$productB = Factory::createProduct('B');
$productC = Factory::createProduct('C');


/**
 * 以上便是简单工厂模式的一个典型事例,当用户需要新增产品ProductD时,必须在工厂类的生产方法中增加
对应的判断分支,所以简单工厂模式违背了开放封闭原则。
简单工厂模式,利用静态方法根据输入参数生成对应的产品,隐藏了产品实例化的细节。
总结: 简单工厂模式最大的优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,
对于客户端来说,去除了与具体产品的依赖。但是当需求变动的时候,需要对原有的类进行修改,违背了开放封闭原则。
 *
 *
 */
工厂模式



<?php
/**
 * Created by PhpStorm.
 * User: xingdong
 * Date: 2019/8/3
 * Time: 上午10:05
 */

//工厂方式模式
interface Product
{
    public function getPrice();
    public function getName();
}

class ProductA implements Product
{
    public function getPrice()
    {
        return 100;
    }

    public function getName()
    {
        return 'ProductA';
    }
}

class ProductB implements Product
{
    public function getPrice()
    {
        return 200;
    }

    public function getName()
    {
        return 'ProductB';
    }
}

class ProductC implements Product
{
    public function getPrice()
    {
        return 300;
    }

    public function getName()
    {
        return 'ProductC';
    }
}

interface IFactory{
    public function createProduct();
}

class FactoryA implements IFactory
{
    public function createProduct()
    {
        return new ProductA();
    }
}
class FactoryB implements IFactory
{
    public function createProduct()
    {
        return new ProductB();
    }
}
class FactoryC implements IFactory
{
    public function createProduct()
    {
        return new ProductC();
    }
}

$factoryA = new FactoryA();
$factoryA->createProduct();

$factoryB = new FactoryB();
$factoryB->createProduct();

$factoryC = new FactoryC();
$factoryC->createProduct();

/**
 * 当需要增加一个新产品ProductD,只需要新建对应的FactoryD来实现生产功能即可,对原有的代码
没有任何影响,非常符合开放封闭原则,但是由于每增加一个产品,都需要新增对应的生产工厂,导致增加额外的开发工作量。

总结:由于使用了多态,工厂方法克服了简单工厂违背的开放封闭原则的缺点,又保持了封装对象创建过程的优点。
 */
抽象工厂



<?php
/**
 * Created by PhpStorm.
 * User: xingdong
 * Date: 2019/8/3
 * Time: 上午10:05
 */

//抽象工厂方式
//商品
interface Product
{
    public function getPrice();
    public function getName();
}

class ProductA implements Product
{
    public function getPrice()
    {
        return 100;
    }

    public function getName()
    {
        return 'ProductA';
    }
}

class ProductB implements Product
{
    public function getPrice()
    {
        return 200;
    }

    public function getName()
    {
        return 'ProductB';
    }
}

class ProductC implements Product
{
    public function getPrice()
    {
        return 300;
    }

    public function getName()
    {
        return 'ProductC';
    }
}

//礼品
interface Gift
{
    public function getGiftName();
}

class GiftA implements Gift
{
    public function getGiftName()
    {
        return 'GiftA';
    }
}

class GiftB implements Gift
{
    public function getGiftName()
    {
        return 'GiftB';
    }
}

class GiftC implements Gift
{
    public function getGiftName()
    {
        return 'GiftC';
    }
}

interface IFactory{
    public function createProduct();
    public function createGift();
}

class FactoryA implements IFactory
{
    public function createProduct()
    {
        return new ProductA();
    }

    public function createGift()
    {
        return new GiftA();
    }
}
class FactoryB implements IFactory
{
    public function createProduct()
    {
        return new ProductB();
    }
    public function createGift()
    {
        return new GiftB();
    }
}
class FactoryC implements IFactory
{
    public function createProduct()
    {
        return new ProductC();
    }
    public function createGift()
    {
        return new GiftC();
    }
}

$factoryA = new FactoryA();
$factoryA->createProduct();

$factoryB = new FactoryB();
$factoryB->createProduct();

$factoryC = new FactoryC();
$factoryC->createProduct();

/**
 * 总结:抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需制定他们具体的类。
抽象工厂接口,应该包含所有的产品创建的抽象方法,我们可以定义实现不止一个接口,
一个工厂也可以生产不止一种产品类,和工厂方法模式一样,抽象工厂模式同样实现了开发封闭原则
 */


阿里云服务器执行df和du查看磁盘结果不一致
lsof | grep deleted (如果lsof命令不存在,执行yum install lsof进行安装)

我这里执行后,显示都是nginx相关进程

于是我执行
nginx -s reload
如果不行,可以执行
killall nginx; nginx -c /usr/local/nginx/conf/nginx.conf
linux查看某个进程的安装目录
1.=====获取到进程号=====
ps aux|grep php-fpm 
得到php-fpm的master进程的id号是10100

2.=====查看安装目录=====
ll /proc/10100/exe
mysql锁简记
锁分类
1.读锁(共享锁,读操作不受影响,别的会话有插入操作会处于阻塞状态) 写锁(排他锁,在写操作完成之前,会阻断其他读和写操作)
2.表锁和行级锁

======1.表锁 偏读========
myisam存储引擎,开销小,加锁快,锁力度大,发生锁冲突的概率最高,并发度最低

//手动加锁
lock table 表名称 read(write),表名称2 read(write),其他;
//查看表上加过的锁
show open tables;
//删除表锁
unlock tables;
//分析表锁定
show status like 'table%';
 Variable_name              | Value |
+----------------------------+-------+
| Table_locks_immediate      | 112   |//产生表级锁定的次数,表示可以立即获取锁的查询次数,每立即获取锁值加1 
| Table_locks_waited         | 0     | //出现表级锁定争用而发生等待的次数(不能立即获取锁的次数,每等待一次锁值加1),此值高则说明存在着较严重的表级锁争用情况。
| Table_open_cache_hits      | 0     |
| Table_open_cache_misses    | 6     |//在打开表时,表缓存不存在的次数。
| Table_open_cache_overflows | 0 |


======2.行锁 偏写========
行锁偏向InnoDB存储引擎,开销大,加锁慢,会出现死锁,锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
InnoDB与MYISAM的最大不同有两点:一是支持事务(TRANSACTION);二是采用了行级锁。

事务特性:原子性Atomicity,一致性Consistent,隔离性lsolation,持久性Durable

1.set autocommit=0;update ......;commit;
2.间隙锁
当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁,Innodb会给符合条件的已有数据记录的索引加锁;对于键值在条件范围内但不存在的记录,叫做间隙
(GAP);Innodb也会对这个间隙加锁,
危害:因为query执行过程中通过范围查找的话,他会锁定整个范围所有的索引值,即使这个键值并不存在。
行锁分析:
show status like 'innodb_row_lock%';
+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| Innodb_row_lock_current_waits | 0     |当前正在等待锁定的数量 
| Innodb_row_lock_time          | 0     |从系统启动到现在锁定总时间长度 ***
| Innodb_row_lock_time_avg      | 0     |每次等待所花平均时间 ***
| Innodb_row_lock_time_max      | 0     |从系统启动到现在等待最长的一次所花时间 
| Innodb_row_lock_waits         | 0    |系统启动后到现在总共等待的次数 ***


优化建议
1.尽可能让所有数据检索都通过索引来完成,避免无索引行锁升级为表锁
2.合理设计索引,尽量缩小锁的范围
3.尽可能减少检索条件,避免间隙锁
4.尽量控制事务大小,减少锁定资源量和时间长度
5.s尽可能低级别事务隔离


======3.页面锁 偏写========
开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般


==================================
共享锁(S):SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE。
排他锁(X):SELECT * FROM table_name WHERE ... FOR UPDATE。
InnoDB这种行锁实现特点:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!
数据结构之数组和链表
====数组=====
1.在内存中,数组是一块连续的区域
2.数组需要预留空间,在使用前需要提前申请所占内存的大小
3.在数组起始位置处,插入数据和删除数据效率低
-插入数据时,待插入位置的元素和它后面的所有元素都需要向后搬移
-删除数据时,待删除位置后面的所有元素都要向前搬移
4.随机访问速度效率很高,时间复杂度可以到达O(1)
因为数组的内存是连续的,想要访问那个元素,直接从数组的首地址向后偏移就可以访问到了
5.数组开辟的空间,在不够使用的时候需要扩容,扩容的话,就会涉及需要把旧数组的所有数据向新数组中搬移
6.数组的空间是从栈分配的
====数组的优点====
随机访问性强,查找速度快,时间复杂度O(1)
====数组的缺点====
1.头插和头删的效率低,时间复杂度O(N)
2.空间利用率不高
3.内存空间要求高,必须有足够的连续的内存空间
4.数组空间的大小固定,不能动态扩展


=====链表=====
1.在内存中,元素的空间可以在任意地方,空间是分散的,不需要连续 
2.链表中的元素都会两个属性,一个是元素的值,另一个是指针,此指针标记了下一个元素的地址
每一个数据都会保存下一个数据的内存的地址,通过此地址可以找到下一个数据
3.查找数据时效率低,时间复杂度为O(N)
因为链表的空间是分散的,所以不具有随机访问性,如要需要访问某个位置的数据,需要从第一个数据开始找起,依次往后遍历,直到找到待查询的位置,故可能在查找某个元素时,时间复杂度达到O(N)
4.空间不需要提前指定大小,是动态申请的,根据需求动态的申请和删除内存空间,扩展方便,故空间的利用率较高 
5.任意位置插入元素和删除元素效率较高,时间复杂度为O(1) 
6.链表的空间是从堆中分配的
====链表的优点====
1.任意位置插入元素和删除元素的速度快,时间复杂度为O(1) 
2.内存利用率高,不会浪费内存 
3.链表的空间大小不固定,可以动态拓展

====链表的缺点====
随机访问效率低,时间复杂度为0(N)


优惠券
最新微语