博客緩存的那些事?

一、寫在前面

最近博客的前端展示頁面基本高一段落了,切換一下數據源,看看連接生產的數據試試效果,結果不是很理想,光一個首頁就觸發很多sql語句,為了能夠縮短首頁的加載時間,特做了幾點優化。

1543214753(1)

  • 系統啟動時,加載常用的變量
  • service做了一層通用的緩存攔截控制

二、系統啟動加載緩存

@Component
@Order(1)
public class CacheInit implements CommandLineRunner {
private static final Logger log = LoggerFactory.getLogger(CacheInit.class);
@Autowired
private RedisTemplate<String,Object> redisTemplate;
@Autowired
private WpOptionsService wpOptionsService;
/**
* @param args
* @throws Exception
* @see org.springframework.boot.CommandLineRunner#run(java.lang.String[])
*/
@Override
public void run(String… args) throws Exception {
log.info(“>>>>>>>>>>>>>加載緩存數據開始<<<<<<<<<<<<<<<<<<<<<<“);
Map<String,String> map= new HashMap<String,String>();
List<WpOptions> list =wpOptionsService.autoloadConfig();
for(WpOptions wpOptions:list){
if(!StringUtils.isEmpty(wpOptions.getOptionValue())){
map.put(wpOptions.getOptionName(), wpOptions.getOptionValue());
}
}
log.info(“加載系統配置信息:”+list.size());
redisTemplate.opsForValue().set(RedisConstant.autoloadConfig, map);
//Object test =redisTemplate.opsForValue().get(“test”);
//log.info(“取出緩存數據:”+test.toString());
log.info(“>>>>>>>>>>>>>初始化緩存數據 結束<<<<<<<<<<<<<<<<<<<<<<“);
}

}

三、Service實現通用緩存控制:

大概思路如下:

1.新增一個注解,針對特定的注解進行攔截

2.設置一個通用的key生成算法

3.對緩存進行邏輯的判斷

新增一個注解@RedisCache,對有需要的緩存的方法進行添加設置

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface RedisCache {

/**
* 業務的名稱
*/
String value() default “”;

/**
* redis緩存的Key(默認類名-方法名-自定義key)
*/
String key() default “”;

/**
* 是否刷新緩存,默認false
*/
boolean flush() default false;

/**
* 緩存失效時間,默認30
*/
long expire() default 30L;

/**
* 緩存時間單位,默認天
*/
TimeUnit unit() default TimeUnit.DAYS;
}

攔截代碼

@Pointcut(value = “@annotation(cn.liuhaihua.web.annotation.RedisCache)”)
public void pointcut() {
}

key通用的生成算法

/**
* 獲取切面緩存的key
*
* @param point
* 當前切面執行的方法
* @param extra
* 額外的參數 (非必選)
* @param prefix
* key前綴 (非必選)
* @throws NoSuchMethodException
*/
public static String getKey(ProceedingJoinPoint point, String extra, String prefix) throws NoSuchMethodException {
Method currentMethod = AspectUtil.getMethod(point);
String methodName = currentMethod.getName();
StringBuilder key = new StringBuilder();
key.append(getKeyOfClassPrefix(point, prefix));
key.append(“_”);
key.append(methodName);
key.append(getMethodParamsKey(point.getArgs()));
key.append(null == extra ? “” : extra);
return key.toString();
}

對攔截的方法進行緩存邏輯處理

@Around(“pointcut()”)
public Object handle(ProceedingJoinPoint point) throws Throwable {
Method currentMethod = AspectUtil.getMethod(point);
//獲取操作名稱
RedisCache cache = currentMethod.getAnnotation(RedisCache.class);
boolean flush = cache.flush();
if (flush) {
String classPrefix = AspectUtil.getKeyOfClassPrefix(point, BIZ_CACHE_PREFIX);
log.info(“清空緩存 – {}*”, classPrefix);
redisService.delBatch(classPrefix);
return point.proceed();
}
//通用緩存
String key = AspectUtil.getKey(point, cache.key(), BIZ_CACHE_PREFIX);
log.info(“生成的KEY名字:{}”, key);
boolean hasKey = redisService.hasKey(key);
if (hasKey) {
try {
log.info(“{}從緩存中獲取數據”, key);
return redisService.get(key);
} catch (Exception e) {
log.error(“從緩存中獲取數據失敗!”, e);
}
}
//先執行業務
Object result = point.proceed();
redisService.set(key, result, cache.expire(), cache.unit());
log.info(“{}從數據庫中獲取數據”, key);
return result;
}

 

四、如何使用

代碼如下

@Override
@RedisCache
public List<WpLinks> getLinks(String linkrel) {
if(StringUtils.isEmpty(linkrel) ){
return wpLinksMapper.selectAll();
}else{
Example example = new Example(WpLinks.class);
Criteria criteria = example.createCriteria();
criteria.andEqualTo(“linkRel”, LinkConstant.LINK_REL_FRIEND);
return wpLinksMapper.selectByExample(example);
}
}

效果

INFO | 2018-11-26 14:06:57,264 | JWordpres-v2.0 | [http-nio-8090-exec-1-14] (c.l.w.a.RedisCacheAspect:70) | 生成的KEY名字:biz_cache_cn_liuhaihua_web_service_impl_WpLinksServiceImpl_getLinks(‘friend’)
INFO | 2018-11-26 14:06:57,281 | JWordpres-v2.0 | [http-nio-8090-exec-1-14] (c.l.w.a.RedisCacheAspect:74) | biz_cache_cn_liuhaihua_web_service_impl_WpLinksServiceImpl_getLinks(‘friend’)從緩存中獲取數據

本站部分文章源于互聯網,本著傳播知識、有益學習和研究的目的進行的轉載,為網友免費提供。如有著作權人或出版方提出異議,本站將立即刪除。如果您對文章轉載有任何疑問請告之我們,以便我們及時糾正。

PS:推薦一個微信公眾號: askHarries 或者qq群:474807195,里面會分享一些資深架構師錄制的視頻錄像:有Spring,MyBatis,Netty源碼分析,高并發、高性能、分布式、微服務架構的原理,JVM性能優化這些成為架構師必備的知識體系。還能領取免費的學習資源,目前受益良多

轉載請注明原文出處:Harries Blog? » 博客緩存的那些事?

贊 (1)
分享到:更多 ()

評論 1

  • 昵稱 (必填)
  • 郵箱 (必填)
  • 網址
  1. 高中作文文章不錯回復
2013平特肖公式