Redis 从入门到精通:初识 Redis

IT策士 10余年一线大厂经验,专注 IT 思维、架构、职场进阶。我会在各个平台持续发布最新文章,助你少走弯路。

很多开发者第一次听说 Redis,都是在"缓存"这个词的旁边。的确,作为内存数据库,Redis 的缓存能力极其出色,但你如果认为它只是一个"跑得很快的 key-value 存储",那就太小看它了。今天这篇文章,我们从头认识一下 Redis------这个在分布式系统中几乎无处不在的"瑞士军刀"。

读完你会清楚地知道:Redis 是什么、它能干什么、怎么装、怎么连、有哪些基础命令,还会亲手用 Python 跟它打个招呼。

1. Redis 是什么?

Redis(Remote Dictionary Server)是一个开源的、基于内存的、支持多种数据结构的键值存储系统。它使用 C 语言编写,所有数据都在内存中操作,因此读写速度极快(单机 QPS 轻松达到 10 万级别)。同时,它支持将数据持久化到磁盘,保证重启后数据不丢失。

最重要的是:Redis 的"值"不仅仅可以是字符串,还可以是列表(List)、哈希(Hash)、集合(Set)、有序集合(Sorted Set)、位图(Bitmap)、HyperLogLog、地理坐标(GEO)等丰富的数据结构,并且每种数据结构都附带了强大的原子操作命令。

官方定义非常直白:Redis 是一个数据结构服务器。它把底层复杂的数据结构实现全部封装好,让使用者像操作本地集合类一样操作远程数据。

2. 核心特性一览

  • 内存存储,极致性能:读写操作都在内存完成,官方 benchmark 显示单实例可达到 10万+ 的 SET/GET 操作。

  • 丰富的数据结构:String、List、Hash、Set、Sorted Set,以及 Bitmap、HyperLogLog、GEO 等高级结构,远非普通 key-value 缓存可比。

  • 持久化:支持 RDB 快照和 AOF 日志,可以按需组合,实现数据安全存储。

  • 高可用与分布式:原生支持主从复制(Replication)、哨兵(Sentinel)和集群(Cluster),轻松构建高可用、可扩展的架构。

  • 单线程模型:Redis 使用单线程事件循环处理命令,不用考虑锁竞争,操作天然原子性,编码简单,却仍能通过 I/O 多路复用支撑超高并发。

  • Lua 脚本与事务:支持 Lua 脚本,可将多个命令打包成原子操作;同时提供基础的事务能力(MULTI/EXEC)。

💡 从 Redis 6.0 开始,I/O 线程被引入,但只是用于网络读写,命令执行仍然是单线程,这既保留了原子性,又提升了网络吞吐。

3. Redis 不只是缓存------适用场景

说"不只是缓存",是因为它可以胜任的角色远比缓存多:

可以看到,Redis 早已从单纯的缓存层延伸为高性能数据中间件,很多中型系统甚至只用 Redis 就能承担绝大部分读写流量,后端 MySQL 仅作为最终数据落地的"安全垫"。

4. 与其他数据库对比

为了帮你建立坐标系,这里简单对比一下 Redis 和常见的存储系统:

Memcached 比,Redis 支持的数据结构、持久化和高可用方案是碾压级的;与关系型数据库比,Redis 牺牲了复杂查询能力,换来了极致的读写性能。因此,常见的架构是:Redis 前置挡流量,MySQL 兜底保一致

5. 安装启动与 redis-cli 初体验

我们选择最通用的方式------Docker 来启动 Redis,保证 macOS、Windows、Linux 都能一致运行。

5.1 使用 Docker 启动 Redis

确保你已安装 Docker,然后执行:

bash 复制代码
docker run -d --name redis-lab -p 6379:6379 redis:7.2

预期输出:

bash 复制代码
Unable to find image 'redis:7.2' locally
7.2: Pulling from library/redis
... (下载层) ...
Status: Downloaded newer image for redis:7.2
213a4f5... (容器 ID)

启动后,一个 Redis 7.2 实例已经在本机 6379 端口运行,密码默认为空。

非 Docker 用户:macOS 可 brew install redis && brew services start redis;Ubuntu 可 sudo apt install redis-server,然后 sudo systemctl start redis

5.2 进入 redis-cli 交互式命令行

bash 复制代码
docker exec -it redis-lab redis-cli

看到提示符 127.0.0.1:6379> 就表示进入成功了。

5.3 基础命令热身

我们先做几次"心跳检测"和基本操作:

bash 复制代码
127.0.0.1:6379> PING
PONG
127.0.0.1:6379> SET name "IT策士"
OK
127.0.0.1:6379> GET name
"IT策士"
127.0.0.1:6379> EXISTS name
(integer) 1
127.0.0.1:6379> DEL name
(integer) 1
127.0.0.1:6379> EXISTS name
(integer) 0

解释:

  • PING:测试连接,返回 PONG 表示正常。

  • SET key value:设置键值对。

  • GET key:获取键的值。

  • EXISTS key:判断键是否存在,返回 1 存在,0 不存在。

  • DEL key:删除键,返回成功删除的键个数。

5.4 键过期操作

bash 复制代码
127.0.0.1:6379> SET token "abc123" EX 10
OK
127.0.0.1:6379> TTL token
(integer) 8
127.0.0.1:6379> GET token
"abc123"
# 等待 10 秒后...
127.0.0.1:6379> GET token
(nil)

SET ... EX 10 设置键 10 秒后自动过期。TTL 查看剩余存活时间(秒),返回 -2 表示已过期不存在。这个机制是缓存和临时锁的基础。

5.5 认识多种数据结构

Redis 的精髓在于其丰富的数据类型,我们快速预览几个:

Hash(哈希)

bash 复制代码
127.0.0.1:6379> HSET user:1001 name "Alice" age 30
(integer) 2
127.0.0.1:6379> HGET user:1001 name
"Alice"
127.0.0.1:6379> HGETALL user:1001
1) "name"
2) "Alice"
3) "age"
4) "30"

一个键下可以存储多个字段,非常适合存储对象。

List(列表)

bash 复制代码
127.0.0.1:6379> LPUSH tasks "send_email" "generate_report"
(integer) 2
127.0.0.1:6379> RPOP tasks
"send_email"

LPUSH 左侧插入,RPOP 右侧弹出,可作为栈或队列使用。

Set(集合)

bash 复制代码
127.0.0.1:6379> SADD tags:post1 "python" "redis" "tutorial"
(integer) 3
127.0.0.1:6379> SMEMBERS tags:post1
1) "python"
2) "redis"
3) "tutorial"

无序不重复集合,支持交集、并集等运算。

Sorted Set(有序集合)

bash 复制代码
127.0.0.1:6379> ZADD leaderboard 100 "Alice" 85 "Bob"
(integer) 2
127.0.0.1:6379> ZRANGE leaderboard 0 -1 WITHSCORES
1) "Bob"
2) "85"
3) "Alice"
4) "100"

每个成员关联一个 score,按 score 自动排序,天然适合排行榜。

🧪 动手试试

现在你可以尝试用 ZADD 插入自己的分数,再用 ZREVRANGE 取 Top 3,看看输出是否符合预期。

预期效果:ZREVRANGE leaderboard 0 2 WITHSCORES 返回分数由高到低的前三名。

6. Python 快速连接:跟 Redis 打个招呼

既然本系列面向 Python 开发者,我们打破常规,在第一篇就用 Python 写几行代码,感受一下未来开发中使用 Redis 的体验。

安装 Python 客户端:

编写并运行 hello_redis.py

bash 复制代码
import redis

# 创建连接(默认本地 6379,无密码)
r = redis.Redis(host='localhost', port=6379, decode_responses=True)

# 类似 redis-cli 的 PING
print(r.ping())  # 输出: True

# 设置与获取
r.set('greet', 'Hello, Redis!')
print(r.get('greet'))  # 输出: Hello, Redis!

# 整数递增
r.set('counter', 0)
r.incr('counter')
r.incr('counter', 2)
print(r.get('counter'))  # 输出: 3

# 操作列表
r.lpush('books', 'Python入门', 'Redis深度历险')
print(r.lrange('books', 0, -1))  # 输出: ['Redis深度历险', 'Python入门']

输出结果:

bash 复制代码
True
Hello, Redis!
3
['Redis深度历险', 'Python入门']

decode_responses=True 让返回的数据自动解码为字符串,避免手动处理字节。这只是轻轻一瞥,后续章节我们会全面铺开 Python 操作 Redis 的各种高级技巧(连接池、Pipeline、Lua 等)。

7. 总结

本文从"Redis 不只是缓存"出发,与你一起:

  • 理解了 Redis 是什么、为什么快、能做什么;

  • 与其他存储系统横向对比,找到它的定位;

  • 通过 Docker 快速搭建了 Redis 环境;

  • 实操 redis-cli 基础命令,体验了五大核心数据类型;

  • 用 Python 程序连接并操作 Redis,为后续学习埋下伏笔。

现在,你应该已经明白:Redis 是一把能够撬动缓存、计数、锁、队列、排行榜等多种场景的"高性能瑞士军刀"。在接下来的系列文章中,我们会逐个拆解它的十八般武艺,并用大量的 Python 代码带你从入门到实战巅峰。

下一篇我们会深入 Redis 最基础也是最强大的数据结构------String,并教你用 Python 实现缓存、计数器和分布式锁初级版本。

想了解更多还可以去各个平台搜索「IT策士」,一起升级 IT 思维 !

相关推荐
uhakadotcom2 小时前
在 Python 开发中 transitions 的使用
后端·面试·github
Rust研习社2 小时前
通过手写一个迷你 grep 来学习 Rust 的所有权与借用
后端
用户531397318172 小时前
「踩坑实录」原来的SQL索引自动优化失败了,线上数据库差点被打挂
java·后端
go不是csgo2 小时前
从0到1理解Go熔断器:sony/gobreaker 源码剖析 + 仿TikTok Feed 项目实战
开发语言·后端·golang
SimonKing2 小时前
线程池面试被问到怕?看完这篇让他当场沉默
java·后端·程序员
大刚测试开发实战2 小时前
TestHub重磅更新!AI用例生成增加流式输出、Markdown文档上传、模型配置检测、AI评审开关控制...
vue.js·后端·github
程序员阿卢2 小时前
01-基于springboot框架调用ollama下的模型完成基本功能
spring boot·后端·ollama·通义千问模型qwen
IT_陈寒2 小时前
Python列表的+=操作符坑了我一整天
前端·人工智能·后端
右耳朵猫AI2 小时前
Go周刊2026W22 | GoReleaser 2.16、chi 5.3、tldx 1.4、wazero 1.12、Buf 1.70
开发语言·后端·golang