MySQL日志模块
redo log(重做日志)和 binlog(归档日志)
redo logWAL 的全称是 Write-Ahead Logging,它的关键点就是先写日志,再写磁盘,也就是先写粉板,等不忙的时候再写账本具体来说,当有一条记录需要更新的时候,InnoDB 引擎就会先把记录写到 redo log(粉板)里面,并更新内存,这个时候更新就算完成了。同时,InnoDB 引擎会在适当的时候,将这个操作记录更新到磁盘里面,而这个更新往往是在系统比较空闲的时候做
如果今天赊账的不多,掌柜可以等打烊后再整理。但如果某天赊账的特别多,粉板写满了,又怎么办呢?这个时候掌柜只好放下手中的活儿,把粉板中的一部分赊账记录更新到账本中,然后把这些记录从粉板上擦掉,为记新账腾出空间
InnoDB 的 redo log 是固定大小的,比如可以配置为一组 4 个文件,每个文件的大小是 1GB,那么这块“粉板”总共就可以记录 4GB 的操作。从头开始写,写到末尾就又回到开头循环写
write pos 是当前记录的位置,一边写一边后移,写到第 3 号文件末尾后就回到 0 号文件开头。checkpoint 是当前要擦除的位置, ...
设计模式之常见设计模式
单例模式
定义确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
优点:单例模式在内存中只有一个实例,减少了内存开支,特别是一个频繁操作,性能又无法优化的对象。减少性能开销,如读取配置、产生其他依赖对象时,启动一个对象,永久驻留内存。可以避免一个对象的多重占用,例如一个写文件动作。可以设置系统全局访问点,优化和共享资源访问。
缺点:单例模式一般没有接口,无法扩展。无法测试,如果代码未完成则无法测试,且因没有接口所以无法mock。单例模式与单一职责原则有冲突,类应只关心内部实现,而不关心外部如何调用。
使用场景:要求生成唯一序列号的环境。整个项目中需要一个共享访问点或共享数据,如页面访问计数器。创建消耗资源过多的对象。需要定义大量静态常量和静态方法的环境。
扩展有上限的多例模式,可以定义内部列表存储实例,然后根据条件返回某实例。
工厂方法模式
定义定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。在工厂方法模式中,抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义;Creator为抽象创建类, 也就是抽象工厂, 具 ...
redis知识点整理
Redis 持久化机制
缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题
热点数据和冷数据是什么
Memcache与Redis的区别都有哪些?
单线程的redis为什么这么快
redis的数据类型,以及每种数据类型的使用场景,Redis 内部结构
redis的过期策略以及内存淘汰机制
Redis 为什么是单线程的,优点
如何解决redis的并发竞争key问题
Redis 集群方案应该怎么做?都有哪些方案?
有没有尝试进行多机redis 的部署?如何保证数据一致的?
对于大量的请求怎么样处理
Redis 常见性能问题和解决方案?
讲解下Redis线程模型
为什么Redis的操作是原子性的,怎么保证原子性的?
Redis事务
Redis实现分布式锁
Redis 持久化机制Redis是一个支持持久化的内存数据库,通过持久化机制把内存中的数据同步到硬盘文件来保证数据持久化。当Redis重启后通过把硬盘文件重新加载到内存,就能达到恢复数据的目的。 实现:单独创建fork()一个子进程,将当前父进程的数据库数据复制到子进程的内存中,然后由子进程写入到临时文件中,持久化的过程结束了, ...
MySQL事务
事务就是要保证一组数据库操作,要么全部成功,要么全部失败。在 MySQL 中,事务支持是在引擎层实现的。你现在知道,MySQL 是一个支持多引擎的系统,但并不是所有的引擎都支持事务。比如 MySQL 原生的 MyISAM引擎就不支持事务,这也是 MyISAM 被 InnoDB 取代的重要原因之一。
四大特性(ACID)原子性(Atomicity)
定义一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。简单说就是:一个事务要么完成要么失败
原理InnoDB存储引擎提供了undo log(回滚日志),在undo log中保存了和执行操作相反的记录,如果事务执行失败则会执行rollback,这时就需要使用到undo log中的日志记录。例:写入2个insert,那就会记录下对应的2个delete什么时候删除回滚日志?在不需要的时候才删除。也就是说,系统会判断,当没有事务再需要用到这些回滚日志时,回滚日志会被删除。就是当系统里没有比这个回 ...
MySQL索引类型
常见的索引类型 哈希索引、平衡二叉树索引、B树索引、B+树索引 以下对这几类常见索引进行分析
哈希索引
优点哈希索引拥有极高的检索效率,索引的检索可以一次到位
缺点
不能使用范围查询 Hash索引仅仅能满足”=”,”IN”和”<=>”查询(注意<>和<=>是不同的操作),不能使用范围查询,例如WHERE price > 100。由于Hash索引比较的是进行Hash运算之后的Hash值,所以它只能用于等值的过滤,不能用于基于范围的过滤
Hash索引不能利用部分索引键查询 这个场景主要出现在复合索引,Hash索引在计算Hash值的时候,是组合索引键合并后再一起计算Hash值,而不是单独计算Hash值,所以通过复合索引的前面一个或几个索引键进行查询的时候,Hash索引也无法被利用
Hash索引在任何时候都不能避免表扫描 Hash索引是将索引键通过Hash运算之后,将 Hash运算结果的Hash值和所对应的行指针信息存放于一个Hash表中。由于不同索引键存在相同Hash值(哈希碰撞),所以无法从Hash索引中直接完成查询,还是要通过访问表中的实际数据进行相应的 ...
桶排序,计数排序,基数排序
一、线性排序算法介绍
线性排序算法包括桶排序、计数排序、基数排序。
线性排序算法的时间复杂度为O(n)。
此3种排序算法都不涉及元素之间的比较操作,是非基于比较的排序算法。
对排序数据的要求很苛刻,重点掌握此3种排序算法的适用场景。
二、桶排序(Bucket sort)
算法原理:
将要排序的数据分到几个有序的桶里,每个桶里的数据再单独进行快速排序。
桶内排完序之后,再把每个桶里的数据按照顺序依次取出,组成的序列就是有序的了。
使用条件
要排序的数据需要很容易就能划分成m个桶,并且桶与桶之间有着天然的大小顺序。
数据在各个桶之间分布是均匀的。
适用场景
桶排序比较适合用在外部排序中。
外部排序就是数据存储在外部磁盘且数据量大,但内存有限无法将整个数据全部加载到内存中。
应用案例
需求描述:有10GB的订单数据,需按订单金额(假设金额都是正整数)进行排序但内存有限,仅几百MB
解决思路:
扫描一遍文件,看订单金额所处数据范围,比如1元-10万元,那么就分100个桶。
第一个桶存储金额1-1000元之内的订单,第二个桶存1001-2000元之内的订单,依次类推。
每个桶对应一 ...
https工作原理
https 工作原理
客户端发起 HTTPS 请求 这个没什么好说的,就是用户在浏览器里输入一个 https 网址,然后连接到 server 的 443 端口。
服务端的配置 采用 HTTPS 协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面(startssl 就是个不错的选择,有 1 年的免费服务)。 这套证书其实就是一对公钥和私钥,如果对公钥和私钥不太理解,可以想象成一把钥匙和一个锁头,只是全世界只有你一个人有这把钥匙,你可以把锁头给别人,别人可以用这个锁把重要的东西锁起来,然后发给你,因为只有你一个人有这把钥匙,所以只有你才能看到被这把锁锁起来的东西。
传送证书 这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等。
客户端解析证书 这部分工作是有客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。 如果证书没有问题,那么就生成一个随机值,然后用证书对该随机值进行 ...
EXPLAIN 执行计划解析
执行计划
执行计划是数据库根据sql语句和相关表的统计信息做的查询方案,由查询优化器自动产生
使用explain可以模拟优化器执行sql查询语句
关键字idid 列的编号就是 select 的序列号,也可以理解为 SQL 执行顺序的标识,有几个 select 就有几个 id
id 值不同:如果是只查询,id 的序号会递增,id 值越大优先级越高,越先被执行
id 值相同:从上往下依次执行
id 列为 null:表示这是一个结果集,不需要使用它来进行查询
select_type查询的类型,主要用于区分普通查询、联合查询、子查询等复杂的查询
simple 表示查询中不包括 union 操作或者子查询,位于最外层的查询的 select_type 即为 simple
primary 需要 union 操作或者含有子查询的 select,位于最外层的查询的 select_type 即为 primary
derived:from 列表中出现的子查询,也叫做衍生表;mysql 或者递归执行这些子查询,把结果放在临时表里
subquery:除了 from 子句中包含的子查询外,其他地方出现的子 ...
MySQL count
数据库查询相信很多人都不陌生,所有经常有人调侃程序员就是CRUD专员,这所谓的CRUD指的就是数据库的增删改查。在数据库的增删改查操作中,使用最频繁的就是查询操作。而在所有查询操作中,统计数量操作更是经常被用到。关于数据库中行数统计,无论是MySQL还是Oracle,都有一个函数可以使用,那就是COUNT。但是,就是这个常用的COUNT函数,却暗藏着很多玄机,尤其是在面试的时候,一不小心就会被虐。不信的话请尝试回答下以下问题:
1、COUNT有几种用法?2、COUNT(字段名)和COUNT()的查询结果有什么不同?3、COUNT(1)和COUNT()之间有什么不同?4、COUNT(1)和COUNT()之间的效率哪个更高?5、为什么《阿里巴巴Java开发手册》建议使用COUNT()6、MySQL的MyISAM引擎对COUNT()做了哪些优化?7、MySQL的InnoDB引擎对COUNT()做了哪些优化?8、上面提到的MySQL对COUNT()做的优化,有一个关键的前提是什么?9、SELECT COUNT() 的时候,加不加where条件有差别吗?10、COUNT(*)、COUNT(1) ...
堆应用
应用一:优先级队列
优先级队列,数据的出队顺序不是先进先出,而是而是按照优先级来,优先级最高的,最先出队。
实现一个优先级队列方法很多,但是用堆来实现是最直接,最高效的,这是因为堆和优先级队列非常相似。一个堆可以看作一个优先级队列,很多时候,他们只是概念上的区分。往优先级队列中插入一个元素,就相当于往堆中插入一个元素;从优先级队列中取出优先级最高的元素,就相当于取出堆顶元素。
优先级队列的应用广泛,如赫夫曼编码,图的最短路径,做小生成树的算法等等
优先级队列应用一:合并有序小文件假设:有100个小文件,每个文件大小为100MB,每个文件中储存的都是有序的字符串。现需要将这100个小文件合并成一个有序的大文件。思路:
整体思路有点像归并排序中的合并函数,从100个文件中,各取第一个字符串,放入数组中,然后比较大小,把最小的那个字符串合并后的大文件中,并从数组中删除。
假设,最小的字符串来自于13.txt这个文件,就再次从这个文件找那个取下一个字符串,放到数组中,重新比较大小,并且选择最小的放入合并后的大文件,将它从数组中删除。依次类推,直到所有的文件中的数据都放入到大文件为止。
使用 ...