一条SQL更新语句如何执行 # 这个表有一个主键 ID 和一个整型字段 c mysql> create table T(ID int primary key, c int); # 如果要将 ID=2 这一行的值加 1,SQL 语句就会这么写 mysql> update T set c=c+1 where ID=2; 查询语句的那一套流程,更新语句也是同样会走一遍。 前面我们说过,在一个表上有更新的时候,跟这个表有关的查询缓存会失效,所以这条语句就会把表 T 上所有缓存结果都清空。 这也就是我们一般不建议使用查询缓存的原因。接下来,分析器会通过词法和语法解析知道这是一条更新语句。优化器决定要使用 ID 这个索引。然后,执行器负责具体执行,找到这一行,然后更新。 与查询流程不一样的是,更新流程还涉及两个重要的日志模块:redo log(重做日志)和 binlog(归档日志) 执行器和 InnoDB 引擎在执行这个简单的 update 语句时的内部流程。 执行器先找引擎取 ID=2 这一行。ID 是主键,引擎直接用树搜索找到这一行。如果 ID=2 这一行....
MySQL 基本架构示意图 全局上来看,MySQL 分为 Server 层和 存储引擎层。 Server 层 涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。 * 连接器 * 查询缓存 * 分析器 * 优化器 * 执行器 * 等… 存储引擎层 负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。不同的存储引擎共用一个 Server 层,也就是从连接器到执行器的部分。 * InnoDB * MyISAM * Memory * 等… 连接器 接器负责跟客户端建立连接、获取权限、维持和管理连接。连接命令一般是这么写的: mysql -h$ip -P$port -u$user -p 连接命令中的 mysql 是客户端工具,用来跟服务端建立连接。在完成经典的 TCP 握手后,连接器就要开始认证你的身份。 * 如果用户名或密码不对,你就会收到一个"Access denied for user"的错误 * 如果用户名....
编写网络应用程序基本步骤 案例介绍 AuthOperation: 授权操作 OrderOperation:点单操作 KeepaliveOperation:保持连接操作 数据结构设计 Message Header * version 协议版本 * opCode 不同的opCode,Message Body 对应的 operation/operation result 也是不同的,在JSON 解析时需要根据 opCode 解析到不同的 Message Body 类型。 * streamId 相当于Message ID,标识信息的唯一 ID Message Body(JSON) * operation 操作 * operation result 操作结果 length * length 长度信息值得是整个Message(Header + Body) 套接字(socket)是通信的基石,是支持 TCP/IP 协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的 IP 地址,本地进程的协议端口,远地主机的 ....
开闭原则 一个软件实体如类、模块、函数应该对扩展开放,对修改关闭。用抽象构建框架,用实现扩展细节,面向抽象编程。(继承、多态) 优点:提高软件系统的可复用性及可维护性。 ICourse public interface ICourse { Integer getId(); String getName(); Double getPrice(); } JavaCourse public class JavaCourse implements ICourse{ private Integer Id; private String name; private Double price; public JavaCourse(Integer id, String name, Double price) { this.Id = id; this.name = name; this.price = price; } public Integer getId() { return this.Id; } public String getName() { return this.name; } ....
该文章已经加密。
Netty 背景 Netty 由 Trustin Lee (韩国、Line 公司) 2004 年开发。 * 本质:网络应用程序框架 * 实现:异步、事件驱动 * 特性:高性能、可维护、快速开发 * 用于:开发服务器和客户端 为什么不直接使用 JDK NIO 直接使用 JDK NIO = 一个人在战斗。 Netty 做的更多 * 支持常用应用层协议。 * 解决传输问题:粘包、半包现象。 * 支持流量整形。 * 完善的断连、Idle 等异常处理等。 Netty 做的更好 * 规避 JDK NIO bug: epoll bug (异常唤醒空转导致 CPU 100%) JDK NIO 2.4 版本。 * API 更优化、更强大。 * 隔离变化、屏蔽细节。 * 直接用 JDK 实现,代码量太多、BUG 也多。 * Netty 已经维护了 15 年。 网络通信框架对比 Netty 没有竞争对手。 * Apache Mina (Trustin Lee 背书 Netty) * Sun Grizzly (用的少、文档少、更新少) * Apple Swift NIO、ACE 等 (其他语言、....
缓存作用 缓存是在实际生产中非常常用的工具,用了缓存以后,我们可以避免重复计算,提高吞吐量。 一个功能完备、性能强劲的缓存,需要考虑的点非常多。 第一阶段 如果不使用 synchronized 多线程同时 put、扩容时候会出现线程安全隐患 使用 synchronized 性能差,多线程需要串行化的方式执行 doCompute 代码复用性差,代码侵入性强,违反开闭原则。 * 性能差:多个线程同时想计算的时候,需要慢慢等待(同步方法) import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; /** * 描述: 最简单的缓存形式:HashMap */ public class ImoocCache1 { //final 增加安全性,可读性 private final HashMap<String,Integer> cache = new HashMap<>(); public synchronized Integer computer(Str....