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
相关文章
|
9天前
|
Java Spring
在使用Spring的`@Value`注解注入属性值时,有一些特殊字符需要注意
【10月更文挑战第9天】在使用Spring的`@Value`注解注入属性值时,需注意一些特殊字符的正确处理方法,包括空格、引号、反斜杠、新行、制表符、逗号、大括号、$、百分号及其他特殊字符。通过适当包裹或转义,确保这些字符能被正确解析和注入。
|
14天前
|
架构师 Java 开发者
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
在40岁老架构师尼恩的读者交流群中,近期多位读者成功获得了知名互联网企业的面试机会,如得物、阿里、滴滴等。然而,面对“Spring Boot自动装配机制”等核心面试题,部分读者因准备不足而未能顺利通过。为此,尼恩团队将系统化梳理和总结这一主题,帮助大家全面提升技术水平,让面试官“爱到不能自已”。
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
|
18天前
|
XML Java 数据库
Spring boot的最全注解
Spring boot的最全注解
|
19天前
|
JSON NoSQL Java
springBoot:jwt&redis&文件操作&常见请求错误代码&参数注解 (九)
该文档涵盖JWT(JSON Web Token)的组成、依赖、工具类创建及拦截器配置,并介绍了Redis的依赖配置与文件操作相关功能,包括文件上传、下载、删除及批量删除的方法。同时,文档还列举了常见的HTTP请求错误代码及其含义,并详细解释了@RequestParam与@PathVariable等参数注解的区别与用法。
|
19天前
|
Java API Spring
springBoot:注解&封装类&异常类&登录实现类 (八)
本文介绍了Spring Boot项目中的一些关键代码片段,包括使用`@PathVariable`绑定路径参数、创建封装类Result和异常处理类GlobalException、定义常量接口Constants、自定义异常ServiceException以及实现用户登录功能。通过这些代码,展示了如何构建RESTful API,处理请求参数,统一返回结果格式,以及全局异常处理等核心功能。
|
6天前
|
存储 Java 数据管理
强大!用 @Audited 注解增强 Spring Boot 应用,打造健壮的数据审计功能
本文深入介绍了如何在Spring Boot应用中使用`@Audited`注解和`spring-data-envers`实现数据审计功能,涵盖从添加依赖、配置实体类到查询审计数据的具体步骤,助力开发人员构建更加透明、合规的应用系统。
|
19天前
|
XML Java 数据格式
手动开发-简单的Spring基于注解配置的程序--源码解析
手动开发-简单的Spring基于注解配置的程序--源码解析
34 0
|
6月前
|
Java API Spring
Spring容器如何使用一个注解来指定一个类型为配置类型
Spring容器如何使用一个注解来指定一个类型为配置类型
50 0
|
5月前
|
XML Java 数据格式
Spring5系列学习文章分享---第三篇(AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式))
Spring5系列学习文章分享---第三篇(AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式))
48 0
|
5月前
|
Java Spring
spring基于注解配置数据源
spring基于注解配置数据源