• 22-9-18学习笔记-MySQL和Redis


    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

  • 相关阅读:
    【Focal Net】NeuralPS2022 论文+代码解读 Focal Modulation Networks
    怎样快速打开github.com
    区块链技术与应用学习笔记(5-7节)——北大肖臻课程
    C/C++教程 从入门到精通《第五章》—— 制作推箱子游戏
    Azure DevOps (四) 创建第一条流水线
    GAMES101—Lec 05~06:光栅化
    薯条和洱海:第十五周马克思主义原理第八章:社会主义百年历史进程课程B站讲课大纲:
    46.drf过滤、搜索、排序
    gerrit本地代码关联到远程仓库
    Springboot----项目整合微信支付(利用RabbitMQ延迟队列处理用户退款)
  • 原文地址:https://blog.csdn.net/qq_41593124/article/details/126914011