MySQL中的字符集和比较规则
字符集和比较规则简介字符集简介在计算机中只能存储二进制数据,那该怎么存储字符串呢?当然是建立字符与二进制数据的映射关系了,建立这个关系最起码要搞清楚两件事儿
你要把哪些字符映射成二进制数据?也就是界定清楚字符范围。
怎么映射?将一个字符映射成一个二进制数据的过程也叫做 编码 ,将一个二进制数据映射到一个字符的过程叫做 解码 。
人们抽象出一个 字符集 的概念来描述某个字符范围的编码规则。
一些重要的字符集
ASCII 字符集: 共收录128个字符,包括空格、标点符号、数字、大小写字母和一些不可见字符。由于总共才128个字符,所以可以使用1个字节来进行编码
ISO 8859-1 字符集: 共收录256个字符,是在 ASCII 字符集的基础上又扩充了128个西欧常用字符(包括德法两国的字母),也可以使用1个字节来进行编码。这个字符集也有一个别名 latin1 。
GB2312 字符集: 收录了汉字以及拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母。其中收录汉字6763个其他文字符号682个。同时这种字符集又兼容 ASCII 字符集,所以在编码方式上显得有些奇怪:
如果 ...
MySQL的启动选项和系统变量
启动命令mysql --help 可以看到 mysql 程序支持的启动选项。
mysqld_safe --help可以看到 mysqld_safe 程序支持的启动选项。
查看 mysqld 支持的启动选项有些特别,需要使用 mysqld --verbose --help。
命令行选项的长形式和短形式使用长形式选项时在选项名前加两个短划线 –
使用短形式选项时在选项名前只加一个短划线 -
选项名是区分大小写的,比如 -p 和 -P 选项拥有完全不同的含义
配置文件MySQL 程序在启动时会寻找多个路径下的配置文件,这些路径有的是固定的,有的是可以在命令行指定的
Windows 操作系统中, MySQL 会按照下列路径来寻找配置文件
路径名
备注
%WINDIR%\my.ini , %WINDIR%\my.cnf
C:\my.ini , C:\my.cnf
BASEDIR\my.ini , BASEDIR\my.cnf
defaults-extra-file
命令行指定的额外配置文件路径
%APPDATA%\MySQL.mylogin.cnf
登录路径 ...
MySQL的客户端与服务端
MySQL的客户端/服务器架构MySQL 服务器程序和客户端程序本质上都算是计算机上的一个进程,这个代表着 MySQL服务器程序的进程也被称为 MySQL数据库实例,简称数据库实例。
MySQL 服务器进程的默认名称为 mysqld
MySQL 客户端进程的默认名称为 mysql
启动MySQL服务器的程序mysqld: 直接启动一个服务器进程
mysqld_safe: 间接的调用 mysqld,启动了另外一个监控进程(服务器进程挂了的时候,可以帮助重启它),使用 mysqld_safe 启动服务器程序时,它会将服务器程序的出错信息和其他诊断信息重定向到某个文件中,产生出错日志
mysql.server:间接的调用 mysqld_safe,在调用 mysql.server 时在后边指定 start 参数就可以启动服务器程序
这个 mysql.server 文件其实是一个链接文件,它的实际文件是 ../support-files/mysql.server
mysql.server stop:关闭正在运行的服务器程序
mysqld_multi:对每一个服务器进程的启动或停止 ...
图解TCP/IP阅读笔记
网络基础知识计算机网络出现的背景计算机最初运行模式-独立模式
随着计算机发展,逐渐演变为连接多太计算机以实现信息共享
计算机网络根据网络的规模大小,可以分为 LAN(局域网) 和 WAN(广域网)
LAN:
WAN:
最初的计算机网络是由几台计算机相连在一起形成的私有网络,随着这种私有网络的不断发展,越来越多的私有网络尝试互相连接来组成更大的私有网络,最终形成了不局限于公司或者部门内部,而是可以与互联网中任意一台计算机进行通信的网络。
计算机与网络发展的7个阶段最初的计算机使用的系统是 批处理系统
批处理:事先将用户程序和数据装入卡带和磁盘,并由计算机按照一定的顺序读取,从而使用户所要执行的这些程序和数据能够一并批量得到处理的方式
继批处理系统之后,出现的是分时系统
分时系统:多个终端与一个计算机相连,允许多个用户同时使用一台计算机的系统,以达到“一人一机”的目的
分时系统的重要特征:多路线、独占性、交互性、及时性
分时系统的出现促进了像BASIC这样能够与计算机实现交互的编程语言的发展
在分时系统中,计算机与每个终端之间用通信线路连接,这并不意味着计算机与计算机之间也已 ...
图解HTTP阅读笔记
简单的HTTP协议HTTP协议用于客户端和服务端之间的通信请求访问文本或图像等资源的一端称为客户端,提供资源响应的一 端称为服务器端
通过请求和响应的交换达成通信请求一定是从客户端发出,最后由服务端响应请求,并返回。
请求和响应报文请求报文是由请求方法、请求 URI、协议版本、可选的请求首部字段和内容实体构成的
响应报文基本上由协议版本、状态码(表示请求成功或失败的数字代 码)、用以解释状态码的原因短语、可选的响应首部字段以及实体主体构成
HTTP是不保存状态的协议无状态(stateless)协议:HTTP 协议自身不对请求和响应之间的通信状态进行保存。也就是说在 HTTP 这个级别,协议对于发送过的请求或响应都不做持久化处理
使用 HTTP 协议,每当有新的请求发送时,就会有对应的新响应产 生。协议本身并不保留之前一切的请求或响应报文的信息
这是为了 更快地处理大量事务,确保协议的可伸缩性,而特意把 HTTP 协议设计成如此简单的
HTTP/1.1 虽然是无状态协议,但为了实现期望的保持状态功能,于 是引入了 Cookie 技术。有了 Cookie 再用 HTTP ...
分布式锁
分布式锁为什么需要分布式锁?
在多线程环境中,如果多个线程同时访问共享资源(例如商品库存、外卖订单),会发生数据竞争,可能会导致出现脏数据或者系统问题,威胁到程序的正常运行。
为了实现共享资源的互斥访问,锁是一个比较通用的解决方案,尤其是悲观锁。
共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程。
本地锁
本地锁的示意图如下:
在分布式系统下,不同的服务/客户端通常运行在独立的 JVM 进程上。如果多个 JVM 进程共享同一份资源,使用本地锁就无法实现资源的互斥访问,于是分布式锁就诞生了。
分布式锁
分布式锁应该具备哪些条件?
互斥:任意一个时刻,锁只能被一个线程持有。
高可用:锁服务是高可用的,当一个锁服务出现问题,能够自动切换到另外一个锁服务。即使客户端的释放锁的代码逻辑出现问题,锁最终一定还是会被释放,不会影响其他线程对共享资源的访问。这一般是通过超时机制实现的。
可重入:一个节点获取了锁之后,还可以再次获取锁。
一个好的分布式锁还需要满足以下条件:
高性能:获取和释放锁的操作应该快速完成,并且不应该对整个系统的性能造成过大影响。
非阻塞: ...
分布式事务
分布式事务柔性事务
在 CAP 理论和 BASE 理论的基础上,提出了柔性事务的概念。柔性事务追求的是最终一致性。
柔性事务就是 BASE 理论 + 业务实践。柔性事务追求的目标是:我们根据自身业务特性,通过适当的方式来保证系统数据的最终一致性。
TCC
Saga
MQ事务
本地消息表
刚性事务
刚性事务追求的就是强一致性。
2PC
3PC
2PC
2PC(Two-Phase Commit)的含义:
2 -> 指代事务提交的 2 个阶段
P -> Prepare(准备阶段)
C -> Commit(提交阶段)
2PC 将事务的提交过程分为 2 个阶段:准备阶段 和 提交阶段
准备阶段的核心是“询问”事务参与者执行本地数据库事务操作是否成功:
事务协调者/管理者向所有参与者发送消息询问:“你是否可以执行事务操作呢?”,并等待其答复。
事务参与者接收到消息之后,开始执行本地数据库事务预操作如写 redo log/undo log 日志。但此时并不会提交事务!
事务参与者如果执行本地数据库事务操作成功,那就回复:“就绪”,否则就回复:“ ...
分布式ID
分布式ID如何为不同的数据节点生成全局唯一主键呢?
生成分布式 ID
最基本的分布式 ID 需要满足下面这些要求:
全局唯一:ID 的全局唯一性肯定是首先要满足的!
高性能:分布式 ID 的生成速度要快,对本地资源消耗要小。
高可用:生成分布式 ID 的服务要保证可用性无限接近于 100%。
方便易用:拿来即用,使用方便,快速接入!
一个比较好的分布式 ID 还应保证:
安全:ID 中不包含敏感信息。
有序递增:如果要把 ID 存放在数据库的话,ID 的有序性可以提升数据库写入速度。并且,很多时候,我们还很有可能会直接通过 ID 来进行排序。
有具体的业务含义:生成的 ID 如果能有具体的业务含义,可以让定位问题以及开发更透明化(通过 ID 就能确定是哪个业务)。
独立部署:也就是分布式系统单独有一个发号器服务,专门用来生成分布式 ID。这样生成 ID 的服务可以和业务相关的服务解耦
不过,这样同样带来了网络调用消耗增加的问题。总的来说,如果需要用到分布式 ID 的场景比较多的话,独立部署的发号器服务还是很有必要的。
分布式 ID 常见解决方案数据库
数据库主键自增
...
WebMagic-入门
HttpClient
响应
Post请求填充参数的方式
如下图的两种方式:
WebMagic概览WebMagic 的设计参考了业界最优秀的爬虫 Scrapy,而实现则应用了 HttpClient、Jsoup 等 Java 世界最成熟的工具,目标是做一个 Java 语言 Web 爬虫的教科书般的实现。
WebMagic 总体架构可以分为四个部分,由 Spider 将它们组织起来:
Downloader
负责从互联网上下载页面,以便后续的处理,WebMagic 默认使用了 Apache HttpClient 作为下载工具。
PageProcessor
负责解析页面,抽取有用信息,发现新的连接。WebMagic 使用 Jsoup 作为 HTML 解析工具,并基于其开发了解析 XPath 的工具 Xsoup。
在这四个组件中,PageProcessor 对于每个站点每个页面都不一样,是需要使用者定制的部分。
Scheduler
负责管理待抓取的 URL,以及一些去重的工作。默认提供 JDK 的内存队列来管理 URL,并使用集合来去重,也支持使用 Redis 进行分布式管理。
...
Netty入门
Netty基础Netty 是什么?
Netty 是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端。
一开始需要树立正确的观念:
把 channel 理解为数据的通道。
把 msg 理解为流动的数据,最开始输入是 ByteBuf,但经过 pipeline 的加工,会变成其它类型对象,最后输出又变成 ByteBuf。
把 handler 理解为数据的处理工序:
工序有多道,合在一起就是 pipeline,pipeline 负责发布事件(读、读取完成…)传播给每个 handler,handler 对自己感兴趣的事件进行处理(重写了相应事件处理方法)。
handler 分 Inbound 和 Outbound 两类。
把 eventLoop 理解为处理数据的工人:
工人可以管理多个 channel 的 IO 操作,并且一旦工人负责了某个 channel,就要负责到底(绑定)。
工人既可以执行 IO 操作,也可以进行任务处理,每位工人有任务队列,队列里可以堆放多个 channel 的待处理任务,任务分为普通任务、定时任务。
工人按照 pipeli ...