0%

delete

  1. 删除整张表
1
delete from table_name 
  1. 也可以删除部分数据
1
delete from table_name where xxx;
  1. 说明
  • delete是属于DML语句,每次执行delete操作的时候,都会记录在redo和undo表空间里面,以便进行rollback,而且需要手动commit才能生效。
  • 删除表中数据,但不删除表结构,也不释放空间。

truncate

  1. 只能操作整张表
1
truncate table table_name;
  1. 说明
  • truncate是通过释放存储表数据所用的数据页来删除数据,并且重新设置高水线和所有的索引。
  • truncate不会记录日志,所以执行速度很快,同时也不能通过rollback来撤销操作。对于有外键约束引用的表,不能使用truncate,会报错。
  • truncate是DDL语句,所以操作会立即生效,删除内容、释放空间,但是不删除表结构。

drop

  1. 操作整张表
1
drop table table_name;
  1. 说明
  • 删除之后,依赖于该表的存储过程/函数将保留,但是变为invalid状态。
  • drop也属于DDL语言,立即执行,执行速度最快。
  • 删除内容和定义,释放空间。

区别

  1. 当表被TRUNCATE 后,这个表和索引所占用的空间会恢复到初始大小;DELETE操作不会减少表或索引所占用的空间;DROP语句将表所占用的空间全释放掉。
  2. 执行速度: drop > truncate > delete
  3. delete from删空表后,会保留一个空的页,truncate在表中不会留有任何页。
  4. truncate语句实际是删除原来的表然后重新建立一个新表。
  5. 如果有identity产生的自增id列,delete from后仍然从上次的数开始增加,即种子不变;使用truncate删除之后,种子会恢复到初始值。

参考

  1. MySQL删除表操作实现(delete、truncate、drop的区别)
  2. mysql之drop、truncate和delete的区别

PSR笔记

PSR 是 PHP Standard Recommendations (PHP 推荐标准)的简写,由 PHP FIG 组织制定的 PHP 规范,是 PHP 开发的实践标准。

1. PSR-0(弃用)

2. PSR-1(编码风格)

  1. 使用PSR-4规范自动加载规范,命名空间
  2. 类名使用大坨峰
  3. 类中的常量使用全大写,下划线
  4. 方法名使用小驼峰

3. PSR-2(编码风格)

  1. 每个namespace和use块后空一行
  2. 花括号自成一行
  3. 控制结构的”{}” ,写在同一行
  4. true,false,null必须小写
  5. “()”前后不能有空格
  6. “}” 和 “(“ 中间有空格

4. PSR-3(日志规范)

  1. LoggerInterface 定义了8个等级的日志
  2. Psr\Log\LoggerInterface

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
<?php

namespace Psr\Log;

/**
* 描述一个日志记录器实例
*
* 该消息必须实现一个__toString()的字符串或者对象.
*
* 该消息可能包含以下形式的占位符: {foo}
* foo 将会被关键词 "foo"中的上下文数据替换.
*
* 上下文数组可以包含任意数据, 我们只能假设代码实现者
* 如果给出一个生成堆栈跟踪的异常实例, 那么它的键名
* 必须为 "exception"。
*
* 请前往 https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md
* 查看完整的接口规范.
*/
interface LoggerInterface
{
/**
* 系统无法使用。
*
* @param string $message
* @param array $context
* @return void
*/
public function emergency($message, array $context = array());

/**
* 必须立即采取行动。
*
* 例如: 整个网站宕机了,数据库挂了,等等。 这应该
* 发送短信通知警告你.
*
* @param string $message
* @param array $context
* @return void
*/
public function alert($message, array $context = array());

/**
* 临界条件。
*
* 例如: 应用组件不可用,意外的异常。
*
* @param string $message
* @param array $context
* @return void
*/
public function critical($message, array $context = array());

/**
* 运行时错误不需要马上处理,
* 但通常应该被记录和监控。
*
* @param string $message
* @param array $context
* @return void
*/
public function error($message, array $context = array());

/**
* 例外事件不是错误。
*
* 例如: 使用过时的API,API使用不当,不合理的东西不一定是错误。
*
* @param string $message
* @param array $context
* @return void
*/
public function warning($message, array $context = array());

/**
* 正常但重要的事件.
*
* @param string $message
* @param array $context
* @return void
*/
public function notice($message, array $context = array());

/**
* 有趣的事件.
*
* 例如: 用户登录,SQL日志。
*
* @param string $message
* @param array $context
* @return void
*/
public function info($message, array $context = array());

/**
* 详细的调试信息。
*
* @param string $message
* @param array $context
* @return void
*/
public function debug($message, array $context = array());

/**
* 可任意级别记录日志。
*
* @param mixed $level
* @param string $message
* @param array $context
* @return void
*/
public function log($level, $message, array $context = array());
}

5. PSR-4(自动加载)

  1. 必须拥有一个顶级命名空间,可以有几个子命名空间
  2. 必须有一个类名
  3. 区分大小写
Read more »

一、内存回收策略

使用redis作为缓存服务已经非常常用了,但是如果对于内存并不大的机器来说,就需要对redis占用的内存大小做限制,一般使用”maxmemory”来做限制

1
CONFIG SET maxmemory 100mb

但是,当你使用达到上限之后,应该如何处理这种情况呢,redis官方提供了几种策略,包括一个近似LRU回收算法。

  1. noeviction 这个是默认的策略,即当达到内存限制之后,如果尝试写入时只会报错
  2. allkeys-lru 尝试使用近似LRU算法回收最近使用较少的键
  3. volatile-lru 尝试使用近似LRU算法回收设置了过期时间的且最近使用较少的键
  4. allkeys-random 随机回收键
  5. volatile-random 随机回收设置了过期时间的键
  6. volatile-ttl 删除过期时间最近的一个键
1
CONFIG SET maxmemory-policy volatile-lru

回收的一般过程:

  1. 客户端发起了写入请求,想要添加数据
  2. redis检查内存使用情况,如果大于maxmemory,根据设定好的策略进行回收。
  3. 再执行写入请求

二、缓存策略

redis作为高速缓存的解决方案也存在一些问题

1.缓存穿透

当客户端指定查询一个缓存和数据都肯定不存在的数据的时候,如果没有做好考虑,那么会导致程序不停的去查询数据库,产生大量的数据库查询。如果并发大的时候,还有可能拖垮数据库。
解决方案:一般的做法就是,即使数据库查询的数据为空,也把空的结果放入redis中并且设置一个短的过期时间,这样下次查询的时候就直接把缓存中的数据返回,避免了缓存穿透

2.缓存雪崩

当设置的缓存数据集中在某一时刻过期的时候,此时大量的查询将直接转发到了数据库上,导致瞬间压力上升
解决方案:一般的做法是尽量避免设置同一个过期时间,可以在过期时间上加一个1-5分钟的随机值,从而保证数据不会同一时间集中过期。另外如果是经常使用的热点数据,可以设置永不过期

3.缓存击穿

如果某少数key过期之后,产生了大量的对这些key的并发请求,也会造成类似于缓存雪崩的问题。
解决方案:一般使用锁来保证,当判断缓存失效的时候,先使用SETNX方法,set一个互斥锁,操作成功之后再去访问数据库。具体如何使用redis锁的方法下一篇研究

参考文章:高并发缓存处理之——缓存穿透的几种形式及解决方案

前期回顾:
Redis学习笔记(一)
Redis学习笔记(二)