一、 关系型数据库和 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 RDBMS和NOSQL的特点及优缺点
关系型数据库 | NoSQL数据库 | |
---|---|---|
特点 | 数据关系基于关系模型,结构化存储,完整性约束 基于二维表及之间的联系,需要连接,并、交、差、除等数据操作 采用结构化的查询语言(SQL)做数据读写 操作需要数据的一致性,需要事务甚至是强一致性 |
非结构化的存储 基于多维关系模型 具有特有的使用场景 |
优点 | 保持数据的一致性(事务处理) 可以进行join等复杂查询 通用化,技术成熟 |
高并发,大数据下读写能力较强 支持分布式,易于扩展,可伸缩 简单,弱结构化存储 |
缺点 | 数据读写必须经过SQL分析,大量数据,高并发下读写性能不足 对数据做读写或者修改数据结构时需要加锁,影响并发操作 无法适应非结构化存储 扩展困难 昂贵、复杂 |
join等复杂操作能力较弱 事务支持较弱 通用性差 无完整约束,复杂业务场景支持较差 |
二、Redis简介
2.1 Redis介绍
Redis 是一个开源的、基于内存的数据结构存储系统(NoSQL),通常用作数据库、缓存和消息代理。它的名字源自 “REmote DIctionary Server”(远程字典服务器)。目前国内外使用的公司众多,比如:阿里,百度,新浪微博,知乎网,GitHub,Twitter 等Redis是一个开源的、遵循BSD协议的、基于内存的而且目前比较流行的键值数据库(key-valuedatabase),是一个非关系型数据库,redis 提供将内存通过网络远程共享的一种服务,提供类似功能的还有memcached,但相比memcached,redis还提供了易扩展、高性能、具备数据持久性等功能。Redis 在高并发、低延迟环境要求比较高的环境使用量非常广泛
2.2 Redis特性
- 速度快: 10W QPS,基于内存,C语言实现
- 单线程
- 持久化
- 支持多种数据结构
- 支持多种编程语言
- 功能丰富: 支持Lua脚本,发布订阅,事务,pipeline等功能
- 简单: 代码短小精悍(单机核心代码只有23000行左右),单线程开发容易,不依赖外部库,使用简单
- 主从复制
- 支持高可用和分布式
单线程为何如此快?
- 纯内存
- 非阻塞
- 避免线程切换和竞态消耗
2.3 Redis应用场景
- Session 共享:常见于web集群中的Tomcat或者PHP中多web服务器session共享
- 缓存:数据查询、电商网站商品信息、新闻内容
- 计数器:访问排行榜、商品浏览数等和次数相关的数值统计场景
- 微博/微信社交场合:共同好友,粉丝数,关注,点赞评论等
- 消息队列:ELK的日志缓存、部分业务的订阅发布系统
- 地理位置: 基于GEO(地理信息定位),实现摇一摇,附近的人,外卖等功能
2.4 缓存的实现流程
-
数据更新操作流程
写入数据:
- 应用程序尝试将新的数据写入 MySQL 数据库。
写MySQL:
- 如果数据成功写入 MySQL:
- 程序会继续进行下一步操作,即删除 Redis 中对应的缓存项。
- 如果写入 MySQL 失败:
- 程序直接返回,表示操作失败,不做进一步处理。
删除Redis对应项:
- 在 MySQL 数据写入成功后,程序会删除 Redis 中与此次写入相关的缓存数据。这一步是为了确保 Redis 缓存中的数据与 MySQL 数据库中的数据保持一致性。
返回:
- 最后,程序将返回操作结果,通知调用方操作的成功与否。
-
数据读取操作流程
读取数据请求:
- 客户端或应用程序发起一个读取数据的请求。
读Redis:
- 系统首先尝试从 Redis 缓存中读取数据:
- 如果从 Redis 中读取到了数据,直接返回读取的数据。
- 如果未能从 Redis 中读取到数据,执行下一步操作。
读MySQL:
- 当 Redis 中未命中(即缓存中没有请求的数据),系统将回源到 MySQL 数据库进行查询:
- 如果 MySQL 中也未能获取到相应的数据,则返回“未读取到数据”的状态或相应的错误信息给客户端。
- 如果 MySQL 查询成功,读取到所需数据。
写Redis:
- 当从 MySQL 成功读取数据后,系统会将此数据写入到 Redis 中。这样做的目的是为了缓存数据,便于后续相同请求的快速响应。
返回数据:
- 最终,无论是从 Redis 还是 MySQL 中获取的数据,都会返回给客户端或调用方。
三、Redis的安装
官方下载地址:http://download.redis.io/releases/
3.1Redis的基础环境部署
主机名 | IP | 角色 |
---|---|---|
redis-node1 | 172.25.254.14 | master |
redis-node2 | 172.25.254.24 | slave1 |
redis-node3 | 172.25.254.34 | slave2 |
注意:以下案例的实现所有环境都为Rehl9.1
# 配置好以上后,需要将防火墙关闭,以防影响案例的实现
[root@redis-node1 ~]# systemctl stop firewalld.service
[root@redis-node1 ~]# systemctl mask firewalld.service
[root@redis-node1 ~]# setenforce 0
3.2rpm包方式安装
[root@redis-node1 ~]# dnf install redis -y
正在更新 Subscription Management 软件仓库。
无法读取客户身份
本系统尚未在权利服务器中注册。可使用 subscription-manager 进行注册。
上次元数据过期检查:0:21:21 前,执行于 2024年08月25日 星期日 22时33分52秒。
依赖关系解决。
=========================================================================================
软件包 架构 版本 仓库 大小
========================================================