@Cacheable使用

一、常见使用@Cacheable

自定义生成key

/**
 * 根据方法的参数 生成唯一的缓存Key
 */
@Component
public class SelfKeyGenerate implements KeyGenerator {
	@Override
	public Object generate(Object target, Method method, Object... params) {
		return target.getClass().getSimpleName() + "_"
				+ method.getName() + "_"
				+ StringUtils.arrayToDelimitedString(params, "_");

	}
}

常见使用
结果为空,不加入缓存

@Cacheable(value = "product:list",keyGenerator = "selfKeyGenerate", unless = "#result == null")

二、@Cacheable设置失效时间

package com.framework.cache;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.cache.*;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;

import java.time.Duration;

/**
 * RedisConfigCacheManager
 */
@Slf4j
public class RedisConfigCacheManager extends RedisCacheManager {


	public RedisConfigCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration) {
		super(cacheWriter, defaultCacheConfiguration);
	}

	private static final RedisSerializationContext.SerializationPair<Object> DEFAULT_PAIR = RedisSerializationContext.SerializationPair
			.fromSerializer(new GenericJackson2JsonRedisSerializer());

	private static final CacheKeyPrefix DEFAULT_CACHE_KEY_PREFIX = cacheName -> cacheName+":";

	@Override
	protected RedisCache createRedisCache(String name, RedisCacheConfiguration cacheConfig) {
		final int lastIndexOf = StringUtils.lastIndexOf(name, '#');
		if (lastIndexOf > -1) {
			final String ttl = StringUtils.substring(name, lastIndexOf + 1);
			final Duration duration = Duration.ofSeconds(Long.parseLong(ttl));
			cacheConfig = cacheConfig.entryTtl(duration);
			//修改缓存key和value值的序列化方式
			cacheConfig = cacheConfig.computePrefixWith(DEFAULT_CACHE_KEY_PREFIX)
					.serializeValuesWith(DEFAULT_PAIR);
			final String cacheName = StringUtils.substring(name, 0, lastIndexOf);
			return super.createRedisCache(cacheName, cacheConfig);
		}else{
			//修改缓存key和value值的序列化方式
			cacheConfig = cacheConfig.computePrefixWith(DEFAULT_CACHE_KEY_PREFIX)
					.serializeValuesWith(DEFAULT_PAIR);
			return super.createRedisCache(name, cacheConfig);
		}
	}


}

RedisConfig配置

package com.framework.config;

import com.framework.cache.RedisConfigCacheManager;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheWriter;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.time.Duration;

/**
 * redis配置
 *
 * @author 
 */
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
	@Bean
	@SuppressWarnings(value = {"unchecked", "rawtypes"})
	public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
		RedisTemplate<Object, Object> template = new RedisTemplate<>();
		template.setConnectionFactory(connectionFactory);

		FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class);

		ObjectMapper mapper = new ObjectMapper();
		mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
		mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
		serializer.setObjectMapper(mapper);

		template.setValueSerializer(serializer);
		// 使用StringRedisSerializer来序列化和反序列化redis的key值
		template.setKeySerializer(new StringRedisSerializer());
		template.afterPropertiesSet();
		return template;
	}

	@Bean
	public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {

		ObjectMapper om = new ObjectMapper();
		RedisSerializer<String> redisSerializer = new StringRedisSerializer();
		Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(
				Object.class);
		// 解决查询缓存转换异常的问题
		om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
		om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
		jackson2JsonRedisSerializer.setObjectMapper(om);
		// 配置序列化(解决乱码的问题)
		RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
				.entryTtl(Duration.ofMillis(-1))
				.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
				.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
				.disableCachingNullValues();
		RedisCacheWriter cacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory);

		return new RedisConfigCacheManager(cacheWriter, config);


	}
}

使用

@Cacheable(value = "category:list#3600", keyGenerator = "selfKeyGenerate",unless = "#result == null")
### 回答1: @Cacheable是Spring框架提供的一个注解,用于将对应的方法的返回结果存储在缓存中,以便下次请求时直接从缓存中获取结果,提高系统性能。 使用Redis作为缓存提供商,可以通过配置Redis作为Cache Manager来实现@Cacheable使用Redis。下面是具体的步骤: 1. 引入依赖:在项目的pom.xml文件中添加Spring框架的相关依赖和Redis的客户端依赖,如spring-boot-starter-data-redis等。 2. 配置Redis:在项目的配置文件中设置Redis的连接信息,包括host、port、password等。可以通过application.properties或application.yml文件进行配置。 3. 创建Redis连接工厂:使用Redis连接信息创建一个Redis连接工厂Bean,用于创建Redis连接。 4. 创建Cache Manager:使用Redis连接工厂创建一个Cache Manager Bean,该Cache Manager将使用Redis作为缓存提供商。 5. 配置@Cacheable注解:在需要使用缓存的方法上添加@Cacheable注解,并指定缓存的名称,如@Cacheable(value = "userCache")。该注解还可以指定缓存的key,以便根据不同的参数生成不同的缓存key。 6. 运行项目:启动项目后,当使用@Cacheable注解修饰的方法被调用时,系统会先检查缓存中是否存在对应的结果。如果存在,则从缓存中获取结果并返回;如果不存在,则调用方法,然后将方法的返回结果存储在缓存中,以供后续使用。 通过以上步骤,可以让@Cacheable注解使用Redis作为缓存提供商,提高系统的性能和响应速度。同时,使用Redis作为缓存存储,还可以实现分布式缓存,增加系统的可扩展性和稳定性。 ### 回答2: @Cacheable是Spring框架提供的一个注解,用于为方法添加缓存功能。当方法被调用时,如果缓存中存在相应的缓存结果,则直接从缓存中获取,而不会执行方法。如果缓存中不存在相应的缓存结果,则执行方法,并将方法的返回结果存入缓存中,以备后续使用。 当@Cacheable和Redis结合使用时,可以将返回结果以键值对的形式存储在Redis缓存服务器中。Redis是一种内存数据库,具有快速读写的特点。通过使用Redis作为缓存服务器,可以提高缓存的读写性能。 使用@Cacheable注解时,需配置Redis作为缓存存储的方式。可以通过在Spring的配置文件中指定Redis相关的属性,比如Redis的连接信息、缓存的过期时间等。 在方法被调用时,@Cacheable会先检查Redis中是否存在相应的缓存结果。如果存在,则直接从Redis中读取缓存结果并返回。如果不存在,则执行方法,并将方法的返回结果存储在Redis中,以备后续使用使用Redis作为缓存服务器,可以解决传统基于内存的缓存机制的性能瓶颈问题。由于Redis将缓存数据存储在内存中,读写速度快,能够极大地提高应用程序的性能。 综上所述,通过将@Cacheable与Redis结合使用,可以实现高效的缓存机制,提高系统的响应速度和性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值