零基础入门 Redis:从“缓存是什么”到自己动手写一个高并发计数器

零基础入门 Redis:从"缓存是什么"到自己动手写一个高并发计数器

🌟 适合从未接触过 Redis 的编程新手|无需 Java/后端基础|所有命令和代码均可直接复制运行


① 技术栈用途介绍:Redis 到底是干什么的?

想象你开了一家奶茶店(业务系统),每天高峰时段顾客排队点单------收银员(数据库)要反复查库存、算价格、记订单,忙得不可开交,响应越来越慢。

Redis 就像一位"超级记忆小助手",站在收银台旁边:

  • 它不负责做奶茶(不处理业务逻辑),但秒记热门商品销量、用户登录状态、页面访问次数;
  • 它把最常查的数据(比如「今日爆款:杨枝甘露」的库存)提前抄在便签本上(内存中),收银员一问就答,不用翻厚重账本(查磁盘数据库);
  • 它还能自动给便签加"保质期"(过期时间),过期就扔,绝不误事。

典型场景

  • 网站首页访问量实时统计(避免每刷一次就写数据库)
  • 用户登录后的 Token 缓存(免密快速验证身份)
  • 秒杀活动的库存扣减(靠原子操作防超卖)
  • 接口限流(如"1 分钟最多调用 100 次")

② 环境准备与安装配置:3 分钟搞定本地 Redis

✅ 推荐方式:Docker(最干净、无依赖冲突)

bash 复制代码
# 1. 拉取官方镜像(首次需联网下载,约 100MB)
docker pull redis:7-alpine

# 2. 启动一个带密码、开放端口的 Redis 实例
# (密码设为 'csdn123',端口映射到本机 6379)
docker run -d --name myredis -p 6379:6379 \
  -e REDIS_PASSWORD=csdn123 \
  -v $(pwd)/redis.conf:/usr/local/etc/redis/redis.conf \
  redis:7-alpine redis-server /usr/local/etc/redis/redis.conf

⚠️ 新手常见坑 & 排查

  • Connection refused?→ 检查 Docker 是否运行:docker psmyredis 是否 Up
  • ❌ 密码错误?→ 连接时必须加 -a csdn123,例如:redis-cli -h 127.0.0.1 -p 6379 -a csdn123
  • ❌ 没装 Docker?→ 去 https://www.docker.com/products/docker-desktop 下载安装(Windows/macOS 一键图形化安装)。

💡 小知识:Redis 默认只用内存,所以快!但它也支持 RDB(定时快照)和 AOF(操作日志)两种持久化方式,保证断电不丢关键数据。


③ 入门实践:5 分钟写出一个「实时点赞计数器」

我们来做一个极简但真实的 Demo:用户点击「👍」,点赞数+1,并实时显示最新值。

步骤 1:用 redis-cli 手动试试(理解核心命令)

bash 复制代码
# 连接 Redis
redis-cli -h 127.0.0.1 -p 6379 -a csdn123

# 初始化文章 ID=1001 的点赞数为 0
> SET article:1001:likes 0
OK

# 每次点赞:原子性 +1(不会因并发导致漏加!)
> INCR article:1001:likes
(integer) 1
> INCR article:1001:likes
(integer) 2

# 查看当前值
> GET article:1001:likes
"2"

INCR 是 Redis 最神奇的命令之一:它天然线程安全,1000 人同时点,结果一定是 1000 ------ 不用加锁、不写 SQL、不操心事务!

步骤 2:Java 版(用 Spring Boot 快速集成)

新建 Spring Boot 项目(start.spring.io),勾选:

  • Spring Web(提供 HTTP 接口)
  • Spring Data Redis(官方 Redis 客户端)
  • Lombok(简化代码)

配置 application.yml

yaml 复制代码
spring:
  redis:
    host: 127.0.0.1
    port: 6379
    password: csdn123
    lettuce:
      pool:
        max-active: 8

写一个控制器(Controller):

java 复制代码
@RestController
@RequestMapping("/api")
public class LikeController {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    // 点赞接口
    @PostMapping("/like/{articleId}")
    public ResponseEntity<Integer> like(@PathVariable String articleId) {
        String key = "article:" + articleId + ":likes";
        Long count = redisTemplate.opsForValue().increment(key, 1);
        return ResponseEntity.ok(count.intValue());
    }

    // 查看点赞数
    @GetMapping("/like/{articleId}")
    public ResponseEntity<Integer> getLikes(@PathVariable String articleId) {
        String key = "article:" + articleId + ":likes";
        Object value = redisTemplate.opsForValue().get(key);
        return ResponseEntity.ok(value == null ? 0 : Integer.parseInt(value.toString()));
    }
}

✅ 启动项目 → 访问 http://localhost:8080/api/like/1001 → 点两次 POST → 再 GET,你会看到 12


④ 进阶与原理:为什么 Redis 能扛住百万 QPS?

🔑 核心机制三句话讲透:

  1. 单线程 + IO 多路复用(epoll/kqueue)

    就像一个前台接待员(单线程),但用"智能叫号屏"(IO 多路复用)同时盯 10 万个窗口------哪个窗口有客人(请求)就服务谁,绝不阻塞。

  2. 所有数据存在内存,但通过 RDB/AOF 持久化

    白天高速运转(内存);晚上打烊前(RDB 定时快照)或每笔业务后(AOF 记日志)备份到账本(磁盘),兼顾速度与安全。

  3. 丰富的数据结构 ≠ 只能存字符串 : | 结构 | 类比 | 用途 | |---|---|---| | String | 便利贴 | 计数、缓存 HTML 片段 | | Hash | 电子表格一行 | 存用户资料 {name:张三, age:25} | | List | 排队队伍 | 消息队列、最新评论列表 | | Set | 签到打卡表(去重) | 共同好友、标签去重 | | Sorted Set | 成绩排行榜 | 按分数排序的 TOP100 |

💡 进阶技巧:用 SETNX(Set if Not eXists)实现分布式锁;用 Pub/Sub 做简易消息广播;用 Redis Streams 替代 Kafka 做轻量级事件总线。


⑤ 总结与评估:Redis 适合我吗?

| 维度 | 说明 | |---|---| | ✅ 最大优点 | 极致性能(10W+ QPS)、数据结构丰富、部署简单、生态成熟(几乎所有语言都有客户端) | | ⚠️ 主要局限 | 内存成本高(不适合存大文件/海量历史日志)、集群模式配置稍复杂、ACID 事务能力弱于 MySQL | | 🎯 最适合谁 | 需要高性能读写、高频访问、临时性/热点数据的场景(Web 缓存、Session 共享、实时排行榜) | | ↔️ vs 其他缓存 | • Ehcache:纯 Java,适合单机,无网络开销;

Caffeine:JVM 进程内缓存,更快但无法共享;

Memcached:仅支持 String,无持久化,更老派。 | | 📚 下一步建议 | ① 动手部署 Redis Cluster(3 主 3 从);② 学习 RedisInsight 可视化工具;③ 阅读《Redis 设计与实现》第二版(原理向);④ 尝试用 Redis 实现「分布式限流器」。 |


💬 最后送你一句心里话: 不必纠结"Redis 和 MySQL 到底谁更重要"。它们不是对手,而是搭档------MySQL 是你的保险柜(存核心资产),Redis 是你的随身钱包(装常用零钱)。学会让它们各司其职,你就已经超越了 80% 的初学者。

📌 附:一键验证环境命令清单

bash 复制代码
# 检查 Redis 是否运行
docker ps | grep myredis

# 进入容器执行命令
docker exec -it myredis redis-cli -a csdn123

# 查看所有键(调试用)
KEYS *

# 删除测试键
DEL article:1001:likes

本文所有代码已在 JDK 17 + Spring Boot 3.2 + Redis 7 下实测通过。欢迎在评论区留言提问,我会亲自回复!

相关推荐
猿小羽2 小时前
[TEST] Spring Boot 快速入门指南 - 1769246843980
java·spring boot·后端
indexsunny2 小时前
互联网大厂Java求职面试实战:Spring Boot、微服务与Redis缓存技术解析
java·spring boot·redis·微服务·面试·电商·技术栈
wWYy.2 小时前
详解redis(13):数据结构GEO
数据库·redis·缓存
迎仔2 小时前
HTTPS 原理与配置参数通俗指南
redis·网络协议·https
Anastasiozzzz2 小时前
常见限流算法--【令牌桶】【漏桶】【固定窗口】【滑动窗口】
java·redis·后端·算法·面试
马尔代夫哈哈哈2 小时前
Spring Mvc(二)
java·spring boot·spring·servlet·java-ee
甘露s3 小时前
Redis 核心:概念理解与五大数据结构
数据结构·数据库·redis
我叫果冻3 小时前
告别 “理论选手”:用 g-note 打通 Java 中高级技术的任督二脉
spring boot·spring cloud
小冷coding3 小时前
缓存与数据库之间数据一致性的解决方案,核心是解决“缓存数据和数据库数据不一致”的问题
数据库·缓存