Redis 全面介绍

Redis 全面介绍 目录Redis 是什么Redis 的特性Redis 的应用场景Redis 的构成Redis 客户端与连接命令如何通过官方文档学习 Redis总结一、Redis 是什么RedisRemote Dictionary Server远程字典服务是一个开源的、基于内存的数据结构存储系统它可以用作数据库、缓存、消息中间件以及流处理引擎等多种角色。1.1 核心定位Redis 的本质是一个键值Key-Value型 NoSQL 数据库但与传统 KV 存储如 Memcached不同Redis 支持多种复杂的数据结构并且将数据主要保存在内存中以实现极高性能同时支持持久化以保证数据安全。1.2 一句话概括Redis 是一个用 C 语言编写的、支持网络通信、基于内存、可持久化、日志型的高性能键值数据库。1.3 官方网站与资源官方主页Redis - Real-time data for agents apps官方文档DocsGitHub 仓库https://github.com/redis/redis在线命令试用https://try.redis.io二、Redis 的特性2.1 性能卓越读写性能极高官方基准测试表明单机 Redis 在普通 X86 机器上可达到10 万 QPS的读性能以及8 万 QPS的写性能。延迟极低典型操作延迟在微秒μs级别通常 1ms。2.2 丰富的数据结构Redis 并非只支持简单的字符串它内置了多种高级数据结构数据结构命令示例典型用途String字符串SET、GET、INCR缓存、计数器、分布式锁Hash哈希HSET、HGET、HGETALL对象存储、用户画像List列表LPUSH、RPUSH、LPOP、RPOP消息队列、最新列表Set集合SADD、SMEMBERS、SINTER标签、共同好友、去重Sorted Set有序集合ZADD、ZRANGE、ZSCORE排行榜、滑动窗口限流Stream流5.0XADD、XREAD、XGROUP消息流、事件溯源Bitmap位图SETBIT、GETBIT、BITCOUNT用户签到、布隆过滤器HyperLogLogPFADD、PFCOUNTUV 统计Geo地理空间GEOADD、GEORADIUS附近的人、地图应用等等2.3 内存存储与持久化内存为主核心数据保存在内存中以保证高速读写。可持久化提供 RDB 快照和 AOF 日志两种机制数据可以从内存落盘到磁盘重启后可恢复。数据可淘汰支持多种内存淘汰策略LRU、LFU、Random、TTL 等。这也是为什么Redis存储一般都是当缓存来存使用也非常常见的重要原因之一毕竟MySQL等大多数据库都是存储在硬盘的我们拉取数据还要从硬盘写到我们的内存由程序读写非常慢。2.4 高可用与分布式主从复制Replication支持一主多从数据可以从主节点实时同步到从节点实现读写分离与数据冗余。哨兵模式Sentinel自动监控主从节点状态实现故障自动转移Failover。Cluster 集群模式Redis Cluster官方提供的分布式方案通过哈希槽Hash Slot将数据分片到多个节点水平扩展能力极强。2.5 功能丰富事务MULTI/EXEC支持简单的事务能力不保证严格的 ACID。发布订阅Pub/Sub内置消息广播能力。Lua 脚本通过 EVAL 执行 Lua 脚本保证命令执行的原子性。模块化Redis Modules从 4.0 起支持动态加载第三方模块如 RedSearch、RedisJSON、RedisGraph、RedisTimeSeries 等。2.6 多语言客户端官方与社区为几乎所有主流编程语言提供了客户端Pythonredis-py、aioredisJavaJedis、Lettuce、RedissonGogo-redis、redigoNode.jsioredis、node-redisC/ChiredisC#/.NETStackExchange.RedisPHPpredis、phpredis2.7 简单稳定源码精简早期版本约 3 万行 C 代码无外部依赖仅依赖 libc。单线程核心命令处理模型6.0 后部分命令多线程 IO避免了复杂的锁竞争。三、Redis 的应用场景3.1 缓存最常用将热点数据缓存在 Redis 中减轻后端数据库如 MySQL的压力。# 设置缓存带过期时间 60 秒 SET user:1001 {id:1001,name:Tom} EX 60 # 读取缓存 GET user:1001典型架构客户端 → Redis缓存层 → MySQL持久层3.2 分布式会话在分布式 Web 应用中使用 Redis 统一存储 Session 信息实现多节点共享。3.3 排行榜 / 计数利用 Sorted Set 实现实时排行榜ZADD game:rank 1500 playerA ZADD game:rank 2300 playerB ZREVRANGE game:rank 0 9 WITHSCORES # 取前 10 名利用 String 的 INCR 实现计数器INCR article:1001:read_count # 文章阅读量 13.4 分布式锁利用 SETNX即 SET key value NX EX seconds实现分布式锁SET lock:order:123 uuid-xxx NX EX 103.5 消息队列轻量级场景使用 List 的 LPUSH BRPOP 实现生产者-消费者模型。高可靠场景使用 Redis 5.0 的 Stream 类型支持消费组Consumer Group、ACK 机制、消息回溯等。XADD mystream * field1 value1 field2 value2 XREAD COUNT 10 BLOCK 0 STREAMS mystream 03.6 限流简单计数器限流INCR EXPIRE滑动窗口限流利用 Sorted Set 存储请求时间戳令牌桶/漏桶通过 Lua 脚本原子实现3.7 社交场景共同好友SINTER关注/粉丝模型Set Sorted Set附近的人Geo3.8 实时分析用户在线状态BitmapUV 统计HyperLogLog实时排行Sorted Set3.9 其他场景AI/大模型向量检索Redis 8.0 引入 Vector Set四、Redis 的构成客户端与服务端Redis 系统从架构上可以分为客户端Client)和服务端Server两大部分二者基于RESPREdis Serialization Protocol协议通过 TCP 通信。┌──────────────┐ RESP 协议TCP ┌──────────────────┐ │ Redis 客户端 │ ───────────────────────────▶ │ Redis 服务端 │ │ SDK/CLI │ ◀─────────────────────────── │ 核心引擎 │ └──────────────┘ └──────────────────┘4.1 客户端Client客户端本质上是遵循 RESP 协议、与 Redis 服务端通信的应用程序或工具。它不存储业务数据主要职责是4.1.1 客户端的核心功能连接管理与服务端建立 TCP 连接、维护连接池。协议封装将用户的操作如 SET key value按 RESP 协议编码后发送给服务端。响应解析将服务端返回的结果按 RESP 协议解析为编程语言的对象。命令拼装与重试为开发者提供高层 API如 set(foo, bar, ex60)。集群路由在 Cluster 模式下计算 key 的哈希槽CRC16将命令路由到正确的节点。故障转移感知通过订阅服务端发布的主从切换事件自动更新路由表。4.1.2 常见 Redis 客户端分类按使用场景可分为三类类别例子说明官方命令行客户端redis-cli随 Redis 服务端一同发布官方基准测试客户端redis-benchmark性能压测工具第三方语言客户端SDKjedis、lettuce、redisson、redis-py、go-redis、ioredis、StackExchange.Redis 等应用代码中调用 RedisRedis 客户端与连接命令4.1.3 进入 Redis 客户端的命令1启动 redis-cli最常用# 连接本机默认端口 6379 redis-cli # 连接远程主机 redis-cli -h 127.0.0.1 -p 6379 (由此可以推测-h选项:host主机的意思-p选项:端口的意思) # 通过密码认证 redis-cli -h 127.0.0.1 -p 6379 -a yourpassword # 通过用户名密码ACL6.0 redis-cli --user default -h 127.0.0.1 -p 6379 -a yourpassword # 使用 TLS 加密 redis-cli -h remote-host -p 6379 --tls # 指定数据库默认 0-15 redis-cli -n 1 # 执行单条命令后退出 redis-cli SET hello world redis-cli GET hello # 以原始格式输出无格式美化 redis-cli --no-raw GET hello # 进入交互模式后常用命令 127.0.0.1:6379 PING # 测试连通性返回 PONG 127.0.0.1:6379 AUTH pwd # 认证 127.0.0.1:6379 SELECT 1 # 切换到 1 号库 127.0.0.1:6379 KEYS * # 查看所有键生产慎用 127.0.0.1:6379 SCAN 0 # 游标迭代键 127.0.0.1:6379 INFO # 查看服务端信息 127.0.0.1:6379 CLIENT LIST # 查看所有客户端连接 127.0.0.1:6379 MONITOR # 实时监控所有命令调试用 127.0.0.1:6379 SHUTDOWN NOSAVE# 关闭服务 127.0.0.1:6379 EXIT # 退出客户端2Docker 方式进入客户端# 在已运行的 redis 容器内打开 cli docker exec -it redis-container redis-cli # 直接用临时容器连接远程 redis docker run -it --rm redis:7.2 redis-cli -h host.docker.internal -p 63793GUI 客户端图形界面工具适合开发与运维可视化RedisInsight官方出品跨平台免费Another Redis Desktop Manager开源跨平台MedismacOS开源Redis Desktop Manager / RESP.app跨平台4.2 服务端Server服务端是 Redis 的核心是一个常驻进程负责接收客户端请求、处理命令、保存数据、进行持久化与高可用相关操作。4.2.1 服务端的核心组件┌─────────────────────────────────────────────────────────────┐ │ Redis Server 进程 │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌─────────────┐ │ │ │ 网络 I/O │→│ 命令解析 │→│ 命令执行 │→│ 结果返回 │ │ │ └──────────┘ └──────────┘ └──────────┘ └─────────────┘ │ │ │ │ │ │ │ │ ▼ ▼ ▼ ▼ │ │ ┌──────────────────────────────────────────────────────┐ │ │ │ 事件驱动模型AE 事件循环 │ │ │ └──────────────────────────────────────────────────────┘ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌──────────────┐ │ │ │ 字典 │ │ 持久化 │ │ 复制 │ │ 集群 / 哨兵 │ │ │ │(内存) │ │RDB/AOF │ │ 主从 │ │ Cluster │ │ │ └─────────┘ └─────────┘ └─────────┘ └──────────────┘ │ └─────────────────────────────────────────────────────────────┘4.2.2 服务端的核心功能网络通信层基于 TCP监听 6379 端口默认。支持 Unix Socket 与 TLS 加密通信。6.0 支持多线程 IO处理网络读写但命令执行仍为单线程。命令处理层解析 RESP 协议报文。在单线程事件循环Event Loop中顺序执行命令。这种设计避免了锁竞争也保证了命令的天然原子性。内存数据管理数据存储在 redisDb 字典结构中。提供多种编码方式embstr、raw、int、ziplist、listpack、skiplist 等以节省内存。内置内存淘汰策略maxmemory-policy。持久化模块RDBRedis Database周期性将内存数据快照保存到 .rdb 文件。AOFAppend Only File每条写命令追加到 .aof 文件支持 everysec、always、no 三种刷盘策略。混合持久化4.0RDB AOF 结合启动快且数据丢失少。主从复制模块通过 PSYNC部分重同步/ SYNC全量重同步实现数据同步。从节点默认只读可线性扩展读能力。集群模块Redis Cluster数据按哈希槽共 16384 个分布。每个节点负责一部分槽位。客户端可通过 -c 选项自动重定向MOVED/ASK 错误。节点间通过 Gossip 协议通信。4.3 Redis 是否可以分布式完全可以而且官方原生支持。Redis 提供两种主流的分布式方案方案一主从 Sentinel读写分离 高可用┌──────────┐ │ Sentinel │ ← 监控 / 自动故障转移 └────┬─────┘ │ ┌────────┴─────────┐ ▼ ▼ ┌────────┐ ┌────────┐ ┌────────┐ │ Master │ ──复制─▶│ Replica│ ◀──复制─│ Replica│ └────────┘ └────────┘ └────────┘适用场景数据量不大 几十 GB但需要高可用与读写分离。优点部署简单、运维成本低。缺点写性能仍受单主限制无法水平扩展写能力。方案二Redis Cluster原生分片集群┌─────────┐ ← 哈希槽 0-5460 → ┌─────────┐ │ Master A│ │ Master B│ ← 哈希槽 5461-10922 └────┬────┘ └────┬────┘ │ │ ▼ ▼ ┌─────────┐ ┌─────────┐ │Replica A│ │Replica B│ └─────────┘ └─────────┘ ┌─────────┐ ← 哈希槽 10923-16383 → ┌─────────┐ │ Master C│ │ Master D│ └────┬────┘ └────────┬────┘ ▼ ▼ ┌─────────┐ ┌─────────┐ │Replica C│ │Replica D│ └─────────┘ └─────────┘适用场景大规模数据百 GB ~ TB 级需要水平扩展。优点去中心化无 Proxy线性扩展读 / 写自动故障转移。缺点仅支持单数据库db 0多 key 事务支持受限需保证在同一个哈希槽使用 hash tag。方案三客户端分片 / Proxy 分片客户端分片如 Codis豌豆荚开源、TwemproxyTwitter 开源等。现在官方 Cluster 已较为成熟新项目建议直接使用 Redis Cluster。五、如何通过官方文档学习 Redis5.1 官方文档地址核心入口类型地址最新文档推荐Docs按版本归档Docs命令参考手册Commands | Docs客户端列表Docs在线试用https://try.redis.io教程Dev Hub | RedisFAQhttps://redis.io/docs/latest/develop/faq/5.2 推荐学习路线第一阶段基础入门了解Redis的用处以及Redis的指令分组比如如下图我们可以看见redis分成了这些命令组我们可以点击commands的这个filter by group看见我个人感觉目前这Redis当前版本的Commands文档写的不是特别好因为这里一列就是一大堆几点几版本引入的特性或者当前版本都有的特性我觉得不如直接分类别然后类别里面再有各种命令然后命令会显示是几点几版本的通用哪些模块的。阅读 Introduction to Redis理解 5 种核心数据类型。跟随 Redis Tutorial 走一遍亲手敲 SET、GET、HSET、LPUSH 等命令。在本地用 Docker 起一个 Redisdocker run -d --name my-redis -p 6379:6379 redis:7.2 docker exec -it my-redis redis-cli第二阶段进阶特性持久化阅读 Persistence 文档理解 RDB 与 AOF 的取舍。复制阅读 Replication动手搭建一主二从。哨兵阅读 Sentinel模拟主节点宕机观察自动故障转移。集群阅读 Redis Cluster用 redis-cli --cluster create 搭建 6 节点集群。事务、Lua、Stream分别阅读对应章节。第三阶段生产实战持续内存管理阅读 Memory optimization 章节。性能调优阅读 Redis Latency、SLOWLOG、INFO 命令文档。安全阅读 Securityhttps://redis.io/docs/latest/operate/oss_and_stack/management/security/密码、ACL、TLS、bind、protected-mode。客户端选型阅读 Clients 章节结合自己语言选择合适的库。5.3 三大文档使用技巧命令参考https://redis.io/commands/是查阅字典每条命令都有**语法、参数、可用版本、复杂度、返回值、示例**遇到任何命令都可以来这里查。How-to / Tutorialhttps://redis.io/learn/是手把手教程通过具体场景如 API 网关缓存、实时排行榜学会组合命令。Operate / Referencehttps://redis.io/docs/latest/operate/是运维手册讲部署、监控、备份、升级、迁移。5.4 必读核心文档清单最少必要知识Data Types 章节5 大数据结构Commands 章节按需查阅Persistence 章节Replication 章节Redis Cluster Tutorial强烈推荐ACL 章节6.0 必看Modules 章节按需扩展5.5 其他优质学习资源Redis UniversityFlockjay 官方免费课程含 RU101、RU102、RU202 等源码阅读https://github.com/redis/redis 建议从 server.c、dict.c、networking.c 入手《Redis 设计与实现》黄健宏著中文经典结合源码讲解内部机制《Redis 实战》Josiah L. Carlson偏应用场景Redis 官方博客Redis Blog - Read about what’s happening at Redis 跟踪新版本特性六、总结维度要点是什么高性能内存 KV 数据库支持丰富数据结构特性快、丰富数据结构、持久化、高可用、分布式、模块化应用缓存、计数器、排行榜、分布式锁、消息队列、限流、社交、实时分析架构C/S 模式基于 RESP 协议通信客户端redis-cli、RedisInsight、各语言 SDK服务端单线程事件循环 多模块持久化、复制、集群、ACL、模块分布式✅ 原生支持Sentinel 高可用 Cluster 分片怎么学官方文档 Redis University 源码 实战Redis 的精髓在于把简单做到极致——单线程命令执行 内存数据结构 RESP 协议 极简且强大。