1. NoSQL 数据库简介
参考课程:https://www.bilibili.com/video/BV1Rv41177Af
参考书:https://blog.csdn.net/liu8490631/article/details/124290851
1.1 技术发展
技术分类:
- 解决功能性问题:Java,JSP,RDBMS,Tomcat,HTML,Linux,JDBC,SVN
- 解决扩展性问题:Struts,Spring, SpringMVC,Hibernate,Mybatis
- 解决性能的问题:NoSQL,Java 线程,Hadoop,Nginx,MQ,ElasticSearch
1.1.1 Web 1.0 时代
PC → \to → Web Server → \to → DB Service
1.1.2 Web 2.0 时代
用户访问量大幅增加,同时产生了大量的用户数据。加上后来的智能移动设备的普及,所有的互联网平台都面临了巨大的性能挑战。
1.1.3 出现的原因1:为了解决 CPU 和 内存压力
n*PC → \to → Nginx (反向代理,负载均衡 ) → \to → 多个服务器
★★★★★:用户第一次登录,用户 session 保存在服务器 1,第二次访问可能到了服务器2,但是服务器 2 中没有该用户的 session,怎么办?session 怎么存储?
方案 1:保存在客户端 cookie 里面。难保证安全性
方案 2:session 复制,将 session 复制到其他服务器。造成 session 数据冗余,节点越多,浪费越多。
方案 3:保存在文件服务器或者数据库里。大量 IO 问题。
方案 4:NoSQL 缓存服务器,连接每个 Web 服务器。完全在内存中,速度快,数据结构简单。
1.1.4 出现的原因2:为了解决 IO 压力
1.2 NoSQL 数据库
1.2.1 概述
NoSQL = Not Only SQL,不仅仅是 SQL,泛指非关系型数据库。
关系型数据库(如 MySQL),按照业务逻辑存储有关联的数据。
NoSQL 不依赖业务逻辑,而以简单的 key-value 模式存储。因此大大增加了数据库的扩展能力。
- 不遵循 SQL 标准
- 不支持 ACID(原子性,一致性,隔离性,持久性)
- 远超于 SQL 的性能
1.2.2 NoSQL 适用场景
- 对数据高并发的读写
- 海量数据的读写
- 对数据高可扩展性
如商城秒杀。
1.2.3 NoSQL 不适用场景
- 需要事务支持
- 基于 SQL 的结构化查询存储,处理复杂的关系,需要即席查询
(用户根据自己的需求,灵活的选择查询条件,系统能够根据用户的选择生成相应的统计报表。即席查询与普通应用查询最大的不同是普通的应用查询是定制开发的,而即席查询是由用户自定义查询条件的。) - 用不着 SQL 的和用了 SQL 也不行的情况,请考虑 NoSQL
1.2.4 Memcached
- 很早出现的 NoSQL 数据库
- 数据都在内存,一般不持久化
- 支持简单的 key-value 模式,只支持普通的字符串键
- 一般是作为缓存数据库辅助持久化的数据库
1.2.5 Redis
- 几乎覆盖了 Memcached 的绝大部分功能
- 数据都在内存中,支持持久化,主要用作备份恢复
- 除了支持简单的 key-value 模式,还支持多种数据结构的存储,比如:list,set,hash,zset 等
- 一般是作为缓存数据库辅助持久化的数据库
1.2.6 MongoDB
- 高性能,开源,模式自由(schema free)的文档型数据库
- 数据都在内存中,如果内存不足,把不常用的数据保存到硬盘
- 虽然是 key-value 模式,但是对 value(尤其是 JSON)提供了丰富的查询功能
- 支持二进制数据以及大型对象
- 可以根据数据的特点替代 RDBMS,成为独立的数据库,或者配合 RDBMS,存储特定的数据
1.3 行式存储数据库(大数据时代)
1.3.1 行式数据库
找某一行较快,但是找某一列的数据较慢
1.3.2 列式数据库
找某一行较慢,但是找某一列的数据较块
1.3.2.1 Hbase
Hbase 是 Hadoop 项目中的数据库。用于需要对大量数据进行随机、实时的读写操作的场景中。
Hbase 的目标就是处理数据量非常庞大的表,可以用普通的计算机处理超过 10 亿行数据,还可以处理有数百万列元素的数据表。
1.4 图关系型数据库
Neo4j
主要应用于:社会关系,公共交通网络,地图及网络拓扑(n*(n-1)/2)
1.5 DB-Engines 数据库排名
https://db-engines.com/en/ranking
2. Redis 概述
- 开源的
K-V
存储系统。 - 支持存储的 value 类型:
- string 字符串
- list 链表
- set 集合
- zset 有序集合
- hash 哈希类型
- 上述类型都支持 push/pop,add/remove ,这些操作都是原子性的。
- 支持各种不同方式的排序
- 数据存在内存中
- Redis 可以周期性地把更新的数据写入磁盘或者把修改操作写入追加地记录文件
- 实现
master-slave
(主从)同步
2.1 应用场景
2.1.1 配合关系型数据库做高速缓存
- 高频次,热门访问的数据,降低数据库 IO
- 分布式架构,做 session 共享
2.1.2 多样的数据结构存储持久化数据
- 排行榜,Top-N:
- 利用 zset 有序集合
- 手机验证码:
- Expire 过期
- 计数器,秒杀:
- 原子性,自增方法 INCR,DECR
- 去除大量数据中的重复数据:
- set 集合
- 构建队列:
- 利用 list
- 发布订阅消息系统:
- pub/sub 模式