1)redis
redis的aof和rds区别:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/c0cdd2476a6bcb11cdad0b13df90cb13.jpg)
redis中value的数据结构:string list hash set zset。
跳表实现略。
redis的任务处理是单线程的。
redis的事务中一个执行出错了,其他命令仍然可以执行,事务没有原子性。
red lock(redis distribute lock),处理 (在Redis的master节点上拿到了锁;但是这个加锁的key还没有同步到slave节点master故障,发生故障转移,slave节点升级为master节点;导致锁丢失) 这种情况。
1、获取现在时间
2、尝试在5个实例上获得锁,需要设置timeout时间,避免浪费时间
3、有大于3个申请到了就申请到了,现在时间-1的时间=用的时间,如果锁的时长大于用的时间就申请到了
4、锁的有效时间是锁的时间-申请用的时间
5、如果失败,在申请成功的实例上释放锁。
缓存降级的目的,是为了防止Redis服务故障,导致数据库跟着一起发生雪崩问题。因此,对于不重要的缓存数据,可以采取服务降级策略,例如一个比较常见的做法就是,Redis出现问题,不去数据库查询,而是直接返回默认值给用户。
布隆过滤器(可能有数据,可以通过它减少数据库访问)、缓存穿透(-1的数据,缓存和数据库都没有,可通过前端校验传参、redis写入一个30s的key-NUll键值对来避免)、缓存击穿(大量并发请求来了,但是缓存还没从mysql写到redis中,可通过锁来控制访问,双重检测锁来保证数据库只被加载一次)、缓存雪崩(过期时间集中,数据大量过期)。
2)MYSQL
第一范式:每个列都不可以再拆分。
第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。
第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键。
全文索引:对某个字段创建全文索引,查询时用like %aa% 查询,会返回所有匹配的该字段,且它会智能排序(按照某些匹配程度, 应该是在建索引时排好的)。
成功多更新了几条数据就是幻读。
// 重点
在Read Uncommitted级别下,读取数据不需要加共享锁,这样就不会跟被修改的数据上的排他锁冲突。(脏读)
在Read Committed级别下,读操作需要加共享锁,但是在语句执行完以后释放共享锁。(不可重复读)
在Repeatable Read级别下,读操作需要加共享锁,但是在事务提交之前并不释放共享锁,也就是必须等待事 务执行完毕以后才释放共享锁。(幻读)
SERIALIZABLE 是限制性最强的隔离级别,因为该级别锁定整个范围的键,并一直持有锁,直到事务完成。
//
两个引擎(innodb和myisam),Innodb在sql未用索引时用的表锁,用索引时是行锁+gap锁=next key锁,因为行锁是靠索引实现的。
Innodb在rr下居然避免了幻读 ,因为next_key锁。gap锁 rr有 rc无。
快照读(非阻塞读),伪mvcc多版本并发控制;当前读 select lock in share mode ,for update,update,delete,insert。读的为最新版本,加锁了的,快照读不加锁,简单的select语句,读的可能不是最新版本。
每行数据还有字段标记最近一次修改本行记录的事务的id和一个PTR字段。
Undo日志:ptr字段指向改之前的那一行。
Read view 遵循可见性算法,它决定到底读取哪个版本。
Redolog(记录对某个数据页哪个地方修改),随时记,用于非同步至硬盘前宕机重做,缓存最热的数据或者索引页减少io(dirty page),bufferpool <- 数据页。
Binlog 逻辑层,对某表哪一行修改,提交时记。
视图是虚拟表,依赖于基本表 CREATE VIEW as select语句创建,是根据基本表动态生成的,它的内容修改会重构sql语句去更新基本表。
存储过程与函数,函数比如sql中的max() ,存储过程需要创建,内容大概是 begin XXXX end,
它会预编译这些sql语句,执行快一些,说白了就是一系列的sql操作。
触发器是一种存储过程,事件驱动,事件到来自动执行,创建时: on 表 for each row。
交叉连接:两个表 select a* b* form A,B 返回笛卡尔积。
exist和in区别:In用于B表比A表小时,exist用于b表比a表大时,遍历外表与内表进行匹配。
录入binlog方式: 1 记录每条修改sql 2 记录每一行的所有改动信息 。
主从复制:binlog传给从。
覆盖索引:查询列全为索引时,不用回表二次查找。
插入缓冲:插主键连续的数据时,内容可以顺序插入,非聚集索引的插入先放入缓冲直接返回成功,等多了再插,缓冲中多个插入可合并。
select * from table where age > 20 limit 1000000,10 最好写成
select * from table where id in (select id from table where age > 20 limit 1000000,10)
因为MySQL并不是跳过offset行,而是取offset+N行,然后返回放弃前offset行,返回N行。
索引下推:在传统的查询执行中,MySQL 首先会使用索引定位到满足 age BETWEEN 25 AND 35 条件的数据行,然后再对这些数据行进行过滤,保留居住在 "New York" 的行。
这意味着即使在过滤阶段,MySQL 仍然会读取和评估一些不满足 city = 'New York' 条件的数据行。如果存储引擎支持索引下推,MySQL 可以将 city = 'New York' 条件下推到存储引擎,让存储引擎在索引层级上进行过滤。
存储引擎只返回满足 city = 'New York' 条件的数据行,避免了读取和评估不必要的数据行。