Spring Boot使用Redis常用场景
Spring Boot使用Redis常用场景
一、概述:Redis 是什么?为什么要用它?
Redis(Remote Dictionary Server)是一个内存中的数据存储系统(类似一个“超级大字典”),它能存各种类型的数据(字符串、列表、哈希等),而且读写速度极快(因为数据存在内存里)。
简单说,Redis 就像电脑的“缓存抽屉”:当你的程序需要频繁读取或修改某些数据时(比如用户登录信息、商品销量),直接从 Redis 里拿,比从硬盘的数据库(如 MySQL)里拿快 10 倍甚至 更多倍!
二、Redis 支持的数据类型(5种最常用)
Redis 能存很多种“结构”的数据,就像不同形状的盒子,装不同的东西:
类型 | 特点 | 举例场景 |
---|---|---|
字符串(String) | 最基础类型,存文本或数字(比如 “张三” 或 “100”) | 存用户手机号、商品库存数量 |
哈希(Hash) | 类似“小字典”,存键值对的集合(比如 {“name”:“张三”, “age”:18}) | 存用户详细信息、商品属性 |
列表(List) | 有序的字符串列表(类似数组,可从左/右添加元素) | 存朋友圈动态列表、日志队列 |
集合(Set) | 无序、不重复的字符串集合(类似数学里的集合) | 存用户点赞的商品ID(去重) |
有序集合(ZSet) | 类似集合,但每个元素有“分数”(按分数排序) | 存排行榜(比如积分排名) |
三、Redis 的常见使用场景
Redis 能解决很多实际问题,最常用的 4 种场景:
- 缓存(最常用!):把高频访问的数据(比如商品详情、首页广告)存到 Redis,减少数据库查询次数。
- 计数器:用 Redis 的
INCR
命令(类似 +1 操作)统计文章阅读量、视频播放量,比数据库的+1
快很多。 - 会话共享:多个服务器(比如 A 服务器和 B 服务器)共享用户登录状态(存 Redis 里,不用每个服务器单独存)。
- 分布式锁:在秒杀活动中,用 Redis 保证同一时间只有 1 个请求能修改库存(防止超卖)。
四、实际业务举例:商品详情页缓存
需求:用户访问商品详情页时,先从 Redis 查缓存;如果没有,再查数据库,并把结果存到 Redis(避免频繁查数据库)。
实现步骤
- 用户访问商品详情页(比如商品ID是 1001);
- 程序先查 Redis 是否有
product:1001
的缓存; - 如果有,直接返回缓存数据;
- 如果没有,查 MySQL 数据库,拿到商品详情;
- 把商品详情存到 Redis(设 30 分钟过期),再返回给用户。
@Service
public class ProductService {@Autowiredprivate ProductMapper productMapper; // 操作数据库的类(假设已定义)@Autowiredprivate RedisTemplate<String, Object> redisTemplate;public Product getProductDetail(Long productId) {String key = "product:" + productId;// 1. 先查 Redis 缓存Product product = (Product) redisTemplate.opsForValue().get(key);if (product != null) {return product; // 缓存有数据,直接返回}// 2. 缓存没有,查数据库product = productMapper.selectById(productId); // 3. 把数据库结果存到 Redis(设 30 分钟过期)if (product != null) {redisTemplate.opsForValue().set(key, product, 30, TimeUnit.MINUTES);}return product;}
}
五、总结:使用 Redis 的注意事项
- 缓存过期时间:一定要给缓存设过期时间(比如 30 分钟),否则 Redis 内存会被占满!
- 避免缓存击穿:高并发时,如果某个热点缓存突然过期(比如秒杀商品),会导致大量请求同时查数据库。可以用“分布式锁”(比如 Redis 的
setIfAbsent
命令)保证只有 1 个请求查数据库,其他请求等缓存更新。 - 数据一致性:如果数据库数据修改了,要及时删除或更新 Redis 里的旧缓存(比如用户修改了商品价格,要删除
product:1001
的缓存)。 - 内存监控:用
redis-cli
命令(或可视化工具如 RedisDesktopManager)监控内存使用情况,避免内存不足。