Spring Cache-缓存注解(二)

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: Spring Cache-缓存注解(二)

导读

Spring-Cache手札

Spring Cache抽象-缓存注解

实战-Redis-20Spring缓存机制整合Redis

关于Spring Cache以及注解,之前总结了几篇。现在我们再来细化下


概述


image.png


注解@Cacheable 和@CachePut 都可以保存缓存键值对,只是它们的方式略有不同, 请注意二者的区别,它们只能运用于有返回值的方法中。

而删除缓存 key 的@CacheEvict 则可以用在 void 的方法上,因为它并不需要去保存任何值 。

上述注解都能标注到类或者方法之上,如果放到类上,则对所有的方法都有效,如果放到方法上,则只是对方法有效。

在大部分情况下,会放置到方法上。 @Cacheable 和 @CachePut 可以配置的属性接近。

一般而言,对于查询,我们会考虑使用@Cacheable

对于插入和修改,考虑使用@CachePut

对于删除操作,我们会考虑使用@CacheEvict。


注解@Cacheable 和@CachePut


因为@Cacheable 和@CachePut 两个注解的配置项 比较接近,所以这里就将这两个注解一并来看


image.png

value 和 key 这两个属性使用得最多,所以先来讨论这两个属性。


value 是一个数组,可以引用多个缓存管理器.


案例----->https://blog.csdn.net/yangshangwei/article/details/82961772#Service_664


20181008090659965.png


20181008090626967.png


如上代码所示定义redisCacheManager后就可以引用它了,而对于 key 则是缓存中的键,它支持 Spring 表达式,通过 Spring 表达式就可以自定义缓存的 key。


表达式值的引用


Spring 表达式和缓存注解之间的约定,通过这些约定去引用方法的参数和返回值的内容,使得其注入 key 所定义的 Spring 表达式的结果中。


image.png

这样就方便使用对应的参数或者返回值作为缓存的 key 了。


注解@CacheEvict

注解@CacheEvict 主要是为了移除缓存对应的键值对,主要对于那些删除的操作,先来了解它存在哪些属性。


image.png


  • value 和 key 与之前的@Cacheable 和@CachePut 是一致的。
  • 属性 allEntries 要求删除缓存服务器中所有的缓存,这个时候指定的 key 将不会生效,所以这个属性要慎用
  • beforeInvocation 属性指定缓存在方法前或者方法后移除。


案例

Spring缓存机制整合Redis

package com.artisan.ssm_redis.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.artisan.ssm_redis.dao.RoleDao;
import com.artisan.ssm_redis.domain.Role;
import com.artisan.ssm_redis.service.RoleService;
@Service
public class RoleServiceImpl implements RoleService {
  // 自动注入
  @Autowired
  private RoleDao roleDao;
  /**
   * 使用@Cacheable定义缓存策略 当缓存中有值,则返回缓存数据,否则访问方法得到数据 通过value引用缓存管理器,通过key定义键
   * 
   * @param id
   *            角色编号
   * @return 角色
   */
  @Override
  @Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED)
  @Cacheable(value = "redisCacheManager", key = "'redis_role_'+#id")
  public Role getRole(Long id) {
    return roleDao.getRole(id);
  }
  /**
   * 使用@CachePut则表示无论如何都会执行方法,最后将方法的返回值再保存到缓存中
   * 使用在插入数据的地方,则表示保存到数据库后,会同期插入到Redis缓存中
   * 
   * @param role
   *            角色对象
   * @return 角色对象(会回填主键)
   */
  @Override
  @Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED)
  @CachePut(value = "redisCacheManager", key = "'redis_role_'+#result.id")
  public Role insertRole(Role role) {
    roleDao.insertRole(role);
    return role;
  }
  /**
   * 使用@CachePut,表示更新数据库数据的同时,也会同步更新缓存
   * 
   * @param role
   *            角色对象
   * @return 影响条数
   */
  @Override
  @Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED)
  @CachePut(value = "redisCacheManager", key = "'redis_role_'+#role.id")
  public int updateRole(Role role) {
    return roleDao.updateRole(role);
  }
  /**
   * 使用@CacheEvict删除缓存对应的key
   * 
   * @param id
   *            角色编号
   * @return 返回删除记录数
   */
  @Override
  @Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED)
  @CacheEvict(value = "redisCacheManager", key = "'redis_role_'+#id")
  public int deleteRole(Long id) {
    return roleDao.deleteRole(id);
  }
}


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
12天前
|
XML Java 数据格式
SpringBoot入门(8) - 开发中还有哪些常用注解
SpringBoot入门(8) - 开发中还有哪些常用注解
30 0
|
19天前
|
XML JSON Java
SpringBoot必须掌握的常用注解!
SpringBoot必须掌握的常用注解!
42 4
SpringBoot必须掌握的常用注解!
|
21天前
|
存储 缓存 Java
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
67 2
|
21天前
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
34 1
|
15天前
|
存储 安全 Java
springboot当中ConfigurationProperties注解作用跟数据库存入有啥区别
`@ConfigurationProperties`注解和数据库存储配置信息各有优劣,适用于不同的应用场景。`@ConfigurationProperties`提供了类型安全和模块化的配置管理方式,适合静态和简单配置。而数据库存储配置信息提供了动态更新和集中管理的能力,适合需要频繁变化和集中管理的配置需求。在实际项目中,可以根据具体需求选择合适的配置管理方式,或者结合使用这两种方式,实现灵活高效的配置管理。
12 0
|
28天前
|
存储 Java 数据管理
强大!用 @Audited 注解增强 Spring Boot 应用,打造健壮的数据审计功能
本文深入介绍了如何在Spring Boot应用中使用`@Audited`注解和`spring-data-envers`实现数据审计功能,涵盖从添加依赖、配置实体类到查询审计数据的具体步骤,助力开发人员构建更加透明、合规的应用系统。
|
6月前
|
缓存 NoSQL Java
Spring Cache 缓存原理与 Redis 实践
Spring Cache 缓存原理与 Redis 实践
348 0
|
6月前
|
缓存 NoSQL Java
spring cache整合redis实现springboot项目中的缓存功能
spring cache整合redis实现springboot项目中的缓存功能
127 1
|
6月前
|
缓存 NoSQL Java
Spring Cache 整合 Redis 做缓存使用~ 快速上手~
Spring Cache 整合 Redis 做缓存使用~ 快速上手~
141 1
|
11月前
|
缓存 NoSQL Java
spring cache使用redis
spring cache使用redis
71 1

热门文章

最新文章

下一篇
无影云桌面