在大資料專案中, 查詢impala或hive非常耗時耗資源, 所以, 對於同一方法相同引數的請求, 應該儲存到快取中, 而不是每次都去查資料庫, 方法的返回值可以儲存到mongodb或redis中
具體實現:
@methodcache註解
@retention(retentionpolicy.runtime)
@target(elementtype.method)
public @inte***ce methodcache
methodcacheaspect切面
該切面的核心思想就是用方法的簽名+實參物件的雜湊值作為key, 先從快取中取, 取不到再呼叫具體方法去查詢, 查詢結果後儲存到快取中, 其中可以設定一次只能有乙個執行緒去查, 還可以設定重試次數, 還可以設定是否儲存空結果
@aspect
@order(value = 2)
@component
public class methodcacheaspect
key += hashalgorithms.mixhash(json.tojsonstring(list));
object deserialize = trygetfromcache(key);
if (deserialize != null)
return deserialize;
} object proceed;
string mutexkey = "mutex_" + key;
if (methodcache.limitquery())
if (lock)
try (jedis jedis = jedispool.getresource())
} else ", mutexkey);
throw new customexception(errorcodeenum.duplicate_request.getmessage());
}} else
return proceed;
} /**
* 執行具體的方法
* * @param proceedingjoinpoint 切面
* @return object
* @throws throwable 異常
*/private object executeconcretemethod(proceedingjoinpoint proceedingjoinpoint, string mutexkey) throws throwable finally
return proceed;
} /**
* 嘗試從快取中獲取
* * @param key key
* @return object
*/private object trygetfromcache(string key)
resultbytes = jedis.get(key.getbytes());
} if (resultbytes != null) 獲取到快取", key);
return kryoutil.readfrombytearray(resultbytes);
} return null;
} /**
* 解析請求引數
* * @param proceedingjoinpoint 切面
* @param size 引數個數
* 生成方法簽名
* * @param method 方法
* @return string
*/private string getsignature(method method)
return sb.tostring();
}}
專案已經上傳到gitee和github
gitee:
github:
Spring快取註解
快取註解有以下三個 cacheable cacheevict cacheput 1 cacheable value accountcache 這個注釋的意思是,當呼叫這個方法的時候,會從乙個名叫 accountcache 的快取中查詢,如果沒有,則執行實際的方法 即查詢資料庫 並將執行的結果存入快取...
springboot快取註解
enablecaching 開關性註解,在專案啟動類或某個配置類上使用此註解後,則表示允許使用註解的方式進行快取操作 cacheable 可用於類或方法上 在目標方法執行前,會根據key先去快取中查詢看是否有資料,有就直接返回快取中的key對應的value值。不再執行目標方法 無則執行目標方法,並將...
Redis快取註解
匯入依賴 com.fasterxml.jackson.coregroupid jackson databindartifactid 2.11.2version dependency org.springframework.bootgroupid spring boot starter data re...