当前位置: 首页 > news >正文

Redis 详解:从入门到进阶

文章目录

  • 前言
  • 一、什么是 Redis?
  • 二、Redis 使用场景
    • 1. 缓存热点数据
    • 2. 消息队列
    • 3. 分布式锁
    • 4. 限流与防刷
    • 5. 计数器、排行榜
  • 三、缓存三大问题:雪崩 / 穿透 / 击穿
    • 1. ❄️ 缓存雪崩(Cache Avalanche)
    • 2. 🔍 缓存穿透(Cache Penetration)
    • 3. ⚡ 缓存击穿(Cache Breakdown)
  • 四、Redisson 分布式锁实践(必考面试题)
  • 五、Redis 哨兵机制与高可用方案
    • 什么是哨兵机制(Sentinel)?
    • 哨兵功能:
  • 总结


在这里插入图片描述

前言

在现代高并发、高性能的互联网系统中,缓存几乎是标配,而 Redis 无疑是最广泛使用的缓存中间件之一。它不仅性能极高,而且提供了丰富的数据结构与强大的扩展能力,成为微服务架构、消息系统、分布式锁等场景的核心组件。

然而,很多人对 Redis 的认知仍停留在“用来缓存数据”这一层面。实际上,在实际项目中,缓存雪崩、缓存穿透、缓存击穿等问题频频出现,如果没有处理好,不但不能提升性能,反而可能压垮整个系统。

此外,随着分布式系统的普及,分布式锁的引入与实现也成为常见需求。而 Redisson 作为 Redis 官方推荐的 Java 客户端,提供了丰富且易用的分布式工具集,是解决这些问题的优秀选择。
本篇博客将从以下几个方面全面介绍 Redis 的使用与实战问题:

  • Redis 是什么,有哪些核心特性?
  • Redis 常见的使用场景有哪些?
  • 如何理解并解决缓存雪崩、穿透、击穿?
  • 分布式锁如何实现?Redisson 如何优雅地完成?
  • 哨兵机制

无论你是刚接触 Redis 的初学者,还是在项目中踩过坑的老手,相信这篇文章都能帮你更深入地理解 Redis,并在实际工作中少走一些弯路。


一、什么是 Redis?

Redis(Remote Dictionary Server)是一个开源的基于内存的高性能键值对NoSql数据库。相比传统数据库,Redis 的优势在于“快”,在于“结构丰富”,在于“高可用”。
✅ 核心特性:

  • 内存存储,速度极快(100,000+ QPS)
  • 数据结构丰富:支持 String、List、Set、Hash、ZSet、Stream、HyperLogLog 等
  • 持久化:支持 RDB 快照和 AOF 日志
  • 高可用架构支持:主从复制、哨兵、集群
  • 原子操作:天然支持并发安全

二、Redis 使用场景

1. 缓存热点数据

  • 用户信息、商品详情、排行榜、配置中心等
  • 可显著减轻数据库压力

2. 消息队列

  • 使用 List、Stream 实现生产者消费者模型
  • 更轻量级的 MQ 替代方案(如订单异步处理)

3. 分布式锁

  • 控制并发执行、任务幂等等场景
  • 使用 Redisson、SETNX 等方案实现

4. 限流与防刷

  • 基于 INCR、EXPIRE 实现滑动窗口限流
  • 搭配 Lua 脚本实现原子性操作

5. 计数器、排行榜

  • 使用 INCR、ZSet 轻松实现点赞、浏览、Top N 等功能

三、缓存三大问题:雪崩 / 穿透 / 击穿

1. ❄️ 缓存雪崩(Cache Avalanche)

**定义:**大量缓存同一时间失效,导致请求直接打到数据库,造成数据库压力骤增甚至宕机。

解决方案:

  • 设置缓存过期时间时加入 随机因子,避免集中失效
  • 设置重要数据 永不过期,后台定时刷新
  • 使用熔断、限流等 降级机制

2. 🔍 缓存穿透(Cache Penetration)

定义:请求的是数据库和缓存中都不存在的 key(如非法用户 ID),每次都打到数据库。

解决方案:

  • 缓存空值:对不存在的结果也缓存一段时间
  • 布隆过滤器:使用布隆过滤器拦截非法访问 ID

3. ⚡ 缓存击穿(Cache Breakdown)

定义:某个热点 key 失效,大量请求在这一瞬间打入数据库。

解决方案:

  • 为热点数据设置永不过期或延迟更新
  • 加分布式锁,防止多个线程同时回源查询数据库

四、Redisson 分布式锁实践(必考面试题)

Redisson,一个功能完善、健壮的 Java 分布式锁框架。

// 创建 Redisson 客户端
Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379");
RedissonClient redisson = Redisson.create(config);// 获取锁
RLock lock = redisson.getLock("my-lock");try {// 加锁:默认 30s 自动续期lock.lock();// 业务逻辑System.out.println("执行业务逻辑...");} finally {lock.unlock();
}
锁类型说明
RLock可重入锁(默认)
RReadWriteLock支持读写分离
RSemaphore限流用(如限购场景)
RCountDownLatch多线程协作任务同步

五、Redis 哨兵机制与高可用方案

什么是哨兵机制(Sentinel)?

当主节点宕机时,哨兵会自动将从节点切换为主节点,并通知客户端更新连接地址,实现高可用部署。

哨兵功能:

  • 监控:判断主节点是否故障
  • 自动故障转移:主挂了,选出新的主
  • 通知客户端更新地址
  • 集群健壮性增强
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000

总结

Redis 是现代后端开发中不可或缺的一环,不仅仅是缓存工具,更是数据库、消息系统、分布式控制等场景的万能胶水。

http://www.lryc.cn/news/594056.html

相关文章:

  • MySQL 配置性能优化实操指南:分版本5.7和8.0适配方案
  • 【Anaconda】Conda 虚拟环境打包迁移教程
  • Redis通用常见命令(含面试题)
  • 28.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--币种服务(二)
  • 零基础学习性能测试第二章-linux/jvm/mysql等数据收集环境搭建
  • Feign远程调用
  • 在Ubuntu22系统上离线部署ai-infra-guard教程【亲测成功】
  • 【成品设计】基于STM32的宠物检测系统
  • ubuntu-linux-pycharm-社区版安装与django配置
  • 数据结构自学Days10 -- 二叉树的常用实现
  • 基于Chinese-LLaMA-Alpaca-3的多模态中医舌诊辅助诊断系统设计与实现
  • 【Linux】2. Linux下的C/C++开发环境
  • 使用“桥接模式“,实现跨平台绘图或多类型消息发送机制
  • 元宇宙经济的四个特征
  • Python,GPU编程新范式:CuPy与JAX在大规模科学计算中的对比
  • 数学专业转行做大数据容易吗?需要补什么?
  • 【前端】懒加载(组件/路由/图片等)+预加载 汇总
  • 笔试——Day13
  • 群组功能实现指南:从数据库设计到前后端交互,上班第二周
  • SmartyPants
  • git fork的项目远端标准协作流程 仓库设置[设置成upstream]
  • [硬件电路-55]:绝缘栅双极型晶体管(IGBT)的原理与应用
  • Elasticsearch 简化指南:GCP Google Compute Engine
  • windows + phpstorm 2024 + phpstudy 8 + php7.3 + thinkphp6 配置xdebug调试
  • Qt 应用程序入口代码分析
  • QT无边框窗口
  • 学习C++、QT---30(QT库中如何自定义控件(自定义按钮)讲解)
  • 在vue中遇到Uncaught TypeError: Assignment to constant variable(常亮无法修改)
  • Ajax简单介绍及Axios请求方式的别名
  • 最简单的 Android TV 项目示例