Redis 入门:3 步把它跑起来,和 MySQL 到底有啥区别?
作者:鱼宵 | 实战驱动系列 · 第 7 篇
完整课程与可运行源码已开源在 Gitee:gitee.com/j67mk2/redi… (本文对应 lesson-01/)
一、面试第一问:Redis 是什么?
一句话:Redis 是一个放在内存里的 key-value 数据库。
想象公司前台有一排储物柜,每个柜子贴个标签(key),柜子里放东西(value)。Redis 就是这排储物柜,只不过它放在内存里,开门、取东西、关门都是微秒级。
和 MySQL 的区别一句话:MySQL 存硬盘,持久可靠但慢;Redis 存内存,快但主要当"缓存"用。
它还有个外号叫"数据结构服务器"——value 不是一坨死板的字符串,而是分类型的:字符串、哈希、列表、集合、有序集合。这就是面试常说的"五大类型"。
二、为什么快?先记住三个词
面试官爱问"Redis 为什么快",这课先把三个关键词刻进脑子(第 5 篇《为什么快》已展开讲):
| 关键词 | 人话解释 |
|---|---|
| 内存 | 数据全放内存,不碰硬盘,比磁盘快几个数量级 |
| 单线程 | 处理命令的核心只有一个"服务员",不用加锁吵架,反而简单快 |
| IO 多路复用 | 一个服务员同时盯很多窗口(连接),哪个来人了就处理哪个,不傻等 |
三、动手:3 步把 Redis 跑起来
环境:Windows + Docker(已装)。不用装 Redis 本体,Docker 一行搞定,不污染系统。
第 1 步:拉镜像 + 起容器
docker pull redis:7 # 下载 Redis 7 镜像(第一次较慢)
docker run -d --name redis -p 6379:6379 redis:7 # 起容器,本机6379→容器6379
docker ps # 看到 redis 那行 STATUS=Up 就成了
命令逐段拆:-d 后台跑;--name redis 起名字;-p 6379:6379 左边是本机端口、右边是容器端口(访问本机 6379 就等于进了容器);redis:7 用刚才下载的镜像。
第 2 步:redis-cli 连进去玩
docker exec -it redis redis-cli # 进交互模式,提示符变成 127.0.0.1:6379>
docker exec redis redis-cli PING # 或者一条条发,返回 PONG 就是通了
第 3 步:五大类型各来两条命令
String(贴标签的盒子)——缓存、计数器:
SET lesson:str "hello-redis" -> OK
GET lesson:str -> hello-redis
Hash(一格多抽屉)——存对象:
HSET user:1 name "王小明" age 25 city "郑州" -> 3 (写了3个字段)
HGET user:1 name -> 王小明
List(有顺序的队伍)——消息队列、最新列表:
LPUSH list:q "消息一" "消息二" "消息三" -> 3
LRANGE list:q 0 -1 # 注意:LPUSH 从队头塞,顺序是反的
消息三
消息二
消息一
LPOP list:q -> 消息三 (弹出队头)
Set(不会重复的篮子)——去重、共同好友:
SADD set:tags "张三" "李四" "张三" -> 2 (重复的"张三"只算一次)
SMEMBERS set:tags
张三
李四
ZSet(带分数的排行榜)——排行榜:
ZADD zset:rank 95 "语文" 88 "数学" 100 "英语" -> 3
ZRANGE zset:rank 0 -1 WITHSCORES
数学 -> 88
语文 -> 95
英语 -> 100
通用命令顺手记:EXISTS key(在不在)、TYPE key(什么类型)、EXPIRE key 60(设 60 秒过期)、TTL key(还剩几秒,-1 永不过期,-2 已没了)、DEL key。
⚠️
KEYS *本地玩玩可以,生产禁用——全量扫描会卡死 Redis 单线程,线上用SCAN。
四、Java 连上去:Jedis 方法名 ≈ 命令行命令名
最小工程(lesson-01 目录)核心就几行:
// 拿起电话,拨向本机 6379
Jedis jedis = new Jedis("127.0.0.1", 6379);
String pong = jedis.ping(); // PING -> PONG
jedis.set("user:1:name", "王小明"); // 就是 SET
String name = jedis.get("user:1:name"); // 就是 GET
jedis.incr("lesson:counter"); // 就是 INCR
Long ttl = jedis.ttl("user:1:name"); // 就是 TTL
记住这个规律:SET→set、GET→get、INCR→incr、EXPIRE→expire。Jedis 的方法名几乎和 redis-cli 命令一模一样,后面的课全吃这个规律。
实测输出(本机真实运行):
[1] PING -> PONG
[2] SET/GET user:1:name -> 王小明
[3] INCR 两次 -> 第一次=1, 第二次=2
[4] TTL user:1:name -> -1 (-1 表示不过期)
全部跑完,Java 已经成功和 Redis 对上话了!
五、挑战题(答案在仓库,跑起来才知道)
- ⭐ 用
SET存键hw:name(值是你的英文名),再GET出来。 - ⭐⭐ 用
EXPIRE给hw:name设 30 秒过期,连续两次TTL观察数字变小;等过期后GET看返回什么。 - ⭐⭐⭐ 思考:为什么
KEYS *生产环境危险?如果让你设计"安全列出所有用户键"的方案,怎么做?(提示:分层命名user:1、user:2……第 5 篇揭晓)
六、面试回答模板
面试官:Redis 是什么?和 MySQL 有什么区别?
Redis 是基于内存的 key-value 数据库,支持多种数据结构,常作缓存;MySQL 存硬盘持久可靠但慢,Redis 存内存快,两者互补。
追问:为什么快?
三个词:纯内存、单线程避免锁竞争、IO 多路复用(epoll)。
追问:五大类型?
String 缓存/计数器、Hash 存对象、List 队列、Set 去重/交并集、ZSet 排行榜。
关于这个系列
本文是「Java 后端实战精通营」系列第 7 篇,原则:实战驱动、由浅到深、面试向,每篇文章的结论都可以亲手验证。
👉 Redis 实战精通营(10 课):gitee.com/j67mk2/redi…
- 本文对应源码位置:
lesson-01/(最小 Java 工程,Jedis 连 Redis) - 系列已发布:《分布式锁》《缓存一致性》《事务与 Lua》《Redis 高可用》《Redis 为什么快》《企业级场景实战》
下一篇预告:《Redis 五大数据结构:什么场景选哪个,一张表记牢》——每种类型底层结构一句话 + 典型场景 + 选型表。
跑完有任何报错,把终端输出发评论区,一起排查。