springcache中常用的注解

2023-10-30

Cacheable注解

标记在⼀个⽅法上,也可以标记在⼀个类上缓存标注对象的返回结果,

标注在⽅法上缓存该⽅法的返回值,标注在类上缓存该类所有的⽅法返回值

 一般标注在方法上。

@Cacheable(value = {"product"},key = "#root.methodName",cacheManager = "cacheManager1Day")  // 放在service层的实现类的某个方法上

// value 缓存名称
// key 缓存的key规则,可以⽤springEL表达式,默认是⽅法参数组合

// 第三个参数对应配置里面的方法
加上缓存注释后,如果第二次查询的时候,会先在缓存中查找,如果数据存在就不会直接取数据库中查找,而是直接利用缓存中的数据

缓存一般需要配置对应的过期时间:

修改redis缓存序列化器和配置manager过期时间

redis:
  time-to-live: 10  // 在配置文件中配置

也可以在配置类中configuration配置

 

 //配置缓存过期时间,这部分都是官方模板,只需要修改时间
    @Bean
    @Primary  // 缓存一小时 @Primary 是指定默认的,如果在cache里面没有指定就采用这个默认的情况
    public RedisCacheManager cacheManager1Hour(RedisConnectionFactory connectionFactory) {
        RedisCacheConfiguration config = instanceConfig(3600L); // 配置的过期时间是一小时,ttl单位是秒
        return RedisCacheManager.builder(connectionFactory).cacheDefaults(config).transactionAware().build();
    }
    
    @Bean // 缓存一天
    public RedisCacheManager cacheManager1Day(RedisConnectionFactory connectionFactory) {
        RedisCacheConfiguration config = instanceConfig(3600 * 24L);
        return RedisCacheManager.builder(connectionFactory).cacheDefaults(config).transactionAware().build();
    }
    
    private RedisCacheConfiguration instanceConfig(Long ttl) { 
            Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        objectMapper.registerModule(new JavaTimeModule());

        // 去掉各种@JsonSerialize注解的解析
        objectMapper.configure(MapperFeature.USE_ANNOTATIONS, false);

        // 只针对⾮空的值进⾏序列化
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

        // 将类型序列化到属性json字符串中
        objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance , ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
        // 指定了缓存的单位是秒 ofSeconds  禁止缓存空值 disableCachingNullValues
        return RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(ttl)).disableCachingNullValues().serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer));
    }

  /**
     * 自定义缓存key的规则
     * @return
     */
    @Bean
    public KeyGenerator springCacheDefaultKeyGenerator(){
        return new KeyGenerator() {
           @Override
            public Object generate(Object o, Method method, Object... objects) {
                return o.getClass().getSimpleName() + "_"
                        + method.getName() + "_"
                        + StringUtils.arrayToDelimitedString(objects, "_");
            }
        };

    }

自定义缓存的key的规则后,在缓存直接中,参数key'的值直接设置为这个配置的方法的名称

@Cacheable(value = {"product"},keyGenerator ="springCacheCustomKeyGenerator", cacheManager="cacheManager1Minute")

SpringCache框架常⽤注解CachePut

 根据⽅法的请求参数对其结果进⾏缓存,每次都会触发真实⽅法的调⽤;

这个注解返回的必须是对象;

 @CachePut(value = "product",key = "...",cacheManager = "cacheManager1Day")
    // 返回的必须是对象,将这个对象写入到缓存中
    public ProductDao updatetest(ProductDao productDao){
        productMapper.updateById(productDao);
        return productDao;
    }

SpringCache框架常⽤注解CacheEvict

从缓存中移除相应数据, 触发缓存删除的操作,主要用于delete方法中
value 缓存名称,可以有多个

key 缓存的key规则,可以⽤springEL表达式,默认是⽅法参数组合
beforeInvocation = false:缓存的清除是否在⽅法之前执⾏ ,默认代表缓存清除操作是在⽅法执⾏之后执⾏;如果出现异常缓存就不会清除

beforeInvocation = true:代表清除缓存操作是在⽅法运⾏之前执⾏,⽆论⽅法是否出现异常,缓存都清除

    @Override
    @CacheEvict(value = {"product"},key = "#root.args[0]")
    public int delById(int id) {
        return productMapper.deleteById(id);
    }

SpringCache框架多注解组合Caching

组合多个Cache注解使⽤允许在同⼀⽅法上使⽤多个嵌套的@Cacheable、@CachePut和@CacheEvict注释

@Caching(
cacheable = {
@Cacheable(value ="product",keyGenerator = "xdclassKeyGenerator")},

put = {
@CachePut(value ="product",key = "#id"),
@CachePut(value ="product",key = "'stock:'+#id")}
)

当某个方法调用之后可能触发多不同的结果,因此定义多个不同的注解,不同的key

缓存中常见题目

@Cacheable(value = {"product"},key ="#root.args[0]",
 cacheManager ="customCacheManager", sync=true)

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

springcache中常用的注解 的相关文章

  • redis-cli 重定向到 127.0.0.1

    我在PC1上启动Redis集群 然后在PC2上连接它 当需要重定向到另一个集群节点时 它会显示Redirected to slot 7785 located at 127 0 0 1 但应该显示Redirected to slot 7785
  • 如何测试我的 Redis 缓存是否正常工作?

    我已经安装了 django redis cache 和 redis py 我遵循了 Django 的缓存文档 据我所知 以下设置就是我所需要的 但我如何判断它是否正常工作 设置 py CACHES default BACKEND redis
  • 如何将node.js管道传输到redis?

    我有很多数据要插入 SET INCR 到redis DB 所以我正在寻找pipeline http redis io topics pipelining 质量插入 http redis io topics mass insert通过node
  • 无法启动redis.service:单元redis-server.service被屏蔽

    我在 ubuntu 16 04 上安装了 Redis 服务器 但是当我尝试使用启动redis服务时 sudo systemctl start redis 我收到消息 Failed to start redis service Unit re
  • Redis Docker compose无法处理RDB格式版本10

    我无法在 docker compose 文件中启动 redis 容器 我知道docker compose文件没问题 因为我的同事可以成功启动项目 我读到有一个删除 dump rdb 文件的解决方案 但我找不到它 我使用Windows机器 任
  • 有没有办法在 ruby​​ 中重新定义 []=+

    我正在尝试编写一个简单的 DSL 针对 Redis 并且我想自己定义 I have def key val redis zadd name val key end 我想定义 def key val redis zincrby name va
  • 如何设置和获取Redis中存储的对象?

    我试图在 redis 中存储一个对象 当我获取该对象时 它似乎不起作用 I tried u User new u name blankman redis set test u x redis get test x name error 我想
  • Redis发布/订阅:查看当前订阅了哪些频道

    我目前有兴趣查看我拥有的 Redis 发布 订阅应用程序中订阅了哪些频道 当客户端连接到我们的服务器时 我们将它们注册到如下所示的通道 user user id 这样做的原因是我希望能够看到谁 在线 目前 我在不知道客户端是否在线的情况下盲
  • Redis、会话过期和反向查找

    我目前正在构建一个网络应用程序 并想使用 Redis 来存储会话 登录时 会话会使用相应的用户 ID 插入到 Redis 中 并且过期时间设置为 15 分钟 我现在想实现会话的反向查找 获取具有特定用户 ID 的会话 这里的问题是 由于我无
  • 2 个具有共享 Redis 依赖的 Helm Chart

    目前 我有 2 个 Helm Charts Chart A 和 Chart B Chart A 和 Chart B 对 Redis 实例具有相同的依赖关系 如Chart yaml file dependencies name redis v
  • 有没有办法让特定的key在集群模式下定位到特定的redis实例上?

    我想让我的多锁位于不同的redis实例上 我发现redission可以指定一个实例来执行命令 但是如果该命令与key相关 则指定的实例会将命令传输到另一个实例 你能给我一些建议吗 你可以 但这并不是微不足道的 首先 Redis 在键中使用大
  • StackExchange.Redis的正确使用方法

    这个想法是使用更少的连接和更好的性能 连接会随时过期吗 对于另一个问题 redis GetDatabase 打开新连接 private static ConnectionMultiplexer redis private static ID
  • 使用redis进行树形数据结构

    我需要为基于树的键值开发一个缓存系统 与Windows注册表编辑器非常相似 其中缓存键是字符串 表示树中到值的路径 可以是原始类型 int string bool double 等 或子树本身 例如 key root x y z w val
  • 如何将“.csv”数据文件导入Redis数据库

    如何将 csv 数据文件导入 Redis 数据库 csv 文件中包含 id 时间 纬度 经度 列 您能否向我建议导入 CSV 文件并能够执行空间查询的最佳方法 这是一个非常广泛的问题 因为我们不知道您想要什么数据结构 您期望什么查询等等 为
  • 节点应用程序之间共享会话?

    我目前有两个独立的节点应用程序在两个不同的端口上运行 但共享相同的后端数据存储 我需要在两个应用程序之间共享用户会话 以便当用户通过一个应用程序登录时 他们的会话可用 并且他们似乎已登录到另一个应用程序 在本例中 它是一个面向公众的网站和一
  • docker-compose:容器之间的 Redis 连接被拒绝

    我正在尝试设置一个 docker compose 文件 该文件旨在替换运行多个进程 RQ 工作线程 RQ 仪表板和 Flask 应用程序 的单个 Docker 容器解决方案导师 http supervisord org 主机系统是 Debi
  • 超出 Redis 连接/缓冲区大小限制

    在对我们的应用程序服务器进行压力测试时 我们从 Redis 中得到以下异常 ServiceStack Redis RedisException 无法连接到 redis host 6379 处的 redis 实例 gt System Net
  • 由于配置文件错误,无法启动 Redis 服务器

    我刚刚按照此处的说明安装了 Redis http redis io download http redis io download 当我运行 redis server redis conf 时出现以下错误 FATAL CONFIG FILE
  • 将文件传递给活动作业/后台作业

    我通过标准文件输入接收请求参数中的文件 def create file params file upload Upload create file file filename img png end 但是 对于大型上传 我想在后台作业中执行
  • 在 Rails 应用程序上将 HASH 保存到 Redis

    我刚刚开始使用 Redis 和 Rails 所以这可能是一个愚蠢的问题 我试图将哈希值保存到 Redis 服务器 但是当我检索它时 它只是一个字符串 IE hash field gt value field2 gt value2 redis

随机推荐

  • Ubuntu如何把主文件夹的中文设置成英文

    打开终端 输入命令 export LANG en US 接着输入更新命令 xdg user dirs gtk update 然后输入命令 export LANG zh CN 最后输入重启命令 sudo reboot 重启之后就可以看到主文件
  • Lanbda表达式详解

    lambda 表达式最大的用处就是简写代码 在需要降低代码之间的耦合性和侵入性较多使用匿名内部类来解决这一问题 我们使用lambda表达式可以将匿名内部类最大程度的简写 除此之外lambda表达式的作用就是让你的代码变得更加优雅 文件过滤器
  • log4j.properties log4j.xml 路径问题

    我的博客现在已经搬家到极客导航的博客模块中链接地址是 极客博客 顺便做了个程序员资源导航站www gogeeks cn 有兴趣的朋友不妨看一看有哪些还没了解到的IT方面的东西 比如框架 书籍 教程 开源社区等等吧 自动加载配置文件 1 如果
  • 从ReentrantLock的角度来看AQS原理

    ReentrantLock ReentrantLock作为java api层面的加锁方式 其性能比synchronized更好 synchronized进行优化后性能差不太多 灵活性更强 ReentrantLock synchronized
  • MySql 学习(4)Linux MySql 开启远程服务

    1 MySql设授权远程访问 1 使用mysql u root p登录mysql 2 使用mysql数据库 真正的数据库 而非数据库软件 将所有数据库的所有表 的所有权限 all privileges 授予通过任何ip 访问的root用户
  • quartusII创建第一个VHDL程序

    选择file new project wizard 点击next 这一步忽略 输入项目的名称 自己写就可以 随便什么 不要有空格 默认选择空文件 next 如果需要增加写好的文件 自己选择 不需要就忽略 直接next 选择硬件器件型号 打包
  • 错误信息:未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序。

    错误信息 未在本地计算机上注册 microsoft ACE oledb 12 0 提供程序 解决办法 去下载 然后安装就行了 本错误是由于你使用了ACCESS2007版本建立的数据库 但服务器中没有相配合使用的程序 所以出错 未在本地计算机
  • HG海光X86

    1 X86模式 只有Intel和AMD可以持续演进 架构授权体系封闭 仅限于Intel和AMD交叉授权 其他厂家无法拿到完整授权 2 HG授权来自AMD 属于IP授权且盒子公司被AMD控股 核心技术受控在AMD IP授权只能用 不能改 无法
  • 临界区(锁)windows/linux通用

    lock h pragma once ifdef WIN32 include
  • react umi dva 使用 useSelector,useDispatch

    react umi dva 使用 useSelector useDispatch 需要保证 是在hooks 里面引入使用 且 是hooks 方式 调用 组件
  • 微信赌场——H5棋牌游戏渗透之旅

    i春秋作家 F0rmat 0x01 前言 本来不想发的 涉及太多利益了 这些棋牌游戏的源码最高能卖到几万 开发起来不比一个商场程序难 最近又太忙了 没时间去做代码审计的文章了 但一不小心又抢了个运气王 0x02 开始 一天做这行的朋友来找我
  • 全书简介和作者寄语

    聪明办法学Python 大家好 我是小雨姑娘 双非本科自学数据挖掘 曾两次获得数据挖掘比赛冠军 被选入2020数据挖掘竞赛十大开源贡献者 人工智能开源组织Datawhale成员 现于北美攻读计算机博士学位 创作本教程的初心是提供一个更快捷有
  • sqli-labs靶场第十八关

    十八关有点特殊 后台对输入的账号和密码都调用了函数进行过滤了 所以要转换注入方式 尝试去请求头里面修改信息 可以尝试cookie注入 user agent注入 refer字段注入 最终在user agent字段发现注入点 因为输入单引号或双
  • Python经典热力学数值分析

    气体动力学理论 理想气体定律的推导 Python 数值探索 以下Python代码块比较平均值 x langle x rangle x 和均方根 x
  • 推荐一款word转pdf超好用的包:aspose-words(解决中文乱码)

    aspose words 是一款超好用的转换工具 转换效果很好 且实现超级简单 首先通过pom xml 引入
  • vue-自定义指令

    自定义指令 一 定义语法 1 局部指令 new Vue new Vue directives 指令名 配置对象 或 directives 指令名 回调函数 2 全局指令 Vue directive 指令名 配置对象 或 Vue direct
  • 树莓派ARM64系统中如何设置opencv-python读取高清摄像头画面

    问题 树莓派4B 8G 2021 10 30 raspios bullseye arm64 img Linux raspberrypi 5 10 63 v8 1459 SMP PREEMPT Wed Oct 6 16 42 49 BST 2
  • 如何实现跨项目共享token

    项目场景 由于旧项目的改版变动比较大 需要新开一个项目 就需要用两个项目共享token 一 由于域名是相同的 先获取host内容 二 编写cookie 保存和获取的方法 const Cookie set name value days va
  • vim/gvim插件-verilog autodef-自动生成

    使用gvim插件效果如下 使用效果如下 总结 优点 1 这个使用效果是比emacs的auto reg和auto wire是方便且全面的 auto wire只能定义output的类型生成 2 这个插件还有AutoInstPortReAlign
  • springcache中常用的注解

    Cacheable注解 标记在 个 法上 也可以标记在 个类上缓存标注对象的返回结果 标注在 法上缓存该 法的返回值 标注在类上缓存该类所有的 法返回值 一般标注在方法上 Cacheable value product key root m