redis -- redis介绍,性能(与mysql性能对比),使用场景,CAP介绍
目录
redis
介绍
性能
性能对比分析
基于内存 vs 基于磁盘
单线程 vs 多线程
高效数据结构
更少的功能负担
无磁盘 I/O 延迟
响应快,延迟低
使用场景
CAP
redis
介绍
Redis是一种开源的基于内存的数据库,对数据的读写操作都是在内存中完成,因此读写速度非常快
Redis提供了多种数据类型来支持不同的业务场景 -- String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Zset(有序集合)、Bitmaps(位图)、HyperLogLog(基数统计)、GEO(地理信息)、Stream(流)
- 因为执行命令由单线程负责,不存在并发竞争的问题,所以redis中对数据类型的操作都是原子性的
除此之外,Redis还支持事务、持久化、Lua脚本、多种集群方案(主从复制模式、哨兵模式、切片集群模式)、发布/订阅模式,内存淘汰机制、过期删除机制等高级功能
性能
redis比mysql快很多
单台设备的Redis的QPS(Query Per Second,每秒钟处理完请求的次数)是MySQL的10倍
- Redis单机的QPS能轻松破10w,而MySQL单机的QPS很难破1w
但也不是说redis就可以完全替代mysql了
- 和mysql相比,最大的劣势是存储空间有限
如果想要又大又快,可以将redis和mysql结合起来使用,也就是让redis作为mysql的缓存
- 二八原则 -- 只要缓存20%的热点数据,就能满足80%的访问需求
- 但这样会使系统复杂度提升,数据修改后涉及到mysql和redis的数据同步问题
性能对比分析
可以从 架构层面、存储介质、设计目标、功能开销 四个方面来分析
基于内存 vs 基于磁盘
Redis:数据都存储在内存中,访问延迟一般为微秒级(<1ms)
MySQL:数据存储在磁盘/SSD 中,访问延迟为毫秒级(1~10ms)
内存读写比磁盘 I/O 快几个数量级,这是最根本的差距
单线程 vs 多线程
Redis 单线程处理客户端请求,避免了上下文切换和加锁带来的性能损耗(所有操作原子执行,线程安全)
MySQL 多线程(InnoDB 等存储引擎)需要加锁、事务隔离、调度等复杂操作
高效数据结构
Redis 的底层使用高度优化的数据结构,如压缩列表,哈希表,跳表等(数据结构是为特定场景优化的)
而 MySQL 使用的是通用的 B+ 树存储结构,操作复杂度更高
更少的功能负担
Redis 是 K-V 存储(NoSQL),专注于缓存、简单计算等高性能场景
MySQL 是关系型数据库,具备 ACID、事务、SQL 解析、查询优化器、表关联、索引维护等复杂逻辑,性能损耗大
无磁盘 I/O 延迟
Redis 所有数据都在内存中,只有在持久化(RDB/AOF)或异步备份时才涉及磁盘
MySQL 每次更新都要写 redo log、undo log、binlog、buffer pool 等多个组件
响应快,延迟低
Redis 使用 epoll + 单线程事件循环模型,没有上下文切换、没有线程调度,效率非常高
请求处理简单,没有复杂的 SQL 解析、事务锁、优化器、执行计划等过程,请求来了就直接查内存,结果原样返回,几乎没有多余的逻辑,响应延迟非常低
使用场景
- redis的初心本来是实现消息队列中的消息中间件,也就是实现分布式系统喜爱的CP模型(保证一致性和可用性)
- 但很少会直接使用redis作为消息中间件,因为有其他更好的产品 -- 复杂或高并发场景推荐用 Kafka、RabbitMQ、RocketMQ
CAP
CAP 理论是分布式系统中的一个基本理论 -- 在一个分布式系统中,最多只能同时满足以下三个中的两个:
- 其中,P是一定要有的
在分布式部署下(比如主从、哨兵、集群),Redis 更偏向于 CP:
- 也就是说,Redis宁可短暂不可用,也要保证数据一致