每个程序员需要必须知道的知识点,一篇比较全面复习的文章(4)
原创不易,如果需要转载请附上本连接
数据库
1. mysql 索引
索引存储类型
-
B-Tree索引
B+Tree:每一个叶子节点都包含指向下一个叶子节点的指针,从而方便叶子节点的范围遍历。
B-Tree通常意味着所有的值都是按顺序存储的,并且每一个叶子页到根的距离相同,很适合查找范围数据。
B-Tree可以对<,<=,=,>,>=,BETWEEN,IN,以及不以通配符开始的LIKE使用索引。 -
聚簇索引(cluster index)
一个表只能有一个聚簇索引。
目前,只有solidDB和InnoDB支持聚簇索引,MyISAM不支持聚簇索引。一些DBMS允许用户指定聚簇索引,但是MySQL的存储引擎到目前为止都不支持。 -
Hash索引
哈希索引基于哈希表实现,只有精确索引所有列的查询才有效。 -
空间(R-Tree)索引
MyISAM支持空间索引,主要用于地理空间数据类型,例如GEOMETRY。 -
全文(Full-text)索引
全文索引是MyISAM的一个特殊索引类型,它查找的是文本中的关键词,主要用于全文检索。
MySQL建立索引类型
- 普通索引
这是最基本的索引,它没有任何限制。普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。因此,应该只为那些最经常出现在查询条件(WHERE column = …)或排序条件(ORDER BY column)中的数据列创建索引。 - 唯一索引
它与前面的普通索引类似,不同的就是:普通索引允许被索引的数据列包含重复的值。而唯一索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。 - 主键索引
它是一种特殊的唯一索引,不允许有空值。一个表只能有一个主键。 - 组合索引
多个条件查询是使用组合索引https://blog.csdn.net/login_sonata/article/details/75268075
2. B- 和 B+ 的区别
B-树就是B树,中间的横线不是代表减号
[卫星数据] 指的是索引元素指向的数据记录,比如数据库中的某一行。
B- 与 B+的区别.图为.B+树的叶子节点直接包含微信数据,所以父节点与中间节点都作为索引,指向要查找的卫星数据.这样设计还带来一个好处,B+树的中间节点没有卫星数据,所以同样大小的磁盘页可以容纳更多的节点元素.
B-树中的卫星数据(Satellite Information):B-树中,无论中间节点还是叶子节点都带有卫星数据
B+树中的卫星数据(Satellite Information):B+ 树中,只有叶子节点带有卫星数据
【补充】在数据库的聚集索引中,叶子节点直接包括卫星数据,在非聚集索引中,叶子节点带有指向卫星数据的指针。
【区别】
- B+树的中间节点没有卫星数据,所以同样大小的磁盘页可以容纳更多的节点元素。这就意味着,数据量相同的情况下,B+数的结果比B-数更加"矮胖",因此查询时IO次数更加少。
- B+树的查询必须最终查到叶子节点,而B-树只要查到匹配元素即可,无论中间还是叶子节点。B-树的查询性能不稳定(最好只是根节点,最坏到叶子节点),而B+树稳定都是叶子节点
- B+树比B-树范围查询简单
3. Redis 的数据结构
- String 字符串类型
String是最常用的一种数据类型,普通的k/v存储都可以归为此类,内部由sds.h定义。在类型的设计上,除了包含字符数组buf,还会额外存储实际字符串的长度以及buf的剩余空间,从而提供更灵活的管理方式。特别需要提到的是,redis自己管理内存,从而自身可以掌握更多关于内存的信息,提高内存分配的性能以及作为其它功能的依据。此外,该结构还提供了一些字符串相关的操作函数,功能丰富,实现透明,使用方便。 - Hash Tables(哈希)
Hash是一个string类型的field和value的映射表,由dict.h定义。一个key可对应多个field,一个field对应一个value。将一个对象存储为hash类型,较于每个字段都存储成string类型更能节省内存,并且可以更方便的存取整个对象。hash内部存储的value为一个hashMap,并提供了直接存取这个Map成员的接口。 - Linked List 链表
List实现为一个双向链表,支持了反向的插入、查找和遍历,由adlist.h定义。我们可以通过push,pop操作从链表的头部或者尾部添加删除元素。在需要队列这样的数据结构时,List能提供非常丰富的接口,广泛用于缓冲队列,消息队列等应用场景。学过数据结构的朋友,对此肯定不会陌生。 - Sets 集合
Set集合类型提供的是一个列表的功能,而且是可以自动去重的。它的内部实现其实是一个value值为null的HashMap,也正是因此来使得数据去重以及判断某个成员是否在集合内等其它一些重要接口变的简单。当某些应用场景需要存储一个列表,且不想要重复的数据时,就可以选择set这个结构来处理。 - Sorted Sets 有序集合
Sort Set的功能与Set非常相似,只不过它是可以通过用户提供一个优先级参数来实现自动排序的,而Set结构不会做自动排序。Sort set内部使用HashMap和SkipList来实现数据的有序存储,保证查询的效率以及元素有序性。在某些应用场景,比如需要为某个班级的学生根据成绩来排序,就可以将优先级参数设置为成绩分数,这样在插入到这个结构时,就可以实现自动的排序。
redis常用数据结构解析
Redis中8种数据结构的底层数据结构源码详解
redis的五种数据结构原理分析
Redis(一)、Redis五种数据结构
Redis中的数据结构
4. Redis持久化
Redis是一个内存数据库,数据保存在内存中,但是我们都知道内存的数据变化是很快的,也容易发生丢失。幸好Redis还为我们提供了持久化的机制,分别是RDB(Redis DataBase)和AOF(Append Only File)。
详解Redis中两种持久化机制RDB和AOF(面试常问,工作常用)
5. AOF (Append Only File)重写
AOF的方式也同时带来了另一个问题。持久化文件会变的越来越大。为了压缩AOF的持久化文件。Redis提供了bgrewriteaof命令。将内存中的数据以命令的方式保存到临时文件中,同时会fork出一条新进程来将文件重写。
重写AOF文件的操作,并没有读取旧的AOF文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的AOF文件,这点和快照有点类似。
6. 一致性 Hash
一致性Hash算法也是使用取模的方法,不过,取模方法是对服务器的数量进行取模,而一致性的Hash算法是对2的32方取模。即,一致性Hash算法将整个Hash空间组织成一个虚拟的圆环,Hash函数的值空间为0 ~ 2^32 - 1(一个32位无符号整型)。
一致性Hash原理与实现
一致性哈希算法原理
7. Redis 集群哈希槽
Redis集群搭建的方式有多种,例如使用zookeeper等,但从redis 3.0之后版本支持redis-cluster集群,Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有 节点连接。
8. Redis 集群高可用
怎么保证redis集群的高并发和高可用的?
Redis系列九:redis集群高可用
9. Redis KEY 过期策略
三种过期策略:
- 定时删除
含义:在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除
优点:保证内存被尽快释放
缺点:若过期key很多,删除这些key会占用很多的CPU时间,在CPU时间紧张的情况下,CPU不能把所有的时间用来做要紧的事儿,还需要去花时间删除这些key定时器的创建耗时,若为每一个设置过期时间的key创建一个定时器(将会有大量的定时器产生),性能影响严重没人用 - 惰性删除
含义:key过期的时候不删除,每次从数据库获取key的时候去检查是否过期,若过期,则删除,返回null。
优点:删除操作只发生在从数据库取出key的时候发生,而且只删除当前key,所以对CPU时间的占用是比较少的,而且此时的删除是已经到了非做不可的地步(如果此时还不删除的话,我们就会获取到了已经过期的key了)
缺点:若大量的key在超出超时时间后,很久一段时间内,都没有被获取过,那么可能发生内存泄露(无用的垃圾占用了大量的内存) - 定期删除
含义:每隔一段时间执行一次删除(在redis.conf配置文件设置hz,1s刷新的频率)过期key操作
优点:通过限制删除操作的时长和频率,来减少删除操作对CPU时间的占用–处理"定时删除"的缺点,定期删除过期key–处理"惰性删除"的缺点
缺点:在内存友好方面,不如"定时删除",在CPU时间友好方面,不如"惰性删除"
难点:合理设置删除操作的执行时长(每次删除执行多长时间)和执行频率(每隔多长时间做一次删除)(这个要根据服务器运行情况来定了)
【总结】
5. 定时删除和定期删除为主动删除:Redis会定期主动淘汰一批已过去的key
6. 惰性删除为被动删除:用到的时候才会去检验key是不是已过期,过期就删除