Redis缓存注解怎么用,结合实例聊聊它的实际应用和效果
- 问答
- 2026-01-05 13:49:25
- 23
想象一下,你正在开发一个电商网站,每当有用户访问一个热门商品的页面时,你的程序都需要去数据库里查询这个商品的信息:名称、价格、库存、描述等等,如果这个商品被成千上万人同时浏览,那么数据库每秒都要处理成千上万次几乎一模一样的查询请求,数据库的压力会非常大,响应可能会变慢,整个网站都会变得卡顿。
这时候,Redis就派上用场了,你可以把它理解成一个放在内存里的、速度极快的“临时记事本”,我们把从数据库查到的数据,暂时写在这个记事本上,并设置一个有效期(比如5分钟),接下来的5分钟内,如果再有用户来查询同一个商品,我们就不再去麻烦数据库了,而是直接从这个高速的“记事本”(Redis)里读取数据,因为内存的读写速度远远快于硬盘,所以用户会感觉页面打开得飞快。
而在Spring Boot框架中,为了让开发者更轻松地使用这个“记事本”,提供了一套非常方便的缓存注解,你几乎不需要写复杂的Redis操作代码,只需要在方法上加几个简单的注解,就能实现上述的缓存逻辑。

最常用的几个注解是:
-
@Cacheable:这个注解的意思是“先查缓存,缓存没有再执行方法”。 它是最核心的一个。
- 应用场景:主要用于查询方法,比如根据商品ID查询商品详情,根据用户ID查询用户信息等。
- 实例:
@Cacheable(value = "product", key = "#productId") public Product getProductById(Long productId) { // 模拟一个耗时的数据库查询 System.out.println("正在从数据库查询商品:" + productId); return productRepository.findById(productId).orElse(null); } - 效果:第一次调用
getProductById(123)时,因为缓存是空的,所以会执行方法体,打印“正在从数据库查询商品:123”,然后把查询结果存入Redis一个名为product的缓存区域,并且键是123,在接下来的有效期(可通过配置设置)内,再次调用getProductById(123),程序会直接返回Redis里的数据,不会执行方法体,也不会打印那条语句,你会在日志里看到,只有第一次有数据库查询,后续请求瞬间就返回了。
-
@CacheEvict:这个注解的意思是“清除缓存”。- 应用场景:主要用于更新或删除数据的方法,当数据发生变化时,必须让旧的缓存失效,否则用户读到的就是过时的“脏数据”。
- 实例:
@CacheEvict(value = "product", key = "#productId") public void updateProduct(Product product) { System.out.println("更新数据库中的商品信息"); productRepository.update(product); // 方法执行成功后,会自动移除指定缓存 } - 效果:当你调用
updateProduct修改了ID为123的商品信息后,注解会自动从Redis的product区域中删除键为123的缓存数据,这样,下一次有人调用getProductById(123)时,缓存找不到,就会去数据库查询最新的数据,并重新放入缓存,保证了数据的一致性。
-
@CachePut:这个注解的意思是“不管缓存有没有,都执行方法,并把结果更新到缓存中”。
- 应用场景:用于新增或更新操作,并且你希望立即更新缓存,它和
@CacheEvict的区别在于,它不删除旧缓存而是直接用新值覆盖。 - 实例:
@CachePut(value = "product", key = "#product.id") public Product createProduct(Product product) { System.out.println("向数据库插入新商品"); Product savedProduct = productRepository.save(product); return savedProduct; } - 效果:新增一个商品后,这个新商品的信息会立刻被放入缓存,这样下次查询时就能直接命中,非常适合热点数据的新增。
- 应用场景:用于新增或更新操作,并且你希望立即更新缓存,它和
实际应用的综合效果
让我们回到电商网站的例子,看看结合使用这些注解的实际效果:
- 首页商品列表/热门商品展示:使用
@Cacheable缓存整个列表或热门商品对象,极大减轻了数据库压力,页面加载速度提升数倍甚至数十倍。 - 用户下单购买:下单成功后,库存发生了变化,在更新库存的服务方法上,使用
@CacheEvict清除该商品的缓存,这样其他用户看到的库存就是准确的,避免了超卖。 - 商品管理员修改价格:在后台更新商品信息的接口上,使用
@CacheEvict或@CachePut,确保前台用户刷新后立刻看到最新的价格。
需要注意的地方
虽然缓存注解很好用,但也不是万能的,用了之后要考虑一些问题:
- 缓存穿透:如果有人恶意请求一个数据库中根本不存在的数据(比如不存在的商品ID),每次请求都会绕过缓存打到数据库上,解决办法通常是对“空值”也进行短暂缓存。
- 缓存雪崩:如果大量缓存数据在同一时刻过期,会导致所有请求瞬间涌向数据库,解决办法是给缓存过期时间加上一个随机值,避免同时失效。
- 数据一致性:
@CacheEvict的时机很重要,一定要确保数据库事务成功提交后,再清除缓存,否则可能出现数据库更新失败但缓存已被清除的尴尬情况。
Redis缓存注解通过极简的配置,为程序加上了一个高速的数据缓冲层,它用起来非常简单,但其背后的思想——用空间换时间——对于构建高性能、高并发的现代互联网应用至关重要,只要你理解了“何时存”(@Cacheable)、“何时删”(@CacheEvict)这两个核心问题,就能在项目中得心应手地使用它,并亲眼见证它带来的性能飞跃。
本文由度秀梅于2026-01-05发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/74981.html
