🏠 首页 › 攻略 › Redis是什么?内存数据库入门

Redis是什么?内存数据库入门

Redis是一种基于内存的键值数据库,速度快到毫秒级。了解它的核心概念、使用场景和基础命令,快速上手这个开发者必备工具。

你有没有遇到过网站加载慢的情况?

点一个按钮,等了三四秒才出结果。刷新一下又很快。

这种"时有时无"的慢,背后往往有一个共同原因:数据访问太频繁,数据库扛不住了。

这时候,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 试试?从缓存查询结果开始,效果立竿见影。