Redis和Mysql

1)redis
redis的aof和rds区别:

在这里插入图片描述

	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' 条件的数据行,避免了读取和评估不必要的数据行。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

成长是自己的事

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值