文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Springboot 自定义注解实现 Redis 秒级缓存

2024-11-29 18:36

关注

1. 创建自定义注解

首先,创建一个自定义注解,用于标记需要被缓存的方法,并指定缓存的有效时间。

import org.springframework.cache.Cache.ValueWrapper;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.core.annotation.AliasFor;


import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Cacheable(value = "secondLevelCache", key = "#root.methodName")
public @interface SecondLevelCacheable {
    @AliasFor(annotation = Cacheable.class, attribute = "value")
    String cacheName() default "secondLevelCache";


    @AliasFor(annotation = Cacheable.class, attribute = "key")
    String key() default "#root.methodName";


    
    int expireInSeconds() default 60;
}

这里我们定义了一个名为SecondLevelCacheable的注解,并使用@Cacheable作为元注解。cacheName属性指定了缓存的名字,默认为secondLevelCache;key属性定义了缓存的键,默认使用方法名作为键;expireInSeconds属性定义了缓存的有效时间(秒)。

2. 配置Spring Cache

确保Spring Boot项目已经配置了Spring Cache,并且启用了Redis作为缓存存储。

application.properties

spring.cache.type=redis
spring.redis.host=localhost
spring.redis.port=6379
spring:
  cache:
    type: redis
  redis:
    host: localhost
    port: 6379

3. 实现自定义注解处理器

接下来,实现一个AOP切面来处理这个自定义注解。这涉及到使用Spring AOP来拦截带有SecondLevelCacheable注解的方法调用。

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Component;


@Aspect
@Component
public class SecondLevelCacheAspect {


    @Autowired
    private CacheManager cacheManager;


    @Around("@annotation(secondLevelCacheable)")
    public Object handleSecondLevelCacheable(ProceedingJoinPoint joinPoint, SecondLevelCacheable secondLevelCacheable) throws Throwable {
        String cacheName = secondLevelCacheable.cacheName();
        String cacheKey = generateCacheKey(joinPoint, secondLevelCacheable.key());


        // Check if the result is in cache
        Cache cache = cacheManager.getCache(cacheName);
        ValueWrapper valueWrapper = cache.get(cacheKey);
        if (valueWrapper != null) {
            return valueWrapper.get();
        }


        // Not in cache, proceed with method execution
        Object result = joinPoint.proceed();


        // Put result into cache with expiration time
        cache.put(cacheKey, result, secondLevelCacheable.expireInSeconds(), java.util.concurrent.TimeUnit.SECONDS);
        return result;
    }


    private String generateCacheKey(ProceedingJoinPoint joinPoint, String keyExpression) {
        StringBuilder keyBuilder = new StringBuilder(keyExpression);
        for (Object arg : joinPoint.getArgs()) {
            keyBuilder.append(":").append(arg.toString());
        }
        return keyBuilder.toString();
    }
}

在这个例子中,我们定义了一个切面SecondLevelCacheAspect,它包含一个环绕通知handleSecondLevelCacheable,该通知处理所有带有SecondLevelCacheable注解的方法调用。它首先检查缓存中是否存在结果,如果存在则直接返回;否则执行方法并将结果存储到缓存中,并设置过期时间为expireInSeconds秒。

4. 应用自定义注解

现在你可以在任何需要缓存结果的方法上应用SecondLevelCacheable注解了。

public class SomeService {


    @SecondLevelCacheable(expireInSeconds = 30)
    public Object someMethod(Object... args) {
        // 方法逻辑
    }
}

这样,每次调用someMethod时,都会根据定义的时间检查缓存并决定是否从缓存中获取数据或执行实际的方法逻辑。

以上步骤展示了如何使用自定义注解和AOP来实现Spring Boot中的秒级Redis缓存功能。可以根据具体需求调整注解参数和AOP逻辑。

来源:java知路内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯