本文介绍: 缓存介绍缓存,在我们日常开发中用的非常多,是我们应对各种性能问题支持并发的一大利器。Spring 从3.1开始就引入缓存支持定义如下两个接口统一支持不同的缓存技术。我们熟知的缓存有:堆缓存(Ehcache3.xCaffeine等)、堆外缓存(Ehcache3.xMapDB等)、分布式缓存RedisMemcached等)等等。@Cacheable@CachePutCache 和 CacheManager 接口说明Cache 接口包含缓存的各种操作集合,你操作缓存就是通过这个接口来操作的。

一、简介

缓存介绍

缓存,在我们的日常开发中用的非常多,是我们应对各种性能问题支持并发的一大利器。

Cache 和 CacheManager 接口说明


二、缓存实战

1.开启缓存

在 SpringBoot启动类上添加注解@EnableCaching

2.@Cacheable

@Cacheable 的作用 主要针对方法配置,能够根据方法请求参数对其结果进行缓存。

常用属性

3.@CachePut

@CachePut 的作用 主要针对配置,能够根据方法请求参数对其结果进行缓存。

@CachePut(cacheNames = "users" , key = "#user.id")
public User addUser(User user) {}
4.@CacheEvict

@CacheEvict 的作用 主要针对方法配置,能够根据一定的条件对缓存进行清空

常用属性

@CacheEvict(cacheNames = "users", key = "#id")
public void delUserCache(Integer id) {}
5.@CacheConfig

@CacheConfig 的作用 主要针对类配置,能够设置当前类中 @Cacheable 的 value 属性默认值。当然如果 @Cacheable 设置value,还是以设置的值为准。

常用属性

6.@Caching

@Caching 的作用 主要针对方法配置,能够组合多个Cache注解比如用户新增成功后,我们可能需要添加 id -> user、username -> user、email -> user 的缓存,此时就需要 @Caching 组合多个注解标签了。

常用属性

@CacheConfig(cacheNames = "users")
public class CacheTestServiceImpl implements CacheTestService {
    /**
     * @Cacheable 的 cacheNames 默认为 "users"
     */
    @Cacheable(key="#id")
    public User getUser(Integer id) {...}
}
7.自定义缓存过期时间

7.1 设置全局默认缓存过期时间

    // 提供默认的cacheManager,应用于全局实现存活2天
    @Bean
    @Primary
    public CacheManager defaultCacheManager(
            RedisTemplate<?, ?> redisTemplate) {
        RedisCacheWriter writer = RedisCacheWriter.lockingRedisCacheWriter(redisTemplate.getConnectionFactory());
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofDays(2));
        return new RedisCacheManager(writer, config);
    }

7.2 定制部分缓存过期时间

	/**
		自定义RedisCacheManager,用于在使用@Cacheable时设置ttl
	 */
	@Bean
	public RedisCacheManager selfCacheManager(RedisTemplate<String, Object> redisTemplate) {
		RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisTemplate.getConnectionFactory());
		RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
				.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer()));
		return new SelfRedisCacheManager(redisCacheWriter, redisCacheConfiguration);
	}

SelfRedisCacheManager.java

public class SelfRedisCacheManager extends RedisCacheManager {
    public SelfRedisCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration) {
        super(cacheWriter, defaultCacheConfiguration);
    }

    @Override
    protected RedisCache createRedisCache(String name, RedisCacheConfiguration cacheConfig) {
        String[] cells = StringUtils.delimitedListToStringArray(name, "=");
        name = cells[0];
        if (cells.length > 1) {
            long ttl = Long.parseLong(cells[1]);
            // 根据传参设置缓存失效时间,默认单位是秒
            cacheConfig = cacheConfig.entryTtl(Duration.ofSeconds(ttl));
        }
        return super.createRedisCache(name, cacheConfig);
    }
}

使用:

// value、cacheNames是等效的,ttl=600s,unless是不缓存的结果(为null时不缓存)
@Cacheable(value = "p_user=600",key = "#menu+'_'+#type+'_'+#userId",cacheManager = "selfCacheManager", unless = "#result == null")
public User getUser(...){
    xxx
}

// 当前方法执行时对应的key失效,也可以用@CachePut在当前方法执行时更新key
@CacheEvict(cacheNames = "p_user",key = "#p.menu+'_'+#p.type+'_'+#p.user")
public boolean setUser(User p){
    xxx
}


三、spEL表达式

spEL表达式

参考地址
1.@Cacheable设置过期时间https://blog.csdn.net/weixin_41860719/article/details/125226096

原文地址:https://blog.csdn.net/fygkchina/article/details/134726030

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_23612.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注