零基础入门 Redis:从“缓存是什么”到手写一个简易购物车系统

零基础入门 Redis:从"缓存是什么"到手写一个简易购物车系统

🌟 适合完全没接触过 Redis 的新手|全程中文讲解|每步附代码+图景化类比|学完即可动手开发


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

想象你开了一家奶茶店(业务系统),每天有几百人点单(用户请求)。后厨(数据库)每次都要现查原料库存、算价格、记订单......忙不过来,出单慢,顾客排队发牢骚。

Redis 就像一个超快的「前台小黑板」

  • 店员把热门商品(如「杨枝甘露」)的库存、价格提前抄在小黑板上(内存中高速缓存);
  • 顾客点单时,先看小黑板------秒回结果;
  • 只有小黑板没写(缓存未命中)或信息过期了,才去后厨查(访问数据库)。

它能解决什么问题?

  • 加速读取:避免反复查数据库(10ms → 0.1ms);
  • 扛住流量高峰:双11秒杀时,缓存兜底,数据库不崩;
  • 做简单存储:计数器(点赞数)、会话(登录状态)、消息队列(Pub/Sub)......

📌 典型场景:电商商品详情页、用户登录态管理、实时排行榜、短信验证码临时存储。


② 环境准备与安装配置:3 分钟跑起来!

✅ 步骤 1:下载并启动 Redis(Windows/macOS/Linux 通用)

  • 官网下载:https://redis.io/download → 选「Stable release」→ 下载 .zip.tar.gz
  • 解压后进入目录,双击 redis-server.exe(Windows)或终端运行 ./src/redis-server(macOS/Linux)
  • ✅ 成功标志:看到 Ready to accept connections(已就绪)

⚠️ 新手常踩坑

  • ❌ 报错 command not found?→ 检查是否在 Redis 根目录下执行命令;
  • ❌ 启动后闪退?→ 可能端口被占(默认 6379),改配置:编辑 redis.conf,修改 port 6380,再启动 redis-server redis.conf
  • 💡 验证是否真跑起来了?新开终端,输入 redis-cli ping → 返回 PONG 即成功!

✅ 步骤 2:Java 项目接入(Spring Boot 方式最简单)

pom.xml 中添加:

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

并在 application.yml 配置:

yaml 复制代码
spring:
  redis:
    host: localhost
    port: 6379
    database: 0

③ 入门实践:手写一个「带 Redis 缓存的购物车」

我们做一个极简版购物车:用户添加商品 → 查看购物车(优先从 Redis 读,没命中再查模拟数据库)。

🧩 Step 1:定义商品实体

java 复制代码
public class Product {
    private Long id;
    private String name;
    private BigDecimal price;
    // getter/setter 省略
}

🧩 Step 2:模拟数据库(HashMap)

java 复制代码
@Component
public class ProductDao {
    private final Map<Long, Product> db = new HashMap<>();
    public ProductDao() {
        db.put(1L, new Product(1L, "iPhone 15", new BigDecimal("5999")));
        db.put(2L, new Product(2L, "AirPods", new BigDecimal("1299")));
    }
    public Product findById(Long id) { return db.get(id); }
}

🧩 Step 3:用 RedisTemplate 实现缓存逻辑

java 复制代码
@Service
public class CartService {
    @Autowired private RedisTemplate<String, Object> redisTemplate;
    @Autowired private ProductDao productDao;

    public Product getProduct(Long productId) {
        String key = "product:" + productId;
        // ① 先查 Redis
        Object cached = redisTemplate.opsForValue().get(key);
        if (cached != null) {
            System.out.println("✅ 从 Redis 缓存读取商品");
            return (Product) cached;
        }
        // ② 缓存未命中,查数据库
        Product product = productDao.findById(productId);
        if (product != null) {
            // ③ 写入 Redis,有效期 10 分钟
            redisTemplate.opsForValue().set(key, product, Duration.ofMinutes(10));
            System.out.println("💾 已将商品写入 Redis 缓存");
        }
        return product;
    }
}

🧩 Step 4:测试一下!

java 复制代码
@RestController
public class CartController {
    @Autowired private CartService cartService;

    @GetMapping("/cart/product/{id}")
    public Product viewProduct(@PathVariable Long id) {
        return cartService.getProduct(id);
    }
}

启动项目,浏览器访问 http://localhost:8080/cart/product/1

  • 第一次访问 → 控制台打印 💾 已将商品写入 Redis 缓存
  • 第二次访问 → 打印 ✅ 从 Redis 缓存读取商品

🎉 你已经完成了第一个 Redis 缓存功能!


④ 进阶与原理:不只是「键值对」

Redis 不是"高级 HashMap",它有 5 种核心数据结构,各司其职:

数据类型 类比生活 常见用途
String 小纸条 存商品信息、验证码、计数器(INCR
Hash 一张名片(多字段) 存用户完整资料 {name:张三, age:25, city:北京}
List 排队队伍 消息队列、最新评论列表(LPUSH + LRANGE
Set 签到打卡表(无重复) 用户标签集合、共同好友计算(SINTER
Sorted Set 成绩榜(带分数排序) 实时排行榜(ZADD, ZRANGE

💡 关键机制科普

  • 🔁 持久化 :Redis 默认内存运行,但通过 RDB(定时快照)和 AOF(操作日志)保证断电不丢数据;
  • ⚙️ 淘汰策略 :内存满时,按 LRU(最近最少用)自动删旧缓存;
  • 🌐 集群模式:单机扛不住?用 Redis Cluster 分片存储,水平扩容。

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

维度 说明
优点 极致性能(10W+ QPS)、数据结构丰富、高可用方案成熟(哨兵/集群)、生态完善(Spring Data、RedisInsight 可视化工具)
⚠️ 局限性 内存成本高(不适合存大文件)、复杂事务支持弱(Lua 脚本可弥补)、纯内存设计需重视持久化配置
🆚 vs MySQL MySQL 是「严谨会计」(强一致性、复杂查询),Redis 是「闪电助理」(快、简单、最终一致)------它们是搭档,不是对手!
🚀 何时该用? 读多写少、需要毫秒响应、数据允许短暂不一致(如商品浏览量)、需轻量级共享存储(Session)
📚 下一步学什么? → 深入 Redis 分布式锁(防超卖) → 学 Redisson 客户端封装 → 实践 缓存穿透/雪崩/击穿 三大问题解决方案 → 对接 Spring Cache 注解简化开发(@Cacheable

💬 给小白的真心话 :别怕"内存""持久化"这些词。把它当成你奶茶店的「小黑板」,先写上去、擦掉、再写------用起来,你就懂了。技术没有魔法,只有一次次亲手敲下的 setget

🔧 附:快速验证命令清单

bash 复制代码
redis-cli
> SET name "小明"          # 存字符串
> GET name                 # 取字符串 → "小明"
> HSET user:1 name "小明" age 25   # 存哈希
> HGETALL user:1           # 查全部 → 1) "name" 2) "小明" 3) "age" 4) "25"
> KEYS *                   # 查所有 key(仅开发用,生产禁用)

现在,关掉这篇文章,打开你的电脑,照着步骤敲一遍------你已经是一名 Redis 开发者了。

相关推荐
短剑重铸之日1 小时前
《SpringCloud实用版》完整技术选型地图
java·后端·spring·spring cloud
wWYy.2 小时前
详解redis(7):数据结构List
数据库·redis·缓存
专注于大数据技术栈2 小时前
Redis 中 USED 和 RSS
数据库·redis·缓存
南山乐只2 小时前
Qwen Code + OpenSpec 实战指南:AI 驱动开发的从安装到落地
java·人工智能·后端
有味道的男人2 小时前
如何使用招标网API获取项目详情?
java·服务器·前端
小北方城市网2 小时前
Spring Cloud 服务治理实战:构建高可用微服务体系
spring boot·python·rabbitmq·java-rabbitmq·数据库架构
代码写到35岁2 小时前
【Java 单体架构改造 微服务 网关遇坑之 跨域配置】
java·微服务·架构
qq_12498707532 小时前
基于Java的心理测试系统的设计与实现(源码+论文+部署+安装)
java·开发语言·vue.js·spring boot·计算机毕设·计算机毕业设计
拽着尾巴的鱼儿2 小时前
Spring定时任务 Scheduled使用
java·后端·spring