认识Redis

一、前言:为什么 Redis 无处不在?

打开任何一个高并发系统的架构图,你几乎都能看到 Redis 的身影:

  • 淘宝双11用它扛住每秒百万级请求
  • 微信用它存储用户会话和朋友圈点赞数
  • 抖音用它实现实时排行榜和限流控制

但 Redis 到底是什么?它为何能成为现代应用的"性能加速器"?

本文将带你:

✅ 从零认识 Redis 是什么、能做什么

✅ 理解其高性能背后的秘密

✅ 掌握核心数据结构与典型使用场景

✅ 明确它与传统数据库的区别


二、Redis 是什么?

Redis(Remote Dictionary Server) 是一个开源的、基于内存的 键值对(Key-Value)数据结构存储系统

它既可以作为数据库 ,也可以作为缓存消息中间件使用。

📌 官方定义:
"Redis is an open source, in-memory data structure store."

核心定位:

  • 不是简单的缓存工具 ,而是一个功能丰富的数据结构服务器
  • 所有操作在内存中完成,读写速度极快(微秒级)
  • 支持持久化,断电不丢全部数据
  • 提供主从复制、哨兵、集群等高可用方案

三、Redis 为什么这么快?

很多人说"因为 Redis 用内存",但这只是表象。真正让它快的原因有四点:

1. 纯内存操作

  • 数据存储在 RAM 中,避免磁盘 I/O 延迟
  • 读写速度可达 10万~100万 QPS

2. 单线程 + I/O 多路复用

  • Redis 6.0 之前采用单线程模型处理命令
  • 使用 epoll(Linux)/kqueue(macOS) 实现高并发网络 I/O
  • 避免多线程上下文切换和锁竞争,CPU 利用率极高

💡 注意:Redis 6.0+ 引入多线程 I/O,但命令执行仍是单线程,保证原子性。

3. 高效的数据结构

  • 底层针对不同类型优化:
    • String → 动态字符串(SDS)
    • List → 快速列表(quicklist)
    • Set → 整数集合(intset)或哈希表
    • ZSet → 跳表(skiplist)+ 哈希表

4. 非阻塞网络模型

  • 客户端连接由事件驱动处理,响应延迟低

四、Redis 支持哪些数据结构?

Redis 不仅支持字符串,还提供五种核心数据类型,每种都有独特用途:

类型 结构 典型命令 应用场景
String 字符串 SET, GET, INCR 缓存、计数器、分布式锁
Hash 哈希表 HSET, HGET, HGETALL 存储对象(如用户资料)
List 双向链表 LPUSH, RPOP, LRANGE 消息队列、最新动态列表
Set 无序集合(自动去重) SADD, SMEMBERS, SINTER 标签系统、共同好友
Sorted Set (ZSet) 有序集合(带分数) ZADD, ZRANGE, ZSCORE 排行榜、延迟任务、带权队列

示例:用 ZSet 实现游戏积分榜

bash 复制代码
> ZADD game:rank 95 "玩家A"
> ZADD game:rank 98 "玩家B"
> ZADD game:rank 92 "玩家C"
> ZREVRANGE game:rank 0 2 WITHSCORES
1) "玩家B"
2) "98"
3) "玩家A"
4) "95"
5) "玩家C"
6) "92"

五、Redis 能做什么?六大典型场景

1. 缓存(最常见)

  • 缓存数据库查询结果,减轻 DB 压力
  • 设置过期时间(TTL),自动失效

2. 分布式锁

  • 利用 SET key value NX EX 实现原子加锁
  • 避免多服务实例同时操作共享资源

3. 计数器 & 限流

  • INCR 实现接口调用次数统计
  • 结合 EXPIRE 实现滑动窗口限流(如 1 秒最多 100 次)

4. 排行榜 / Top N

  • ZSet 天然支持按分数排序
  • 实时更新,毫秒级响应

5. 会话(Session)共享

  • Web 集群中,将用户登录态存入 Redis
  • 所有节点可共享会话信息

6. 轻量级消息队列

  • List 的 LPUSH + BRPOP 实现生产消费
  • (注:高可靠场景建议用 Kafka/RabbitMQ)

六、Redis 会丢数据吗?持久化机制

虽然 Redis 是内存数据库,但它提供两种持久化方式,防止重启后数据全丢:

✅ RDB(快照)

  • 定时将内存数据全量保存为二进制文件(dump.rdb
  • 优点:文件小、恢复快
  • 缺点:可能丢失最后一次快照后的数据

✅ AOF(Append Only File)

  • 记录每个写操作命令,重启时重放
  • 可配置同步策略:always / everysec / no
  • 优点:数据更安全
  • 缺点:文件大,恢复慢

🔧 生产建议 :开启 RDB + AOF 混合持久化(Redis 4.0+ 支持),兼顾速度与安全。


七、Redis vs 传统数据库(如 MySQL)

维度 Redis MySQL
存储介质 内存(可持久化到磁盘) 磁盘为主
数据模型 Key-Value + 多种数据结构 表结构(行/列)
事务 支持简单事务(MULTI/EXEC),不支持回滚 完整 ACID
扩展性 天然支持集群(Redis Cluster) 分库分表复杂
适用场景 高并发读写、临时数据、实时计算 强一致性、复杂查询、持久化核心数据

最佳实践Redis + MySQL 混合架构

  • MySQL 存原始数据
  • Redis 缓存热点数据
  • 写操作先更新 DB,再删除缓存(Cache-Aside 模式)

八、如何开始使用 Redis?

  1. 安装(Ubuntu)

    bash 复制代码
    sudo apt install redis-server
    redis-cli ping  # 返回 PONG 表示成功
  2. 基本操作

    bash 复制代码
    $ redis-cli
    127.0.0.1:6379> SET name "Redis"
    OK
    127.0.0.1:6379> GET name
    "Redis"
    127.0.0.1:6379> TTL name    # 查看过期时间
    -1  # -1 表示永不过期
  3. 客户端库

    • Java:Lettuce(推荐)、Jedis
    • Python:redis-py
    • Node.js:ioredis

九、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

相关推荐
银发控、3 小时前
MySQL联合索引
数据库·mysql
予枫的编程笔记3 小时前
【MySQL修炼篇】从踩坑到精通:事务隔离级别的3大异常(脏读/幻读/不可重复读)解决方案
数据库·mysql·后端开发·数据库事务·事务隔离级别·rr级别·脏读幻读不可重复读
睡美人的小仙女1273 小时前
Threejs加载环境贴图报错Bad File Format: bad initial token
开发语言·javascript·redis
徐同保4 小时前
解决 Vue 3 项目 TypeScript 编译错误:@types/lodash 类型定义不兼容
redis·网络协议·https
一起养小猫5 小时前
Flutter for OpenHarmony 实战:记账应用数据统计与可视化
开发语言·jvm·数据库·flutter·信息可视化·harmonyos
世界尽头与你5 小时前
(修复方案)CVE-2023-22047: Oracle PeopleSoft Enterprise PeopleTools 未授权访问漏洞
数据库·安全·oracle·渗透测试
韩立学长5 小时前
【开题答辩实录分享】以《智能大学宿舍管理系统的设计与实现》为例进行选题答辩实录分享
数据库·spring boot·后端
Henry Zhu1235 小时前
数据库(五):反规范化
数据库
Mr_Xuhhh5 小时前
MySQL函数详解:日期、字符串、数学及其他常用函数
java·数据库·sql
he___H6 小时前
Redis高级数据类型
数据库·redis·缓存