NoSQL(Not only SQL)
NoSQL指的是非关系型、分布式的数据库管理系统,它是为了应对互联网时代海量数据、高并发、高扩展性 以及非结构化数据的挑战而诞生的
NoSQL与SQL的区别
| 维度 | SQL (关系型数据库) | NoSQL (非关系型数据库) |
|---|---|---|
| 数据模型 | 表格(行/列),结构固定,有严格模式(Schema) | 文档、键值对、图、列族等,结构灵活,无模式或动态模式 |
| 存储示例 | users表、orders表,通过user_id外键关联 |
一个订单文档包含:{ "user": {...}, "items": [...], "total": 100 } |
| 扩展方式 | 垂直扩展(升级单台服务器的CPU、内存、硬盘) | 水平扩展(增加更多廉价服务器,分摊数据) |
| 事务支持 | ACID (强一致性,支持复杂事务,如银行转账) | BASE (最终一致性,事务支持较弱或不支持) |
| 查询语言 | 结构化查询语言 (SQL),标准化,功能强大 | 各产品有自己的API或查询语言(如MongoDB的find()),不统一 |
| 最佳场景 | 数据结构稳定、需要复杂关联查询、要求强数据一致性 | 海量数据、高并发写入、数据结构多变、需要快速迭代 |
-
SQL以数据表的形式存储数据,而NoSQL的数据模型不固定,能够以键值对(Redis)、JSON文档(MongoDB)、图(Neo4j)、列族(HBase)等形式存储数据,所以NoSQL是非结构化的
-
关系型数据库以结构化查询语言SQL进行查询操作,而不同NoSQL(redis、MongoDB)的查询语句不一样
-
SQL的特点是数据结构稳定、需要复杂关联查询、要求强数据一致性;NoSQL的特点是海量数据、高并发写入、数据结构多变、需要快速迭代
Redis架构
Redis 是一个开源的、基于内存的键值对存储系统
-
键值型:value支持多种不同的数据结构,结构丰富
-
速度快 :数据存储在内存中,读写速度极快
-
持久化:提供 RDB (快照) 和 AOF (日志) 两种方式将内存数据保存到磁盘
-
**高可用与分布式:**提供主从复制、哨兵 (Sentinel) 和集群 (Cluster) 模式
工作原理
Redis是一个标准的C/S(客户端-服务器)架构
Client (客户端): 向服务器发送命令(如 SET、GET),接收并展示返回结果;你在终端里敲的命令由它接收,并通过网络发送给redis-server执行
-
命令行客户端 :redis-cli
-
图形化桌面客户端
-
编程客户端
**Server (服务器端):**负责存储数据、处理命令、管理内存、执行持久化、处理复制和集群等核心逻辑
完整交互过程:
-
启动服务器 :在服务器上运行
redis-server,它会监听一个端口(默认 6379),等待连接。 -
客户端连接 :客户端(如
redis-cli)通过 TCP 协议连接到服务器的 6379 端口,建立一个网络连接。 -
发送请求 :客户端向服务器发送一条命令,例如
GET mykey。 -
处理与响应 :服务器接收、解析并执行命令(从内存中读取
mykey的值),然后将结果通过网络返回给客户端。 -
关闭连接:当客户端主动退出或连接超时,TCP 连接会断开。
Redis数据结构
Redis是一个键值对(key-value)数据库,key一般是string类型,不过value的数据结构有很多
-
string:字符串
-
hash :哈希,自带快速定位索引的键值对数组
-
list :字符串列表,按照插入顺序排序。本质是一个双向链表
-
set :集合,无序的、不可重复的字符串集合
-
Sorted Set:有序集合
每一种数据类型它的操作命令都不一样