基於註解的方法快取

2021-09-12 17:22:02 字數 2212 閱讀 1176

在大資料專案中, 查詢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...