你有没有遇到过网站加载慢的情况?
点一个按钮,等了三四秒才出结果。刷新一下又很快。
这种"时有时无"的慢,背后往往有一个共同原因:数据访问太频繁,数据库扛不住了。
这时候,Redis 就派上用场了。
什么是 Redis?
Redis 全名是 Remote Dictionary Server,但它本质上就是一个存在内存里的字典。
你可以把它想象成一个超快的货架。普通数据库(比如 MySQL)像仓库,东西都在架子上,找起来要翻找。Redis 就像收银台旁边的快捷取物区——随手一拿,立即可用。
核心特点:
- 基于内存:数据存在 RAM 里,读写速度比磁盘快 1000 倍以上
- 键值存储:用一个 key 找到对应的 value,就像查字典
- 支持多种数据类型:字符串、列表、集合、哈希表、有序集合
- 可选持久化:虽然存内存,但可以定期把数据写到硬盘,防止丢失
- 单线程模型:没有多线程竞争,操作原子性有保障
Redis 有什么用?
1. 缓存——最经典用法
你的网站有 100 万人访问,但只有 1 万个热门商品。如果每次都去 MySQL 查数据库,数据库早晚累垮。
把热门商品缓存到 Redis 里,99% 的请求直接在内存里命中,数据库压力骤降。
类比:你去图书馆借书。热门书放在借阅台旁边(Redis),冷门书在书架深处(MySQL)。热门书伸手就拿到,冷门书得走过去翻。
2. 会话存储
用户登录后,服务器需要记住"这个人是张三,他已经登录了"。把登录状态存在 Redis 里,比存在数据库里快得多。
3. 排行榜
很多游戏、社交平台都有排行榜。Redis 的有序集合(Sorted Set)天然适合做这个——按分数排序,取前 N 名,毫秒级完成。
4. 消息队列
Redis 的列表(List)可以当成简单的消息队列用。生产者往列表头推消息,消费者从列表尾取消息。
5. 分布式锁
多个服务器同时操作同一个资源,怎么保证不乱?Redis 提供了一个 SET key value NX 命令,可以设置"只有 key 不存在时才写入",这就是一种轻量级的分布式锁。
Redis 的核心数据类型
Redis 不只是"存字符串"那么简单,它有五种核心数据类型:
String(字符串) 最基本的类型。存用户信息、计数器、缓存数据都行。
SET user:1001 name "张三"
GET user:1001
# 返回 "张三"
Hash(哈希) 存对象。比如一个用户有多个属性(姓名、年龄、邮箱),用 Hash 比用多个 String 更省内存。
HSET user:1001 name "张三" age 28 email "zhangsan@example.com"
HGET user:1001 name
# 返回 "张三"
List(列表) 有序的字符串列表,支持从两端插入和弹出。消息队列、任务队列都用它。
RPUSH tasks "发邮件" "发通知" "生成报表"
LPUSH tasks "紧急任务"
LRANGE tasks 0 -1
# 返回 ["紧急任务", "发邮件", "发通知", "生成报表"]
Set(集合) 无序且不重复的字符串集合。用来做去重、求交集并集。
SADD tags "技术" "编程" "Redis"
SADD tags "编程" "AI"
SMEMBERS tags
# 返回 ["技术", "编程", "Redis", "AI"]
ZSet(有序集合) 每个元素带一个分数(score),按分数排序。排行榜的核心数据结构。
ZADD leaderboard 100 "Alice" 95 "Bob" 110 "Charlie"
ZRANGE leaderboard 0 -1 WITHSCORES
# 返回 ["Bob", "95", "Alice", "100", "Charlie", "110"]
快速上手 Redis
安装
macOS:
brew install redis
redis-server
Ubuntu:
sudo apt install redis-server
sudo systemctl start redis
Windows: 官方不提供原生版,可以用 WSL 或 Docker:
docker run -d -p 6379:6379 redis
连接和使用
安装完成后,用 redis-cli 进入交互界面:
redis-cli
127.0.0.1:6379> SET mykey "hello"
OK
127.0.0.1:6379> GET mykey
"hello"
127.0.0.1:6379> INCR visits
(integer) 1
127.0.0.1:6379> INCR visits
(integer) 2
常用命令速查
| 命令 | 作用 |
|---|---|
SET key value | 设置键值 |
GET key | 获取值 |
DEL key | 删除键 |
EXPIRE key seconds | 设置过期时间 |
TTL key | 查看剩余存活时间 |
INCR key | 数值自增1 |
DECR key | 数值自减1 |
HSET key field value | 设置哈希字段 |
HGET key field | 获取哈希字段 |
LPUSH key value | 从左侧插入列表 |
RPUSH key value | 从右侧插入列表 |
LRANGE key start stop | 获取列表片段 |
SADD key member | 添加集合成员 |
ZADD key score member | 添加有序集合成员 |
Redis 的局限性
Redis 很快,但它不是万能的。了解它的短板,才能用对地方。
内存有限:所有数据都在内存里,存不了太多。超过内存容量就需要淘汰策略(LRU、LFU 等)或拆分到多个实例。
不是关系型数据库:Redis 没有 SQL,没有表,没有复杂 JOIN。如果你需要复杂查询和事务,还是得用 MySQL 或 PostgreSQL。
数据持久化有代价:虽然支持 AOF 和 RDB 两种持久化方式,但写磁盘会拖慢速度。高并发场景下,Redis 主要做缓存,数据最终还是要落库的。
总结
Redis 就是一个存在内存里的超级快字典。它解决的核心问题是:当数据库扛不住高并发读取时,用内存缓存来分担压力。
五种数据类型(String、Hash、List、Set、ZSet)覆盖了大多数应用场景:缓存、排行榜、消息队列、分布式锁。
安装一条命令,上手十分钟。记住 SET / GET / EXPIRE 三个基础命令,你就已经会用 80% 的场景了。
要不要在你的项目里加一个 Redis 试试?从缓存查询结果开始,效果立竿见影。