一、关系型数据库和 NoSQL 数据库
1.1 数据库主要分为两大类:关系型数据库与 NoSQL 数据库
关系型数据库,是建立在关系模型基础上的数据库,其借助于集合代数等数学概念和方法来处理数据库
中的数据主流的 MySQL、Oracle、MS SQL Server 和 DB2 都属于这类传统数据库。
NoSQL 数据库,全称为 Not Only SQL,意思就是适用关系型数据库的时候就使用关系型数据库,不适
用的时候也没有必要非使用关系型数据库不可,可以考虑使用更加合适的数据存储。主要分为临时性键
值存储(memcached、Redis)、永久性键值存储(ROMA、Redis)、面向文档的数据库(MongoDB、CouchDB)、面向列的数据库(Cassandra,HBase),每种 NoSQL 都有其特有的使用场景及优点。
1.2 为什么要使用nosql数据库呢?
在特殊场景下nosql数据库能够提供比关系型数据库更多的优势。例如:
-
可扩展性
NoSQL 数据库通常设计为易于水平扩展,这意味着它们可以在分布式环境中运行,并且可以通过添加更多的节点来扩展存储容量和处理能力。相比之下,关系型数据库通常更适合垂直扩展(即通过增加单个服务器的性能来提升性能)。 -
高可用性和容错性
NoSQL 数据库通常内置了数据复制和分片功能,这意味着数据可以被复制到多个节点上,从而提高了系统的可用性和容错性。即使某个节点发生故障,系统仍然可以继续工作,因为数据在其他节点上有副本。 -
灵活性
NoSQL 数据库支持非结构化数据模型,这意味着它们可以轻松地处理不同类型的数据,如文档、图形、键值对等。这使得 NoSQL 数据库非常适合处理多样化的数据类型,例如 JSON 文档、图像元数据等。 -
性能
NoSQL 数据库在某些类型的查询和操作上提供了更高的性能,特别是对于大量的读写操作。这是因为 NoSQL 数据库通常针对特定类型的操作进行了优化,例如,键值存储非常适合快速查找和检索数据。 -
易于集成
NoSQL 数据库通常提供了丰富的客户端库和 API,使得它们更容易与其他系统和服务集成。例如,MongoDB 提供了多种语言的驱动程序,使得开发者可以轻松地在应用程序中使用 MongoDB。 -
实时数据处理
NoSQL 数据库非常适合实时数据处理和分析,因为它们可以提供低延迟的数据访问。例如,Cassandra 和 Redis 等 NoSQL 数据库在实时数据流处理和缓存方面表现出色。 -
大规模数据存储
对于需要存储和处理大量数据的应用程序,NoSQL 数据库提供了一种有效的解决方案。例如,HBase 和 Cassandra 可以用于存储和查询 PB 级别的数据。 -
地理分布
NoSQL 数据库通常支持地理分布式的部署,这意味着数据可以在全球范围内分布存储。这对于需要在全球范围内提供低延迟服务的应用程序来说是非常重要的。 -
数据模型的多样性
NoSQL 数据库支持多种数据模型,包括键值存储(如 Redis)、文档数据库(如 MongoDB)、列族存储(如 Cassandra)、图形数据库(如 Neo4j)等。每种数据模型都有其适用场景,可以根据具体需求选择合适的数据模型。 -
简化复杂性
对于某些应用程序而言,使用 NoSQL 数据库可以简化数据模型和应用程序的复杂性。例如,文档数据库允许在单个文档中存储复杂的数据结构,而不需要进行复杂的规范化过程。
1.3 RDBMS和NOSQL的特点及优缺点:
二、什么是redis?
Redis (Remote Dictionary Server)
在2009年发布,开发者是意大利的萨尔瓦多·桑菲利波普(Salvatore Sanfilippo),他本想为自己的公司
开发一个用于替换MySQL的产品Redis,但是没有想到他把Redis开源后大受欢迎,短短几年,Redis就有了很大的用户群体,目前国内外使用的公司众多,比如:阿里,百度,新浪微博,知乎网,GitHub,Twitter 等
Redis是一个开源的、遵循BSD协议的、基于内存的而且目前比较流行的键值数据库(key-value database),是一个非关系型数据库,redis 提供将内存通过网络远程共享的一种服务,提供类似功能的还有memcached,但相比memcached,redis还提供了易扩展、高性能、具备数据持久性等功能。Redis 在高并发、低延迟环境要求比较高的环境使用量非常广泛。
2.1 Redis特性
-
内存存储
Redis 将所有数据存储在内存中,这是其高性能的关键所在。内存访问速度远高于磁盘访问速度,因此 Redis 能够提供极高的读写性能。 -
持久化
尽管 Redis 主要是一个内存数据库,但它也支持数据的持久化,以防止数据丢失。Redis 提供两种持久化方式:
- RDB (Redis Database Backup):定期生成数据快照(snapshot),将内存中的数据保存到磁盘上。
- AOF (Append Only File):每次执行写操作时,将操作记录到一个日志文件中,该文件可以用于恢复数据。
- 数据结构丰富
Redis 支持多种数据结构,包括:
- String(字符串):最简单的键值对存储。
- Hash(哈希):存储键值对的集合,适合存储对象。
- List(列表):存储字符串列表,适用于消息队列。
- Set(集合):存储不重复的元素集合。
- Sorted Set(有序集合):存储带有分数的元素集合,可以按分数排序。
- Stream(流):用于处理消息队列和实时数据流。
-
网络协议
Redis 使用一种简单的文本协议进行通信,客户端可以通过 TCP 或 Unix socket 连接到 Redis 服务器。这种协议易于实现,并且支持多种编程语言的客户端库。 -
发布/订阅
Redis 支持发布/订阅模式(Pub/Sub),允许客户端订阅频道并接收来自其他客户端发布的消息。这种功能非常适合构建消息传递系统和实时应用程序。 -
事务
虽然 Redis 不支持传统的 SQL 事务,但它提供了一些事务相关的功能,如 MULTI 和 EXEC 命令,可以将一系列命令打包执行,从而实现某种形式的原子性操作。 -
Lua 脚本
Redis 支持 Lua 脚本,允许用户编写脚本来执行复杂的操作。Lua 脚本在 Redis 服务器端执行,可以减少网络延迟并提高性能。 -
主从复制
Redis 支持主从复制,一个主节点可以有多个从节点。从节点可以作为读副本,从而实现读写分离,提高读取性能。此外,从节点还可以用于数据备份和高可用性。 -
集群模式
Redis 集群支持水平扩展,通过数据分片和复制来提高性能和可靠性。集群模式可以自动重分配数据,并支持自动故障转移。 -
内存管理
Redis 有多种内存管理策略,如 LRU(Least Recently Used)和 LFU(Least Frequently Used),用于在内存不足时释放不常用的键值对。 -
安全性
Redis 支持密码认证和 SSL/TLS 加密,以保护数据的安全性和隐私。 -
模块化
Redis 允许通过加载外部模块来扩展其功能,这使得 Redis 可以支持更多的数据类型和功能,如 Redis 搜索(RediSearch)和 Redis 图数据库(RedisGraph)。 -
广泛的客户端支持
Redis 拥有各种编程语言的客户端库,几乎所有的主流编程语言都有对应的 Redis 客户端,如 Python、Java、Node.js 等。 -
监控和统计
Redis 提供了丰富的监控和统计信息,可以通过命令或工具来查看服务器的状态、性能指标和使用情况。 -
命令丰富
Redis 提供了大量的命令,覆盖了数据操作、事务处理、键管理等多个方面,使得 Redis 能够灵活地应用于各种场景。
单线程为何如此快?
- 纯内存
- 非阻塞
- 避免线程切换和竞态消耗
2.2 Redis应用场景
- Session 共享:常见于web集群中的Tomcat或者PHP中多web服务器session共享
- 缓存:数据查询、电商网站商品信息、新闻内容
- 计数器:访问排行榜、商品浏览数等和次数相关的数值统计场景
- 微博/微信社交场合:共同好友,粉丝数,关注,点赞评论等
- 消息队列:ELK的日志缓存、部分业务的订阅发布系统
- 地理位置: 基于GEO(地理信息定位),实现摇一摇,附近的人,外卖等功能
2.3 缓存的实现流程
数据更新操作流程
数据读操作流程