文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringBoot2 基础案例(13):基于Cache注解,管理Redis缓存

2023-06-02 13:24

关注

本文源码:GitHub·点这里 || GitEE·点这里

一、Cache缓存简介

从Spring3开始定义Cache和CacheManager接口来统一不同的缓存技术;
Cache接口为缓存的组件规范定义,包含缓存的各种操作集合;
Cache接口下Spring提供了各种缓存的实现;
RedisCache,EhCacheCache ,ConcurrentMapCache等;

二、核心API

Cache缓存接口
定义缓存操作。实现有:RedisCache、EhCacheCache、ConcurrentMapCache等
2、CacheManager
缓存管理器,管理各种缓存(cache)组件
3、@Cacheable 主要针对方法配置,能够根据方法的请求参数对其进行缓存

Cacheable 执行流程1)方法运行之前,按照cacheNames指定的名字先去查询Cache 缓存组件2)第一次获取缓存如果没有Cache组件会自动创建3)Cache中查找缓存的内容,使用一个key,默认就是方法的参数4)key是按照某种策略生成的;默认是使用keyGenerator生成的,这里使用自定义配置5)没有查到缓存就调用目标方法;6)将目标方法返回的结果,放进缓存中Cacheable 注解属性cacheNames/value:指定方法返回结果使用的缓存组件的名字,可以指定多个缓存key:缓存数据使用的keykey/keyGenerator:key的生成器,可以自定义cacheManager:指定缓存管理器cacheResolver:指定缓存解析器condition:指定符合条件的数据才缓存unless:否定缓存;当unless指定的条件为true,方法的返回值就不会被缓存sync:是否使用异步模式

@CacheEvict
清除缓存

CacheEvict:缓存清除key:指定要清除的数据allEntries = true:指定清除这个缓存中所有的数据beforeInvocation = false:方法之前执行清除缓存,出现异常不执行beforeInvocation = true:代表清除缓存操作是在方法运行之前执行,无论方法是否出现异常,缓存都清除

@CachePut
保证方法被调用,又希望结果被缓存。
与@Cacheable区别在于是否每次都调用方法,常用于更新,写入

CachePut:执行方法且缓存方法执行的结果修改了数据库的某个数据,同时更新缓存;执行流程 1)先调用目标方法 2)然后将目标方法的结果缓存起来

@EnableCaching
开启基于注解的缓存
7、keyGenerator
缓存数据时key生成策略
8、@CacheConfig
统一配置本类的缓存注解的属性

三、与SpringBoot2整合

1、核心依赖

<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-cache</artifactId></dependency><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-data-redis</artifactId></dependency>

2、Cache缓存配置

import org.springframework.cache.interceptor.KeyGenerator;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import java.lang.reflect.Method;@Configurationpublic class CacheConfig {        @Bean("oneKeyGenerator")    public KeyGenerator getKeyGenerator (){        return new KeyGenerator() {            @Override            public Object generate(Object obj, Method method, Object... objects) {                return "KeyGenerator:"+method.getName();            }        } ;    }}

3、启动类注解开启Cache

@EnableCaching            // 开启Cache 缓存注解@SpringBootApplicationpublic class CacheApplication {    public static void main(String[] args) {        SpringApplication.run(CacheApplication.class,args) ;    }}

4、Cache注解使用代码

1)封装增删改查接口

import com.boot.cache.entity.User;public interface UserService {    // 增、改、查、删    User addUser (User user) ;    User updateUser (Integer id) ;    User selectUser (Integer id) ;    void deleteUser (Integer id);}

2)Cache注解使用案例

import com.boot.cache.entity.User;import com.boot.cache.service.UserService;import org.springframework.cache.annotation.CacheEvict;import org.springframework.cache.annotation.CachePut;import org.springframework.cache.annotation.Cacheable;import org.springframework.stereotype.Service;@Servicepublic class UserServiceImpl implements UserService {    // 使用自定义的key生成策略    // 缓存结果key:addUser::KeyGenerator:addUser    @CachePut(value = "addUser",keyGenerator="oneKeyGenerator")    @Override    public User addUser(User user) {        return user ;    }    // 缓存结果key:updateUser::2    @CachePut(value = "updateUser",key = "#result.id")    @Override    public User updateUser(Integer id) {        User user = new User() ;        user.setId(id);        user.setName("smile");        return user;    }    // 缓存结果key: selectUser::3    @Cacheable(cacheNames = "selectUser",key = "#id")    @Override    public User selectUser(Integer id) {        User user = new User() ;        user.setId(id);        user.setName("cicadaSmile");        return user;    }    // 删除指定key: selectUser::3    @CacheEvict(value = "selectUser",key = "#id",beforeInvocation = true)    @Override    public void deleteUser(Integer id) {    }}

5、测试代码块

@RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes = CacheApplication.class)public class CacheTest {    @Resource    private UserService userService ;    // 分别测试:增、改、查、删,四个方法    @Test    public void testAdd (){        User user = new User() ;        user.setId(1);        user.setName("cicada");        userService.addUser(user) ;    }    @Test    public void testUpdate (){        userService.updateUser(2) ;    }    @Test    public void testSelect (){        userService.selectUser(3) ;    }    @Test    public void testDelete (){        userService.deleteUser(3) ;    }}

四、源代码地址

GitHub·地址https://github.com/cicadasmile/spring-boot-baseGitEE·地址https://gitee.com/cicadasmile/spring-boot-base

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 资料下载
  • 历年真题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯