1、NoSQL概述
数据库发展的几个重要结点:
(1)APP+DAL+MySQL(data access layer,数据访问层,Hibernate、mybatis)
问题:
单机硬盘、内存容量小
读写混合,单机压力大
(2)Memcached(缓存)+MySQL+垂直拆分
问题:
缓存只能解决读的压力,并未解决写的压力
(3)MySQL主从读写分离
问题:
MySQL主库的写压力仍然大
MyISAM在高并发下出现严重的锁问题(MyISAM使用表锁,InnoDB使用行锁)
(4)MySQL开始使用InnoDB做默认存储引擎+分表分库(水平拆分)+MySQL集群(水平拆分)
问题:
不适应处理大数据量
可扩展性差(实现技术复杂)
大数据下,IO操作压力大
表结构更改困难
(5)NoSQL+MySQL(当今)
Q:为什么要使用NoSQL?
A:关系型数据库不能很好的适应大数据时代中各种各样的数据类型(个人信息、地理位置、社交网络等),但NoSQL对大数据的适应性很好。
NoSQL的特点
(1)方便扩展(因为数据之间没有关系)
(2)高性能处理大数据量(因为细粒度缓存)
(3)数据类型多样(对数据库设计要求不高)
(4)NoSQL比RDBMS编程简单
(5)NoSQL的数据结构更多样化(键值对、列、文档、图等)
(6)高性能、高可用、高可扩展性(水平拆分,扩展机器)
2、阿里巴巴架构演进
参考:
阿里巴巴中文站架构技术实践:https://max.book118.com/html/2018/1219/7056023040001165.shtm
3、NoSQL数据模型
4、NoSQL四大分类
KV键值对数据库:
Redis、Tair、memecache
文档型数据库:
MongoDB、ConthDB
列存储数据库:
HBase、分布式文件系统
图关系数据库:
Neo4j、InfoGrid
5、CAP
6、BASE
7、Redis简介
Redis(Remote Dictionary Server, 远程字典服务)是一个开源的、C语言编写的、可基于内存、可持久化的、日志型的KV数据库。
Redis能实现 :
(1)数据内存存储和持久化
(2)可用于实现高速缓存
(3)发布订阅系统、地图信息分析、计数器(浏览量)等等。。。。。。
Redis命令
参考:
菜鸟教程:https://www.runoob.com/redis/redis-commands.html
redis官网命令集:https://redis.io/commands
参考:
官网:https://redis.io/
中文网:https://www.redis.cn/
8、五大基本数据类型
9、三种特殊数据类型
10、Redis配置详解
11、Redis持久化
redis是基于内存的数据库,如果不使用持久化,数据断电即失。
1、rdb(redis database)
(1)每间隔一段时间,redis进行一次持久化操作。
(2)父进程分叉出一个子进程和内存页面副本,并与子进程共享内存,子进程将共享的内存数据写入临时的rdb文件(内存数据快照),并将其覆盖正式的rdb文件。(默认保存的文件名是 dump.rdb)
(3)父进程在子进程持久化的时候,仍能处理client的写请求,但写入的不是真实内存,而是内存页面的副本,在子进程完成持久化后,将该内存页面副本替换真实内存。
ps:rdb方式进行持久化,主进程不进行io操作,并在持久化时持续处理写请求;但最后一次持久化后的操作可能丢失。
2、aof(append only file)
以日志的形式追加记录所有的写操作指令,并保存在aof文件中。启动redis,将把aof所有的指令重新执行一遍以恢复内存数据。
优势:
sync every ops,数据完整性更好
sync every secs,可能丢失一秒数据,但效率会高
never sync,效率最高
劣势:
aof更消耗存储空间,修复速度也比rbd更慢
aof运行效率也更慢
12、事务操作
13、订阅/发布模型
14、主从复制
主从复制的目的是为了避免单点故障。
参考:https://blog.csdn.net/weixin_39764056/article/details/104345786
15、哨兵模式
哨兵的作用有两个:
1、通过发送命令,监控各个服务器的运行状态。
2、当监测到服务器down机时,通过发布/订阅模式,通知其他slave服务器修改配置文件,切换master服务器。
多哨兵模式
单哨兵模式可能会出现问题,因此存在多哨兵共同监控服务器,哨兵之间也会相互监测。
主观下线:一个哨兵发现master服务器down机。
客观下线:发现master服务器down机的哨兵达到一定数量时,其中一个哨兵发起failover操作,多个哨兵一起投票,选举一个正常运行的slave服务器,发起failover的哨兵发起投票结果,并通过订阅/发布模式通知其他哨兵切换master。
哨兵模式的配置参考:https://www.jianshu.com/p/06ab9daf921d
16、缓存穿透及解决方案(面试高频,工作常用)
当大量用户同时去查询缓存中不存在的数据项,将会造成数据库的高负荷,就像缓存被穿透了。
解决方案:
(1)布隆过滤器
布隆过滤器是一种数据结构,对所有可能的查询参数以hash形式存储,在控制层先进行校验,查询的hash结果在布隆过滤器中不存在,则丢弃该请求,避免对底层存储系统进行大量无效查询。
布隆过滤器原理参考:
https://www.cnblogs.com/zqyx/p/13673597.html
https://baike.baidu.com/item/%E5%B8%83%E9%9A%86%E8%BF%87%E6%BB%A4%E5%99%A8/5384697?fr=aladdin
(2)缓存空对象
对于没有命中的缓存读请求,在缓存中添加一个空对象,避免对数据库服务器的大量空结果读访问。
缺点:
空对象消耗了一定的内存空间。
缓存中的空对象可能会与服务器中的数据存在数据不一致的情况(缓存空对象未超时,但该对象的键在数据库中被写入了内容),可能会影响业务。
17、缓存击穿及解决方案(面试高频,工作常用)
当某个key(数据库记录)具有较大的并发访问量,当该key在缓存中过期,对该key的大量访问将会直接落到底层存储系统上,并且该底层存储系统也会回写缓存,这将造成底层存储系统的压力过大。
解决方案:
(1)热点数据取消过期时间
(2)加互斥锁(分布式锁)
保证每个key在一个时间内只有一个线程访问,其他线程不能持有该锁,只能等待。
缺点:这种方式对分布式锁的压力较大。
18、缓存雪崩及解决方案(面试高频,工作常用)
某个时间段内,缓存集中过期失效。(场景比如:redis宕机、业务某种需求等)
解决方案:
(1)redis高可用:
增设redis服务器,搭建集群,异地多活。
关闭不必要的服务。
(2)限流降级(spring cloud):
缓存失效后,通过加锁、队列的方式控制读数据库、写缓存的线程数量。
(3)数据预热:
预先访问可能存在高并发访问的数据(提前回写缓存)、设置均匀分布的失效时间。
19、基础API之Jedis详解
20、SpringBoot集成Redis
SpringData提供数据及数据库访问技术,基于Spring编程模型,保留了基础数据存储的特殊特征。
Spring1.x中的SpringData使用jedis,Spring2.x中的SpringData使用lettce实现SpringBoot和Redis整合:
(1)jedis:TODO
(2)lettuce:TODO
21、Redis实践