返回顶部
首页 > 资讯 > 精选 >SpringBoot @Cacheable自定义KeyGenerator方式是什么
  • 661
分享到

SpringBoot @Cacheable自定义KeyGenerator方式是什么

2023-06-22 05:06:24 661人浏览 独家记忆
摘要

这篇文章主要介绍“SpringBoot @Cacheable自定义KeyGenerator方式是什么”,在日常操作中,相信很多人在springBoot @Cacheable自定义KeyGenerator方式是什么问题上存

这篇文章主要介绍“SpringBoot @Cacheable自定义KeyGenerator方式是什么”,在日常操作中,相信很多人在springBoot @Cacheable自定义KeyGenerator方式是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SpringBoot @Cacheable自定义KeyGenerator方式是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

@Cacheable自定义KeyGenerator

1. 概述

SpringBoot 使用 @Cacheable 可以方便的管理缓存数据,在不指定 key 属性的情况下,默认使用 SimpleKeyGenerator 生成 key。除此之外,我们也可以自定义实现 KeyGenerator 接口,生成自己的 key 名称策略。

2. MySimpleKey 类

MySimpleKey类的作用是存放参数数据,必须实现equals、hashCode。如果需要自定义key格式,同样需要实现toString接口,下面的例子是把参数用逗号分隔。

public class MySimpleKey implements Serializable {    public static final MySimpleKey EMPTY = new MySimpleKey(new Object[0]);    private final Object[] params;    private transient int hashCode;    public MySimpleKey(Object... elements) {        Assert.notNull(elements, "Elements must not be null");        this.params = (Object[])elements.clone();        this.hashCode = Arrays.deepHashCode(this.params);    }    public boolean equals(@Nullable Object other) {        return this == other || other instanceof MySimpleKey && Arrays.deepEquals(this.params, ((MySimpleKey)other).params);    }    public final int hashCode() {        return this.hashCode;    }    public String toString() {        return StringUtils.arrayToCommaDelimitedString(this.params);    }}

3. MyKeyGenerator 类

MyKeyGenerator 实现 KeyGenerator 的接口,里面只有一个 generate 方法

public class MyKeyGenerator implements KeyGenerator {    @Override    public Object generate(Object o, Method method, Object... objects) {        if (objects.length == 0) {            return MySimpleKey.EMPTY;        } else {            if (objects.length == 1) {                Object param = objects[0];                if (param != null && !param.getClass().isArray()) {                    return param;                }            }            return new MySimpleKey(objects);        }    }}

定义MyKeyGenerator Bean:

@Componentpublic class MyRedisConf {    @Bean    public MyKeyGenerator myKeyGenerator(){        return new MyKeyGenerator();    }}

4. 配置keyGenerator

在 @Cacheable 配置 keyGenerator 属性,值就是前面配置的Bean名称

@Override    @Cacheable(value = {"Redis:GETSTRING3"}, keyGenerator = "myKeyGenerator")    public String getString3(String tag, String name) {        return tag + " " + name;    }

测试结果如下,tag、name 参数确实以逗号分隔

127.0.0.1:6379[5]> KEYS *

1) "REDIS:GETSTRING3::hello,zhangsan"

Spring-Cache key设置

第一种方式:手动设置

为了便于key的不重复,我们可以手动设置key有类名、方法名、参数等组合

属性名称

描述

示例

methodName

当前方法名

#root.methodName

method

当前方法

#root.method.name

target

当前被调用的对象

#root.target

targetClass

当前被调用的对象的class

#root.targetClass

args

当前方法参数组成的数组

#root.args[0]

caches

当前被调用的方法使用的Cache

#root.caches[0].name

key = "#root.targetClass.simpleName+':'+#root.methodName+':'+#param"

如下图所示

SpringBoot @Cacheable自定义KeyGenerator方式是什么

第二种方式:自定义keyGenerator

自定义CacheKeyGenerator 实现KeyGenerator

public class CacheKeyGenerator implements KeyGenerator {        @Override    public Object generate(Object target, Method method, Object... params) {        StringBuilder key = new StringBuilder();        key.append(target.getClass().getSimpleName()).append(":").append(method.getName()).append(":");        if (params.length == 0) {            return key.toString();        }        for (int i = 0; i < params.length; i++) {            Object param = params[i];            if (param == null || param instanceof LogableParam) {                del(key);            } else if (ClassUtils.isPrimitiveArray(param.getClass())) {                int length = Array.getLength(param);                for (int j = 0; j < length; j++) {                    key.append(Array.get(param, j));                    key.append(',');                }            } else if (ClassUtils.isPrimitiveOrWrapper(param.getClass()) || param instanceof String) {                key.append(param);            } else {                key.append(param.toString());            }            key.append('-');        }        del(key);        return key.toString();    }    private StringBuilder del(StringBuilder stringBuilder) {        if (stringBuilder.toString().endsWith("-")) {            stringBuilder.deleteCharAt(stringBuilder.length() - 1);        }        return stringBuilder;    }}

配置xml

<cache:annotation-driven cache-manager="cacheManager" key-generator="cacheKeyGenerator"        proxy-target-class="true" /><bean id="cacheKeyGenerator" class="com.tensoon.util.CacheKeyGenerator"></bean>

配置注解

如下图所示

SpringBoot @Cacheable自定义KeyGenerator方式是什么

到此,关于“SpringBoot @Cacheable自定义KeyGenerator方式是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: SpringBoot @Cacheable自定义KeyGenerator方式是什么

本文链接: https://lsjlt.com/news/302641.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • SpringBoot @Cacheable自定义KeyGenerator方式是什么
    这篇文章主要介绍“SpringBoot @Cacheable自定义KeyGenerator方式是什么”,在日常操作中,相信很多人在SpringBoot @Cacheable自定义KeyGenerator方式是什么问题上存...
    99+
    2023-06-22
  • SpringBoot@Cacheable自定义KeyGenerator方式
    目录@Cacheable自定义KeyGenerator1. 概述2. MySimpleKey 类3. MyKeyGenerator 类4. 配置keyGeneratorSpring-...
    99+
    2024-04-02
  • Android自定义组件:1、什么是自定义组件、自定义组件的方式、定义自定义属性
    声明:本教程不收取任何费用,欢迎转载,尊重作者劳动成果,不得用于商业用途,侵权必究!!! 目录 一、前言 二、什么是自定义组件 三、自定义组件的方式 1、组合现有组件 2、在某...
    99+
    2022-06-06
    属性 自定义属性 Android
  • SpringBoot之自定义Schema扩展方式
    目录SpringBoot 自定义Schema扩展1. 配置ServiceConfig属性2. 编写XSD文件3. 编写NamespaceHandler4. 编写BeanDefinit...
    99+
    2024-04-02
  • springboot自定义filter的步骤是什么
    自定义Filter的步骤如下: 创建一个类并实现javax.servlet.Filter接口。 在类上添加@WebFilter注解...
    99+
    2024-03-13
    springboot
  • vue自定义指令传参方式是什么
    这篇文章主要介绍“vue自定义指令传参方式是什么”,在日常操作中,相信很多人在vue自定义指令传参方式是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue自定义指令传参方式是什么”的疑惑有所帮助!接下来...
    99+
    2023-06-30
  • SpringBoot @JsonDeserialize自定义Json序列化方式
    目录@JsonDeserialize自定义Json序列化1.问题2.现象3.解决办法@JsonSerialize与@JsonDeserialize使用1.以注解方式使用2.自定义实现...
    99+
    2024-04-02
  • SpringBoot自定义动态切换数据源的方法是什么
    本篇内容主要讲解“SpringBoot自定义动态切换数据源的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot自定义动态切换数据源的方法是什么”吧!1、添加maven依...
    99+
    2023-06-21
  • Spring @Cacheable指定失效时间方法是什么
    这篇文章主要介绍“Spring @Cacheable指定失效时间方法是什么”,在日常操作中,相信很多人在Spring @Cacheable指定失效时间方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法...
    99+
    2023-06-22
  • SpringBoot自定义错误页面方式有哪些
    这篇文章主要讲解了“SpringBoot自定义错误页面方式有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot自定义错误页面方式有哪些”吧!以前web.xml方式先来看下...
    99+
    2023-06-21
  • vue3自定义指令方法是什么
    这篇文章主要讲解了“vue3自定义指令方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue3自定义指令方法是什么”吧!一、注册自定义指令以下实例都是实现一个输入框自动获取焦点的自定...
    99+
    2023-06-21
  • android自定义dialog的方法是什么
    Android中自定义Dialog的方法有以下几种:1. 创建一个继承自Dialog类的自定义对话框:- 创建一个新的类,继承自Di...
    99+
    2023-09-21
    android
  • android自定义seekbar的方法是什么
    要自定义SeekBar,你可以使用xml布局文件和自定义的Style来实现。以下是一个简单的示例: 创建一个名为custom_se...
    99+
    2024-04-02
  • SpringBoot怎么自定义Starter
    这篇文章给大家分享的是有关SpringBoot怎么自定义Starter的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。什么是StarterStarter是Spring Boot中的一个非常重要的概念,Starter...
    99+
    2023-06-22
  • pycharm中venv文件夹自定义处理方式是什么
    本篇内容介绍了“pycharm中venv文件夹自定义处理方式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!pycharm每次新建项目都...
    99+
    2023-06-30
  • SpringBoot多种自定义错误页面方式小结
    目录以前web.xml方式SpringBoot中实现方式1.实现EmbeddedServletContainerCustomizer的bean2.通过拦截器方式3.自定义静态erro...
    99+
    2024-04-02
  • SpringBoot读取自定义配置文件方式(properties,yaml)
    目录一、读取系统配置文件application.yaml二、读取自定义配置文件properties格式内容三、读取自定义配置文件yaml格式内容四、其他扩展内容一、读取系统配置文件a...
    99+
    2024-04-02
  • RestTemplate自定义ErrorHandler方式
    目录RestTemplate自定义ErrorHandlerRestTemplate实例三个步骤:SpringBoot 中使用 RestTemplate 自定义 异常处理,捕获最原始的...
    99+
    2024-04-02
  • php定义数组的方式是什么
    这篇文章主要讲解了“php定义数组的方式是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php定义数组的方式是什么”吧!php定义数组有5种方式,分别是:1、使用array创建数组;2、...
    99+
    2023-07-04
  • 定义PHP数组的方式是什么
    这篇文章主要介绍“定义PHP数组的方式是什么”,在日常操作中,相信很多人在定义PHP数组的方式是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”定义PHP数组的方式是什么”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-07-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作