Redis 入门:3 步把它跑起来,和 MySQL 到底有啥区别?

0 阅读5分钟

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 对上话了!

五、挑战题(答案在仓库,跑起来才知道)

  1. ⭐ 用 SET 存键 hw:name(值是你的英文名),再 GET 出来。
  2. ⭐⭐ 用 EXPIRE 给 hw:name 设 30 秒过期,连续两次 TTL 观察数字变小;等过期后 GET 看返回什么。
  3. ⭐⭐⭐ 思考:为什么 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 五大数据结构:什么场景选哪个,一张表记牢》——每种类型底层结构一句话 + 典型场景 + 选型表。

跑完有任何报错,把终端输出发评论区,一起排查。