上一次修改时间:2018-06-24 02:21:57

NoSQL

  1. NoSQL介绍

    image.png

  2. web缓存的历史版本

    image.png

    image.png

    image.png

    注:1)列数据库Hbase里,存放上千亿数据后,查询还能跟普通数据库一样;

    2)如地图应用中,需要查询图结构中,点与点之间的关系,此时用传统算法解决这类问题会十分困难,而用图数据库解决这类问题会什么简单;图数据库可以用来做关系图谱、关系映射、关系维度计算、最短距离计算;

    image.png

    注:1)数据模型简单的应用如微博类应用,该类应用常见的需求,如我的粉丝、我的关注、我的关注人的微博、我的微博、对方的微博等,这些数据通过集合、链表、哈希等可以完全解决,因此,此类应用用NoSQL比较合适,但像OA系统这种,数据模型比较复杂,就适合mysql这类的关系型数据库;

    2)对于修改数据架构,如果是传统的数据库,是一个十分困难的操作,修改架构后,受其影响数据都需要重新处理,而用NoSQL,因其数据之间没有结构关系,因此可以改变后直接存储,然后直接读取; 

    3)传统关系型数据库,就算加了索引,到了千万的量级,查询速度也会变得很慢,而NoSQL,如redis、memcache则不会存在这种问题;

    4)分布式系统中存在一个已被证明的CAP定理,即C(consistency----数据一致性),A(availability----服务可用性),P(partition-tolerance----分区容错性)三个状态中,同一时刻,最多只会满足其中的两种状态;而NoSQL的服务可用性(扩展性)、分区容错性都非常高,因此十分适合对数据一致性要求不高的业务;

    4.5-1)CAP定理:数据一致性(consistency):如果系统对一个写操作返回成功,那么之后的读请求都必须读到这个新数据;如果返回失败,那么所有读操作都不能读到这个数据,对调用者而言数据具有强一致性(strong consistency) (又叫原子性 atomic、线性一致性 linearizable consistency)

    4.5-2)服务可用性(availability):所有读写请求在一定时间内得到响应,可终止、不会一直等待;

    4.5-3)分区容错性(partition-tolerance):在网络分区的情况下,被分隔的节点仍能正常对外服务 ;

    4.5-4)在某时刻如果满足AP,分隔的节点同时对外服务但不能相互通信,将导致状态不一致,即不能满足C;如果满足CP,网络分区的情况下为达成C,请求只能一直等待,即不满足A;如果要满足CA,在一定时间内要达到节点状态一致,要求不能出现网络分区,则不能满足P。C、A、P三者最多只能满足其中两个,和FLP定理一样,CAP定理也指示了一个不可达的结果(impossibility result)

  3. NoSQL的安装

    image.png

  4. Memcached

    image.png

    注:memcached server不能存储超过1M的数据,因此不适合用来存储图像和视频等大文件;

    image.png

    注:memcache数据存储的有效期默认是30天,可以通过修改源代码来修改有效期; 

    image.png 

    注:上面代码示例为php里memcache扩展的函数,php中memcache的扩展有两个,分别为memcache、memcached;

    image.png

    php用memcached存储session的设置方法代码示例:

    image.png 

    image.png

    memcached启动示例:

    image.png

    注:memcached在调试的时候可以用-vv来查看客户端的连接情况及服务端的返回情况;

    image.png

    image.png 

  5. 深入memcache

    image.png

    image.png

    image.png

    注:memcache默认是按1.25的步长来划分class的,每个class的总大小是1M,且每个class会被划分成多个chunk,每个chunk的大小是按步长来增长的,每个chunk规定了存存储在该class里的数据的最大长度,如class1里存放的是80字节以内的数据,class7存放的是280到352字节之间的数据;如果有一个292个字节的数据,该数据将会被存放到class7里,且会占掉内里352字节的空间,浪费掉60字节的空间,所以说memcache会浪费掉一些内存空间;

    image.png

    注:当某个slab里的数据满了后,如果有新数据进来时,memcach会清除掉本slab里的一些过期数据,如果没有过期数据,则会按LRU算法清除掉一些数据,让新数据进来;

    image.png 

    QQ图片20180623204602.png

    QQ图片20180623204811.png 

    注:如果cmd_get的数量和get_hits的数理相差不大,说明命中率高,是一种较为理想的使用状态;

    QQ图片20180623205203.png 

    注:如果出现evicted了,说明内存存在问题,evicted出现时,表明有未过期的数据被LRU算法换出内存;

    QQ图片20180623220656.png 

  6. 分布式存储

    image.png

    注:分布式存储最简单的方案为取余,如有10台机器,则对10取余,然后将请求提交到对应用的服务器上,但取余的方案在增或减少一个服务器时,需要迁移的数据将会非常大;

    分布式存储方案:一致性哈希 

    QQ图片20180623221753.png 

    注:以上的分布式方案为,用2的32次方个节点组成一个环状结构(结构类似于循环链表),在环的分位数结点上设置向多个node,即memcache服务器,此时,将要存储的数据的key哈希到环上,并从环上哈希到的位置向下寻找节点服务器,并将数据存储到服务器上,这样无论是增加节点还是减少节点,受影响的都只有增加或删除的节点相邻的两个节点之间的数据,需要迁移的数据也只有该节点服务器的数据;

    image.png

    QQ图片20180623224015.png

    注:乐观锁机制是用来保证多个进程对memcache中同一个key操作时产生的问题; 

  7.  Redis

    image.png

    注:redis提供了多种数据结构来处理业务逻辑; 

    image.png

    注:redis在内存满了之后,性能下降非常厉害;

    image.png

    image.png

    注:HASH相当于php的数组,php数组也一个由哈希表和双向链组成的结构;

    image.png

    image.png

    image.png

    image.png

    image.png

    image.png

    image.png 

    image.png 

    image.png 

    image.png

    image.png

    注:通常情况下时间复杂度为O(1)的都是哈希结构;

    image.png

    image.png

    image.png

    image.png

    image.png

    image.png

    image.png

    QQ图片20180624002059.png 

    image.png

    image.png 

  8. redis的事务和锁

    image.png

    image.png

    image.png

    image.png

    代码示例:

    image.png

    image.png

  9. redis持久化

    image.png

    QQ图片20180624003954.png

    image.png

    image.png

    image.png

    image.png

    image.png

    image.png

    image.png

  10. MongoDB

    image.png

    注:MongoDB不需要显式建表和字段,只需要存储就行;另外,MongoDB也是可以建立索引的;

    image.png

    注:MongoDB内置了对地理信息的处理,地理信息应用如附近的人; 高伸缩性是指在集群中增加或减少服务器的数量;

    image.png

    image.png 

    image.png

    image.png

  11. MongoDB数据的逻辑结构

    image.png 

    QQ图片20180624010920.png

    image.png

    image.png

    image.png

    QQ图片20180624011228.png

    QQ图片20180624011341.png

    image.png

    image.png

    image.png

    image.png

    image.png

    image.png 

    image.png

    QQ图片20180624012038.png

    image.png

    image.png

    image.png 

  12.  MongoDB索引

    在MongoDB中添加50W条数据;

    image.png

    image.png

    image.png

    注:检索用时375毫秒,检索总数据量为50W,相当于mysql的全表查询;

    image.png

    image.png

    image.png

    注:数据变动变慢是指添加索引后,数据变动时,索引也会跟着变动,相较于无索引时,会变慢;

    image.png

    image.png 

    QQ图片20180624013100.png

    QQ图片20180624013504.png

    QQ图片20180624014919.png

    注:覆盖索引非常快捷,对性能要求高时,可以考虑使用;

    image.png

    QQ图片20180624015254.png

    注:数组的索引无法实现覆盖索引查询,所以不建议使用;

    image.png

    image.png

    QQ图片20180624015813.png

    QQ图片20180624015932.png

  13.  深入MongoDB

    image.png

    image.png

    示例代码:

    image.png

    image.png

    注:Map Reduce是一种大数据量的解决方案,常用于大数据处理;Map Reduce在单机上效果不太,但在集群上效果很好;

    示例代码: 

    image.png 

    image.png

    注:副本集和分片都是用于解决高性能和高可用; 

    QQ图片20180624021629.png

    注:副本集类似于mysql的主从; 

    QQ图片20180624021807.png 

    注:config servers里记录了分片的信息,mongos可以通过 config servers找到shard;