Redis基础了解
Redis 基础
一、什么是 Redis
总的来说,Redis 是一种基于键值对的 NoSQL数据库
这时候你可能会问,什么是 NoSQL?这个和 我们了解的 MySQL有什么区别?
想要知道这些问题,我们要知道数据库有很多种类型,而这里主要体现了关系型数据库和非关系型数据库。
关系型数据库
像 Excel 表格,一种二维表结构,一条数据由多个字段组成,每条数据都包含固定的字段,可以内容为空
id name age 1 lisi 18 表与表之间可以进行关联
像MySQL、PostgreSQL、Oracle、SQLServer这样的数据库就是关系型数据库
非关系型数据库
像JSON文件或者字典,每条数据可以有不同的字段,不固定,可以进行嵌套,形成复杂的结构
比如 { "user": { "name": "Alice", "age": 30, "hobbies": ["reading", "coding"] } } 或者
{ "user_123": { "name": "张三", "age": 28, "hobbies": ["读书", "跑步"], "address": { "city": "北京", } } }像Redis、MongoDB、HBase都是非关系型数据库
关系型数据库和非关系型数据库的主要区别就是数据的存储方式和对事务的支持
通过上面的简单了解,你就能区分出SQL和NoSQL的的区别以及大致的特征,所以Redis和MySQL的区别很大,这也就说明这两种数据库的使用场景也有很大区别,我们下面来揭开Redis的神秘面纱。
二、Redis的特性
1. 速度快
Redis把数据存储到内存中,操作内存比操作硬盘更快
Redis是C语言实现的,一般来说C语言实现的程序距离操作系统更近,执行速度更快
Redis使用了单线程,预防了多线程的竞争问题
注意:Redis 在 6.0 版本引入了多线程机制,但主要也是在处理网络和 IO,不涉及到数据命令,即命令的执行仍然采用了单线程模式,同时这个单线程不是说整个Redis就只有一个线程,而是处理指令的就这么一个线程
Redis的操作指令比较简单
2. 基于键值对的数据结构
几乎所有编程语言都提供了类似字典的数据结构,例如C++的map,Java的map,Python的dict等
Redis的键值对中的值不仅可以是字符串,还可以是具体的数据结构,支持更多的开发场景
5种经常使用的数据结构:string, list, hash, set, zset (指令和底层后续讲解)
3. 丰富的功能
键过期机制,可以实现缓存
发布订阅功能,可以实现消息队列 ----- 你可能会吃惊,Redis开发的目的是用作消息队列的
支持Lua脚本,可以使用Lua创造新的Redis指令
简单的事务功能,在一定程度上保证事务的特性,和 MySQL相比差远了
流水线功能,客户端可以将一批指令一次性传到Redis,减少网络开销(指令中可以提现)
4. 简单稳定
Redis的源码很少,相较于其他NoSQL易于了解它
单线程模型
不需要依赖操作系统中的类库
5. 客户端语言多
Redis 提供了简单的 TCP 通信协议,很多编程语言可以很方便地接入到 Redis
Redis 受到社区和各大公司的广泛认可,支持Redis的客户端也就非常多
6. 持久化
RDB:定期生成内存快照,适合备份
AOF:记录每条写命令,重启时重放,数据更完整
7. 主从复制
8. 高可用和分布式
哨兵:监控主节点故障并自动切换
集群:将数据分片到多个节点,突破单机容量
三、Redis的适用场景
1. 缓存
缓存机制几乎在所有大型网站都有使用,合理的使用缓存不仅可以加速访问速度,而且能够有效的降低后端数据源的压力。
2. 排行榜
排行榜系统几乎存在于所有的网站,例如按照热度排名的排行榜,按照发布时间的排行榜,按照各种复杂维度计算出的排行榜,Redis提供了列表和有序集合的结构,合理地使用这些数据结构可以很方便地构建各种排行榜系统。
3. 计数器
计数器在网站中的作用至关重要,例如视频网站有播放数、电商网站有浏览数,为了保证数据的实时性,每一次播放和浏览都要做加1的操作,如果并发量很大对于传统关系型数据的性能是一种挑战。Redis天然支持计数功能而且计数的性能也非常好,可以说是计数器系统的重要选择。
4. 社交网络
赞/踩、粉丝、共同好友/喜好、推送、下拉刷新等是社交网站的必备功能,由于社交网站访问量通常比较大,而且传统的关系型数据不太合适保存这种类型的数据,Redis提供的数据结构可以相对比较容易地实现这些功能。
5. 消息队列
消息队列系统可以说是一个大型网站的必备基础组件,因为其具有业务解耦、非实时业务削峰等 特性。Redis 提供了发布订阅功能和阻塞队列的功能,虽然和专业的消息队列比还不够足够强大,但是 对于一般的消息队列功能基本可以满足。
四、Redis 和 MySQL 的主要区别
| 对比 | Redis | MySQL |
|---|---|---|
| 数据存储位置 | 内存 | 硬盘 |
| 存储结构 | 键值对 | 二维表 |
| 事务支持 | 支持简单的事务,不支持回滚 | 完整的ACID事务,支持回滚,隔离级别 |
| 持久化 | 可选(RDB 快照 / AOF 日志),主要用于重启恢复,不保证强持久 | 强制持久化,数据写入磁盘,安全性高 |
| 扩展方式 | 主要是水平分片,主从复制用于读写分离和高可用 | 支持垂直扩展(更强的主机)和水平扩展(分库分表、中间件) |
| 典型使用场景 | 缓存、计数器、排行榜、会话存储、消息队列(高速读写,对持久性要求不高) | 核心业务数据存储、复杂查询、报表、交易系统(需要数据一致性和持久性) |
