注解+AOP实现redis遍历缓存
2024-08-28 02:27:25
1.注解
package com.yun.smart.annotation; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.concurrent.TimeUnit; @Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CacheAnnotation { /**
* 缓存key值
* @return
*/
String key(); /**
* 缓存时长
* @return
*/
long timeToLive(); /**
* 对象类型
* @return
*/
Class<?> clazz(); /**
* 缓存时长单位,默认分
* @return
*/
TimeUnit timeUnit() default TimeUnit.MINUTES; }
2.AOP
package com.yun.smart.aspect; import java.util.concurrent.TimeUnit; import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import com.yun.smart.annotation.CacheAnnotation;
import com.yun.smart.redis.RedisService; @Component
@Aspect
public class CacheAspect { private static Logger LOGGER = LoggerFactory.getLogger(CacheAspect.class); @Autowired
private RedisService redisService; @Around("within(com.yun.smart.cache.service.*) && @annotation(cacheAnnotation)")
public Object doAround(ProceedingJoinPoint pJoinPoint, CacheAnnotation cacheAnnotation) throws Throwable {
String key = cacheAnnotation.key();
TimeUnit timeUnit = cacheAnnotation.timeUnit();
long timeToLive = cacheAnnotation.timeToLive();
Class<?> clazz = cacheAnnotation.clazz(); //获取参数
Object[] args = pJoinPoint.getArgs();
if (args[0] == null) return null; key = key.concat(args[0].toString());
Object obj = redisService.get(key, clazz); if (obj == null) {
Object result = pJoinPoint.proceed();
if (result == null) {
LOGGER.warn("[{}]无命中。", key);
return null;
} redisService.put(key, result, timeToLive, timeUnit);
LOGGER.debug("从数据库命中:{}", result);
return result;
} else {
LOGGER.debug("从缓存命中:{}", obj);
return obj;
} } }
3.使用
/**
* 根据openId查询用户信息
* @param openId
* @return
*/
@CacheAnnotation(key=CacheConstant.USER, clazz=UserInfo.class, timeToLive=24, timeUnit=TimeUnit.HOURS)
public UserInfo getUserInfoById(Long userInfoId) {
return userInfoService.selectById(userInfoId);
}
最新文章
- Vue-router中文教程-Vue-router参考手册.CHM
- SQL语句注入
- HDU 4920 Matrix multiplication 矩阵相乘。稀疏矩阵
- 2016 ACM/ICPC Asia Regional Shenyang Online 1007/HDU 5898 数位dp
- bzoj 1565 最大权闭合子图
- ADO.NET- 基础总结及实例介绍
- Curl之Post Json
- UDID
- 如何修改UITableView每个cell的分隔线和左边的距离?
- Mongodb数据库命令端经常使用操作
- 阿里云ECS每天一件事D9:nginx1.7整合tomcat8.0
- VS EF Error: Configuration Error extension=";.edmx"; type=";System.Data.Entity.Design.AspNet.EntityDesignerBuildProvider";
- openssl命令行-证书认证
- NPOI导Excel样式设置(转)
- 记住这个网站:服务器相关数据统计网站 http://news.netcraft.com/
- magento 1.9 nginx 404
- 游戏编程模式 Game Programming Patterns (Robert Nystrom 著)
- 使用python调用淘宝的ip地址库查询接口结合zabbix判断dnspod域名解析是否正确
- jquery实现拖拽进度条并显示百分比的特效
- 关于shortcut icon和icon
热门文章
- gpcj-07.为什么是连锁零售类公司
- 结合JVM 浅谈Java 类加载器(Day_03)
- 基于 IntersectionObserver 实现一个组件的曝光监控
- 七、.net core(.NET 6)使用Serilog进行配置和实现日志记录
- win7 32位系统 安装node.js最新版本遇到的问题
- 删除本地解压版Mysql
- Go语言的函数03---返回值
- ZooKeeper学习笔记四:使用ZooKeeper实现一个简单的分布式锁
- PaddlePaddle推理部署
- NVIDIA DeepStream 5.0构建智能视频分析应用程序