redis开发与运维读后感
redis为什么运行快
1,redis是基于内存的数据库
2,redis是单线程,避免了线程切换的开销
3,redis是IO多路复用的机制
redis中五种数据结构
1,string:key为string,value可以为五种数据类型,string如果是整数则为int类型,如果字符串长度小于39,则string为embstr,大于39则为raw。embstr和raw的区别表现为,embstr在stringobject初始化中只需要分配一次内存即可且stringobject和sds是连续的,而raw在stringobject中需要分配两次内存,且sds和stringobject不连续。sds的数据结构有三个字段,已使用的长度,未使用的长度,字节数组的指针。
2,hash结构,底层是ziplist或hashtable,数据量少且数据小的时候可以采用ziplist,否则采用hashtbale。ziplist底层的node节点的格式是:上一个节点的大小+本节点的编码和长度+数据。
3,list结构,采用ziplist或者linkedlist的数据结构,在后序的版本中出现了聚集前两者数据结构有点的quicklist。
4,set结构:采用ziplist或者hashtable的数据结构。
5,zset结构:采用ziplist或者skiplist的数据结构,skiplist是一种多层链表的数据结构。
redis中小功能大用处
1,pipeline功能:管道作用,可以将一些命令打包一次发送刚给redis,减少命令传输的次数带来的时延。pipeline和原生的批操作命令的区别,pipeline是非原子性的。
2,事务,multi和exec,会将多个命令存放在一个队列中,在执行exec后开始进行执行,不会进行回滚。
3,lua脚本的优点:可以将一批命令发送给redis并原子性的执行。
redis的持久化
1,rdb持久化:主线程通过fork一个子线程,由子线程对全量数据进行拍一个快照,生成rdb文件并进行持久化。优点:进行全量复制,易于主从节点之间复制,读取rdb文件的效率高。
2,aof持久化:将修改的内容写入到aof buffer中,在配置一定的规则将aof buffer中的数据写到aof文件中。配置规则为always的时候,每次都会将aof buffer中的数据用过fsync的方式写入磁盘,配置为everysecd的时候,每次将aof buffer中的数据write到磁盘缓冲区中,由fsync每隔一秒写入到磁盘中。配置为no的时候,每次将aof buffer文件写入到磁盘缓冲中,由操作系统调用写入磁盘。aof的重写:aof的文件会不断变大,通过aof重写消除一些冗余的命令。aof的优点:可以进行实时持久化,缺点是:读取aof文件缓慢。
redis复制
复制流程:从节点需要复制主节点中的数据,分为两种类型,全量复制和部分复制,全量复制一般表示为从节点首次连接主节点的时候,部分复制较少了全量复制的开销。流程:1,从节点输入salveof命令保存了主节点的ip和端口。2,从节点连接主节点,并验证auth。3,主节点进行持久化数据,rdb。3,主节点将数据rdb文件传输给从节点。4,从节点读取rdb文件。5,主节点的新来的命令持续的发送给从节点。
redis内存管理
1,内存管理:第一:过期数据清理,惰性清除和定期清除,第二:内存溢出清理,通过LRU算法进行内存淘汰。
2,内存优化:第一:redisobject数据结构设计的优点。第二:公共缓冲池,一般存放小整型数据。第三:string的优化。第四:编码优化,通过ziplist和quicklist等等。
redis哨兵
1,原理:哨兵的存在为主从架构实现自动故障转移,提高了系统的可靠性。
2,三个定时任务;第一,sentinel会每隔10s会向master和salve发送info,通过master执行info,sentinel就能得知有多少从节点的上下线。第二,所有的sentinel会订阅master中的sentinel-hello的channel,保证每隔sentinel通过channel去监听master的信息,并知道sentinel的上下线。第三,sentinel会向sentinel、master、slave发送ping包,来保证确认链接是否通路。
3,主观下线和客观下线:主观下线表现为,sentinel认为主节点或者从节点无法连通了。客观下线表现为:当主节点被主观下线后,sentinel会向其他sentinel进行确认,当一半以上的节点都主观下线了master之后,会进行客观下线master。
4,sentinel的选举:原理是raft算法记性选举,选举出一个sentinel负责故障转移。
5,故障转移:选举出master,sentinel会按照一定的规则选举出salve充当master,选举规则有:salve的偏移量尽可能小,runid也尽可能小。
redis分布式
1,分布式与集群的区别,分布式类似于分片,每个结点存储的是部分数据。
2,采用的哈希槽的方式实现一致性哈希。
3,每个节点分配了一部分哈希槽,节点中保着哈希槽的映射。
redis缓存
1,缓存穿透,数据不存在,解决方案:在redis层设置空值或者配置布隆过滤器。
2,缓存击穿(热点key重建):redis中单个key突然失效了,造成大量的访问打到mysql上。解决方案:设置key不失效,或者通过加锁的方式重建key。
3,缓存雪崩:大量的key失效或者是服务器垮掉:可以采用高可用的方式,sentinel或者cluster,采用服务降级的方式,提前演练做好预备方案。
MySQL技术内幕读后感
InnoDB的关键特性
插入缓存:条件是针对于非主键索引,插入新的数据时,判断buffer pool中是否存在数据页,如果存在直接插入,不存在的话,直接将数据插入到insert buffer中并直接返回(不加insert buffer的时候,需要将插入的页进行读取到bufffer pool中)
两次写:保证了innodb的可靠性,是指脏页进行刷盘的时候,会将页面先保存在共享表空间区域,在进行脏页刷盘,当脏页刷盘出现故障的时候,能保证数据不丢失,共享表空间是顺序写,比较快,相比耗时可以不计算。
自适应哈希索引:在buffer pool中对一些等值查询建立哈希索引,为了加快查询的速率。
异步IO:用户可以发送多个IO,不需要等待一个IO结束之后才能发下一个,多个IO还可以进行合并。
刷新邻接页:刷新脏页的时候把相邻的脏页一并进行刷盘。
三大日志:
binlog:二进制日志,分为statement记录原逻辑语句和row记录语义两种,主要用于复制和恢复,一般的事务执行commit之后就会进行写binglog日志。
redolog:保证了事务的持久化功能,一般是对数据逇更改,显示是写redolog再写磁盘,redolog文件是采用循环写入的,redolog的写入配置,当为0的时候,有master thread的刷新,当为1的时候,会听过fsync刷入磁盘,当为2的时候,会将redolog刷到磁盘缓存,有操作系统保证写入磁盘。
undolog:保证了事务的原子性,他记录了一个事务的历史版本数据,可方便进行回滚,undo log存放在共享表空间当中,undo log是MVCC功能的支柱,可以存在一致性非锁定读。undolog分为insert undolog和update undolog,insert undolog在事务提交之后直接删除,update undolog在事务提交之后会放入undolog的列表中,等待purge线程进行清除。
索引
1,索引的分类:主键索引,唯一索引,普通索引
2,如何进行优化
优化步骤:
1,考虑索引,先产看慢查询日志定位到语句,2,在通过expalin查询执行计划,3,在看看索引的情况。4,索引添加的技巧,一般是可以加联合索引避免filesort,覆盖索引和索引下推可以避免进行回表,可以用force强制指定索引。
1,考虑查询优化,尽可能的减少查询的次数和减少传输的数据量。
1,考虑在buffer pool中开启自适应哈希索引。
1,考虑何合适的存储引擎。
1,考虑分区分表。
1,考虑主从架构。
锁
1,全局锁,全局读锁,锁住数据库。
2,表锁,普通表锁,元数据锁,意向锁
3,行锁,普通行锁,范围锁,邻键锁。
事务
事务的隔离级别:读未提交,读已提交,可重复读,串行化读。
事务的四大特性:ACID