`

cacheable 将一个对象作为key

阅读更多

@Cacheable(value = {"userLogs"}, keyGenerator = "cacheKeyGenerator" )

 

 

 

package com.opencloud.common.configuration;

 

import lombok.extern.slf4j.Slf4j;

import org.springframework.cache.interceptor.KeyGenerator;

import org.springframework.cache.interceptor.SimpleKey;

import org.springframework.stereotype.Component;

 

import java.lang.reflect.Field;

import java.lang.reflect.Method;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.List;

 

// 缓存key 生成器

@Slf4j

@Component

public class CacheKeyGenerator implements KeyGenerator {

 

    @Override

    public Object generate(Object target, Method method, Object... params) {

        if(params.length == 0){

            return SimpleKey.EMPTY;

        }

        StringBuilder key = new StringBuilder();

        for (Object param : params) {

            //此处处理的是一个对象 如果是Map需自行验证是否可行

            Field[] fields = getAllFields(param.getClass());

            for(Field field:fields) {

                //抑制Java对修饰符的检查

                field.setAccessible(true);

                try {

//                    log.info("fieldName:{} fieldVuale:{}",field.getName(),field.get(param));

                    key.append(field.getName()+"="+field.get(param)+" , ");

                } catch (IllegalAccessException e) {

                    e.printStackTrace();

                }

 

            }

        }

        return key;

    }

 

    /**

     * 获取本类以及父类的属性方法

     * @param clazz 当前类对象

     * @return 字段数组

     */

    private static Field[] getAllFields(Class<?> clazz){

        List<Field> fieldList = new ArrayList<>();

        while (clazz != null){

            fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));

            clazz = clazz.getSuperclass();

        }

        Field[] fields = new Field[fieldList.size()];

        return fieldList.toArray(fields);

    }

 

  

}

0
1
分享到:
评论

相关推荐

    3.2、接3.1自定义缓存策略以及删除缓存Cacheable 参数1

    在Spring框架中,缓存管理是一个重要的特性,它允许我们高效地存储和检索数据,减少对数据库的访问,提高应用程序的性能。`@Cacheable`、`@CacheEvict`和`@CachePut`是Spring Cache注解的核心,用于实现缓存的存取和...

    spring-cache(通过key值更新缓存)

    1. **@Cacheable**:这个注解用于标记一个方法,表示其结果应该被缓存。例如: ```java @Cacheable(value = "myCache", key = "#id") public MyObject findById(Long id) { // 查询数据库 } ``` 在上面的...

    Java Spring-Cache key配置注意事项介绍

    对象形式是使用对象的某个属性作为缓存的 key,例如 `@Cacheable(value="cacheName", key="#user.id")`,这样可以将对象的 id 属性作为缓存的 key。 自定义形式是使用自定义的 key 生成器,例如 `@Cacheable(value=...

    springboot1.x基于spring注解实现J2Cache两级缓存集成

    通过集成Ehcache和Redis,我们构建了一个两层缓存系统,其中Ehcache作为本地缓存,而Redis则作为分布式缓存。 一级缓存Ehcache是内存中的缓存,响应速度快,但存储容量有限。在Spring Boot项目中,我们需要引入...

    Ehcache整合Spring使用页面、对象缓存

    Ehcache是一个流行的Java缓存库,常用于提高应用程序的性能和效率,通过存储经常访问的数据来减少数据库的负载。在Spring框架中整合Ehcache,可以实现页面和对象级别的缓存管理,从而优化Web应用的响应速度。下面将...

    hibernate一对一

    在Java开发中,Hibernate是一个非常流行的对象关系映射(ORM)框架,它简化了数据库操作,将Java对象与数据库表之间的映射关系自动化处理。在实际项目中,我们常常会遇到实体类之间的一对一关联关系。本篇文章将深入...

    springBoot集成redis的key,value序列化的相关问题

    * 此方法将会根据类名+方法名+所有参数的值生成唯一的一个 key,即使@Cacheable中的value属性一样,key也会不一样。 */ @Override public KeyGenerator keyGenerator() { System.out.println("RedisCacheConfig...

    项目优化之Ehcache页面缓存

    Ehcache基于Key-Value的数据结构,当一个对象被缓存时,会通过Key进行唯一标识。Ehcache内部采用分段(Segment)技术,每个段独立负责一部分Key的存储。当请求到来时,Ehcache会先在内存中查找,如果找不到,则会...

    Redis入门基础篇+源码(springboot、maven)

    Spring Boot是Spring框架的一个简化版,提供了一种快速构建Spring应用的方式,而Maven则是Java项目管理工具,负责依赖管理和构建流程。在"Redis入门基础篇+源码(springboot、maven)"中,我们将探讨如何在Spring ...

    hibernate 中文帮助文档

    Hibernate 是一个流行的开源对象关系映射(ORM)框架,它为 Java 开发人员提供了在关系数据库上操作对象的便捷方式。此中文帮助文档旨在帮助开发者更深入地理解 Hibernate 的核心概念、API 使用以及最佳实践。 ## ...

    redis-string-springcache.zip

    SpringCache是Spring框架提供的一个轻量级的缓存抽象层,它允许开发者通过简单的注解方式在应用程序中引入缓存功能,支持多种缓存实现,包括 Ehcache、Hazelcast 和 Redis 等。 二、Redis介绍 Redis 是一个高性能的...

    SpringCache缺陷,我好像有解决方案了.docx

    - **问题分析**: 在这个例子中,每一个ID都会触发一次`@Cacheable`注解的方法调用。这意味着即使是同一个方法,也会被多次执行,导致不必要的性能开销。尤其是当缓存未命中时,每次查询都需要访问后端数据库,增加...

    spring整合redis做缓存用注解实现的完整例子

    在上述代码中,`@Cacheable`注解使得我们每次请求同一个用户ID时,不会重复执行数据库查询。`@CacheEvict`和`@CachePut`则确保了删除和更新用户后,缓存中的信息能及时同步。 总结来说,通过Spring与Redis的整合,...

    redis集成spring实现aop.zip

    Redis是一个高性能的键值数据库,而Spring则是一个广泛使用的Java企业级应用开发框架。当我们谈论"redis集成spring实现aop"时,我们指的是如何将Redis缓存系统与Spring框架结合,并利用Spring的面向切面编程(AOP)...

    SpringBoot高级1

    例如,`#root`代表根对象,`#root.methodName`是被调用的方法名,`#root.args[0]`是第一个参数,`#result`则是方法的返回值。 总的来说,Spring Boot通过其高级缓存功能,使得开发者能够轻松地管理和控制应用程序的...

    Spring整合memcached完整项目代码

    - 配置Spring:在Spring配置文件中声明一个`CacheManager`,并指定使用Memcached作为缓存提供者。 - 连接Memcached服务器:配置Memcached服务器的连接信息,包括地址和端口。 - 配置缓存:定义要使用的缓存名称,...

    springboot 2.4.4 集成ignite

    然后,创建一个SpringBoot的配置类,以便初始化Ignite实例并将其注入到Spring容器中: ```java @Configuration public class IgniteConfig { @Bean(destroyMethod = "close") public Ignite ignite() throws ...

    点智数码--注释驱动的-Spring-cache-缓存的介绍.doc

    2. **开箱即用**:Spring Cache 提供了一个简单的内存缓存实现,不需要额外安装或部署第三方缓存组件。这对于开发环境或测试环境来说非常方便,但在生产环境中,通常会与 EhCache、Redis 等专业缓存解决方案集成以...

    EHCache 实例

    例如,你可以创建一个自定义的`MethodInterceptor`实现,使用`@Cacheable`或`@CacheEvict`等Spring的缓存注解来标记方法。这些注解允许我们在方法执行前后自动进行缓存操作。 例如,一个简单的`@Cacheable`注解用法...

    Springboot整合redis使用技巧.docx

    使用前缀时,Redis 将使用缓存名称作为前缀,并以冒号分隔,这种做法更安全,尤其是在缓存数据量非常大的情况下。 - **禁用 clear() 方法**: 当缓存中存储大量数据时,应避免使用 `clear()` 方法,因为它会尝试使用 ...

Global site tag (gtag.js) - Google Analytics