
目录1、Redis 是什么2、对比 MySQL3、单机架构与分布式架构3.1 引入分布式架构3.2 引入负载均衡3.3 数据库读写分离3.4 引入缓存服务器3.5 数据库分库分表3.6 引入微服务4、Redis 的一些特性4.1 基于内存 高性能4.2 可编程性4.3 可扩展性4.4 持久化1、Redis 是什么RedisRemote Dictionary Server是一个开源的、在内存使用键值对存储数据的系统常被称为“数据结构服务器”。它的核心特点基于内存数据主要存放在内存中读写速度极快微秒级通常能达到 10万 QPS。但仍然比直接在内存中定义和访问变量要慢。丰富的数据结构不只是简单的 key-value支持 String、Hash、List、Set、ZSet有序集合、BitMap、HyperLogLog、Stream 等。持久化可选提供 RDB快照和 AOF追加日志两种方式可以把内存数据落盘但持久化不是它的强项。单线程模型核心命令处理避免锁竞争配合 I/O 多路复用性能极高。Redis 6.0 后网络 I/O 引入多线程。常用作缓存这是它最广泛的用途也用于分布式锁、计数器、排行榜、消息队列、会话存储等。2、对比 MySQL维度RedisMySQL存储介质内存为主可持久化到磁盘磁盘为主内存做缓存数据模型Key-Value 多种数据结构非关系型数据库关系表行/列Schema 固定关系型数据库查询方式命令式 APIGET/SET/LPUSH…SQL读写速度极快微秒级10万 QPS较慢毫秒级千级 QPS 常见容量受内存限制通常 GB 级受磁盘限制可 TB/PB 级事务支持简单事务MULTI/EXEC无回滚完整 ACID 事务支持回滚一致性最终一致主从异步复制强一致可配置隔离级别复杂查询不支持 JOIN、聚合等支持 JOIN、GROUP BY、子查询持久化可选可能丢数据默认强持久化典型用途缓存、计数器、排行榜、分布式锁、队列业务主数据、订单、用户、交易成本内存贵单位容量成本高磁盘便宜单位容量成本低3、单机架构与分布式架构3.1 引入分布式架构注意下面的演化过程只是一个粗略的过程真实的商业项目演化与业务密切相关业务比技术更重要技术只是给业务提供支持。单机架构所有组件应用、数据库、缓存都跑在一台机器上或者每个组件只部署一个实例。分布式架构多个节点协同工作对外表现为一个整体解决单机在容量、性能、可用性上的天花板。单机的瓶颈通常有三个CPU/内存上限一台机器再强也有上限单点故障机器挂了服务就没了扩展困难只能垂直升级换更好的机器成本高且有极限分布式就是为了突破这三点。但是分布式也有缺点增加代码的复杂度容易出现 BUG。3.2 引入负载均衡负载均衡把大量并发请求按照某种策略分发到多个服务器上让每台机器都不至于过载同时提升整体吞吐和可用性。常见负载均衡算法算法说明适用场景轮询Round Robin依次分发后端性能相近加权轮询按权重分发机器配置不同最少连接发给当前连接最少的请求耗时差异大加权最少连接连接数 权重综合场景IP Hash同一 IP 固定到同一后端需要会话保持一致性 Hash节点增减时影响小缓存类场景随机随机选简单场景响应时间最短选响应最快的对延迟敏感3.3 数据库读写分离上面的分布式架构中多个应用服务器都读写一台存储服务器而大多数互联网业务是读多写少典型比例 10:1 甚至 100:1。单库面临的问题读请求太多CPU 和连接数被占满写请求和读请求互相争抢资源单机容量和性能有上限解决方案建立两个数据库一个主库和从库主控负责写请求从库负责读请求。再定期的将主库和从库的数据进行同步3.4 引入缓存服务器存储服务器存储的大概 20% 的数据可以满足大概 80% 的访问请求。如果将所有数据都放入 MySQL用户的请求都要读取 MySQL 的数据而 MySQL 的访问速度远小于 Redis 的访问速度。所以我们可以把那大概 20% 的热点数据存储在 RedisRedis 所在的服务器称为缓存服务器。MySQL 仍然存储所有数据。3.5 数据库分库分表有时候数据多到一台存储服务器都存储不下的情况这时候就需要多台存储服务器既然有了多台服务器之前都是将用户表、商品表、交易表存储在同一个数据库服务器的不同数据库那么现在可以将这些分别存储在不同的数据库服务器上。即一个数据库服务器只存储一个或一部分数据库。如果一个数据库太大一台数据库服务器都存不下我们可以对该数据库进行拆分比如拆成 5 部分分别用 5 台数据库服务器存储。3.6 引入微服务之前应用服务器,一个服务器程序里面做了很多的业务.这就可能会导致这一个服务器的代码变的越来越复杂为了更方便于代码的维护,就可以把这样的一个复杂的服务器,拆分成更多的,功能更单一,但是更小的服务器。这样做虽然更方便于代码的维护更方便于代码复用。但代价是系统性能的下降因为不同的微服务之间需要网络进行通信网络传输的速度很可能比读取硬盘的速度都还要慢。但是现在的万兆网卡读写的速度已经超过硬盘的读写速度了。系统复杂程度提高系统可用性下降可用性 系统实际运行时间 / 总时间这就需要一系列的手段来保证系统的可用性比如更丰富的监控系统以及配套的运维人员。4、Redis 的一些特性4.1 基于内存 高性能数据放内存读写延迟微秒级单机可达10万 QPS单线程处理命令避免锁竞争和上下文切换命令原子执行。多线程提高效率的前提是 CPU 密集型任务此时使用多线程可以充分利用 CPU 的多核资源而 Redis 的主要任务是操作内存的数据结构不会占用很多 CPU 资源I/O 多路复用epoll/kqueue 处理海量连接Redis 6.0 后网络 I/O 引入多线程命令处理仍是单线程4.2 可编程性针对 Redis 的操作,可以直接通过简单的交互式命令进行操作.也可以通过一些脚本的方式,批量执行一些操作(可以带有一些逻辑)。Redis 的可编程性主要经历了三个阶段Lua 脚本、Redis Functions以及更进一步的触发器和函数4.3 可扩展性Redis 的可扩展性核心在于Modules模块系统。如果说 Lua 脚本和 Functions 是让你在 Redis 提供的“积木”上搭东西那 Modules 就是让你自己造积木甚至改造积木的材质。它的目标很明确让开发者能够以接近 Redis 原生命令的速度去扩展全新的数据结构和命令4.4 持久化Redis 是内存数据库但提供两种持久化方式RDB快照某一时刻把内存数据全量写入磁盘优点文件小、恢复快、适合备份缺点两次快照之间宕机会丢数据AOF追加日志记录每条写命令重启时重放优点丢数据少可配置每秒同步缺点文件大、恢复慢混合持久化4.0RDB 全量 AOF 增量结合兼顾恢复速度和数据安全实际生产中常用RDB AOF 混合并配合主从复制做冗余。