@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);
}
}
相关推荐
在Spring框架中,缓存管理是一个重要的特性,它允许我们高效地存储和检索数据,减少对数据库的访问,提高应用程序的性能。`@Cacheable`、`@CacheEvict`和`@CachePut`是Spring Cache注解的核心,用于实现缓存的存取和...
1. **@Cacheable**:这个注解用于标记一个方法,表示其结果应该被缓存。例如: ```java @Cacheable(value = "myCache", key = "#id") public MyObject findById(Long id) { // 查询数据库 } ``` 在上面的...
对象形式是使用对象的某个属性作为缓存的 key,例如 `@Cacheable(value="cacheName", key="#user.id")`,这样可以将对象的 id 属性作为缓存的 key。 自定义形式是使用自定义的 key 生成器,例如 `@Cacheable(value=...
通过集成Ehcache和Redis,我们构建了一个两层缓存系统,其中Ehcache作为本地缓存,而Redis则作为分布式缓存。 一级缓存Ehcache是内存中的缓存,响应速度快,但存储容量有限。在Spring Boot项目中,我们需要引入...
Ehcache是一个流行的Java缓存库,常用于提高应用程序的性能和效率,通过存储经常访问的数据来减少数据库的负载。在Spring框架中整合Ehcache,可以实现页面和对象级别的缓存管理,从而优化Web应用的响应速度。下面将...
在Java开发中,Hibernate是一个非常流行的对象关系映射(ORM)框架,它简化了数据库操作,将Java对象与数据库表之间的映射关系自动化处理。在实际项目中,我们常常会遇到实体类之间的一对一关联关系。本篇文章将深入...
* 此方法将会根据类名+方法名+所有参数的值生成唯一的一个 key,即使@Cacheable中的value属性一样,key也会不一样。 */ @Override public KeyGenerator keyGenerator() { System.out.println("RedisCacheConfig...
Ehcache基于Key-Value的数据结构,当一个对象被缓存时,会通过Key进行唯一标识。Ehcache内部采用分段(Segment)技术,每个段独立负责一部分Key的存储。当请求到来时,Ehcache会先在内存中查找,如果找不到,则会...
Spring Boot是Spring框架的一个简化版,提供了一种快速构建Spring应用的方式,而Maven则是Java项目管理工具,负责依赖管理和构建流程。在"Redis入门基础篇+源码(springboot、maven)"中,我们将探讨如何在Spring ...
Hibernate 是一个流行的开源对象关系映射(ORM)框架,它为 Java 开发人员提供了在关系数据库上操作对象的便捷方式。此中文帮助文档旨在帮助开发者更深入地理解 Hibernate 的核心概念、API 使用以及最佳实践。 ## ...
SpringCache是Spring框架提供的一个轻量级的缓存抽象层,它允许开发者通过简单的注解方式在应用程序中引入缓存功能,支持多种缓存实现,包括 Ehcache、Hazelcast 和 Redis 等。 二、Redis介绍 Redis 是一个高性能的...
- **问题分析**: 在这个例子中,每一个ID都会触发一次`@Cacheable`注解的方法调用。这意味着即使是同一个方法,也会被多次执行,导致不必要的性能开销。尤其是当缓存未命中时,每次查询都需要访问后端数据库,增加...
在上述代码中,`@Cacheable`注解使得我们每次请求同一个用户ID时,不会重复执行数据库查询。`@CacheEvict`和`@CachePut`则确保了删除和更新用户后,缓存中的信息能及时同步。 总结来说,通过Spring与Redis的整合,...
Redis是一个高性能的键值数据库,而Spring则是一个广泛使用的Java企业级应用开发框架。当我们谈论"redis集成spring实现aop"时,我们指的是如何将Redis缓存系统与Spring框架结合,并利用Spring的面向切面编程(AOP)...
例如,`#root`代表根对象,`#root.methodName`是被调用的方法名,`#root.args[0]`是第一个参数,`#result`则是方法的返回值。 总的来说,Spring Boot通过其高级缓存功能,使得开发者能够轻松地管理和控制应用程序的...
- 配置Spring:在Spring配置文件中声明一个`CacheManager`,并指定使用Memcached作为缓存提供者。 - 连接Memcached服务器:配置Memcached服务器的连接信息,包括地址和端口。 - 配置缓存:定义要使用的缓存名称,...
然后,创建一个SpringBoot的配置类,以便初始化Ignite实例并将其注入到Spring容器中: ```java @Configuration public class IgniteConfig { @Bean(destroyMethod = "close") public Ignite ignite() throws ...
2. **开箱即用**:Spring Cache 提供了一个简单的内存缓存实现,不需要额外安装或部署第三方缓存组件。这对于开发环境或测试环境来说非常方便,但在生产环境中,通常会与 EhCache、Redis 等专业缓存解决方案集成以...
例如,你可以创建一个自定义的`MethodInterceptor`实现,使用`@Cacheable`或`@CacheEvict`等Spring的缓存注解来标记方法。这些注解允许我们在方法执行前后自动进行缓存操作。 例如,一个简单的`@Cacheable`注解用法...
使用前缀时,Redis 将使用缓存名称作为前缀,并以冒号分隔,这种做法更安全,尤其是在缓存数据量非常大的情况下。 - **禁用 clear() 方法**: 当缓存中存储大量数据时,应避免使用 `clear()` 方法,因为它会尝试使用 ...