认识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

九、结语

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

相关推荐
时艰.9 分钟前
Java 并发编程 — 并发容器 + CPU 缓存 + Disruptor
java·开发语言·缓存
Goat恶霸詹姆斯1 小时前
mysql常用语句
数据库·mysql·oracle
大模型玩家七七1 小时前
梯度累积真的省显存吗?它换走的是什么成本
java·javascript·数据库·人工智能·深度学习
曾经的三心草1 小时前
redis-9-哨兵
数据库·redis·bootstrap
明哥说编程1 小时前
Dataverse自定义表查询优化:D365集成大数据量提速实战【索引配置】
数据库·查询优化·dataverse·dataverse自定义表·索引配置·d365集成·大数据量提速
张小凡vip1 小时前
Kubernetes--k8s中部署redis数据库服务
redis·kubernetes
xiaowu0801 小时前
C# 拆解 “显式接口实现 + 子类强类型扩展” 的设计思想
数据库·oracle
讯方洋哥2 小时前
HarmonyOS App开发——关系型数据库应用App开发
数据库·harmonyos
惊讶的猫2 小时前
Redis持久化介绍
数据库·redis·缓存
Apple_羊先森2 小时前
ORACLE数据库巡检SQL脚本--19、磁盘读次数最高的前5条SQL语句
数据库·sql·oracle