Основным исследованием в этой статье является использование Spring's Interceptor для пользовательской реализации кэша, а конкретный код реализации заключается в следующем.
Memcached-это высокопроизводительная система кэширования объекта для распределенной памяти для динамических веб-приложений для снижения нагрузки базы данных. Это уменьшает количество раз, когда база данных читается кэшированными данными и объектами в памяти, тем самым увеличивая скорость динамических сайтов, управляемых базой данных. В этой статье используются мемкахедные экземпляры и пружинный перехватчик для реализации настройки кэша. Используйте перехватчик, чтобы прочитать пользовательские теги кэша и стратегию генерации значений ключей.
Пакет com.jeex.sci; @Target (elementType.method) @retention (artententypolicy.runtime) @inherited @documented public @Interface cachable {String namepace (); String Key () default ""; int [] keyArgs () default {}; string [] keyproperties () defroperties () defroperties {{) defegator {) defegator {) defegator {) defegator {) defegator {) string wault {) string wault {); истекает () по умолчанию 1800;} Пакет com.jeex.sci; @Target (elementType.method) @retention (streationpolicy.runtime) @inherited @documented public @Interface cacheevict {string namepace (); string key () default ""; int [] keachArgs () default {}; string keyproperties () defferge {) deforerer {) deforerer {) deforerer {); "";} public Object invoke (MethodInvocation Invoction) Throws Throwable {Method Method = voction.getMethod (); Cachable C = Method.getAnnotation (cachable.class); if (c! = null) {return handlecachable (vdoction, method, c);} cacheevict ce = method.getannotation (cacheevict. handlecacheevict (indoction, ce);} return incection.proceed ();} Приватный объект Handlecache (MethodInvocation Invoction, метод метода, Cachable C) Throws Throwable {String Key = getKey (vloction, keyInfo.fromcachable (c)); if (key.equals ("")) {if (log.isdebugenabled ()) {log.warn ("Пустое ключ Cache, метод" + метод); nstag = (long) memcachedget (c.namespace ()); if (nstag == null) {nstag = long.valueof (system.currenttimemillis ()); memcachedset (c.namespace (), 24*3600, long.valueof (nstag); ключ); объект o = null; o = memcachedget (key); if (o! = null) {if (log.isdebugenabled ()) {log.debug ("cache hit: cache =" + key);}} else {if (log.isdebugenabled ()) {log.debug ("c ce key key) invoction.proceedceed (); memcachedset (key, c.expires (), o);} return o;} Частный объект handlecacheevict (вывод метода, Cacheevict ce) бросает throwable {String key = getKey (voldoction, keyInfo.fromcacheevict (ce)); if (key.equals ("")) {if (log.isdebugenabled ()) {log.debug ("evicting" + ce.namespace ()); } memcacheddelete (ce.namespace ()); } else {long nstag = (long) memcachedget (ce.namespace ()); if (nstag! = null) {key = makemcachedkey (ce.namespace (), nstag, key); if (log.isdebugenabled ()) {log.debug ("Выселение" + Key); } memcacheddelete (key); }} return incection.proecd (); } // Использование параметров, перехваченных с методом для генерации параметров частной строки getKeyWithargs (object [] args, int [] argindex) {stringBuilder Key = new StringBuilder (); Boolean First = true; for (int index: argindex) {if (index <0 || index> = args.length) {выбрасывает новый allosalargumentException ("index out из границы"); } if (! First) {key.append (':'); } else {first = false; } key = key.append (args [index]); } return key.toString (); } Private String getKeyWithProperties (Object O, String PORPS []) Throws Exception {stringBuilder Key = new StringBuilder (); Boolean First = true; for (string prop: props) {// преобразовать свойство бобов в имя метода метода string methodname = "get" + prop.substring (0, 1) .touppercase () + prop.substring (1); Метод m = o.getClass (). GetMethod (MethodName); Объект r = m.invoke (o, (объект []) null); if (! First) {key.append (':'); } else {first = false; } key = key.append (r); } return key.toString (); } // Использование генератора для генерации ключа частной строки getKeyWithGenerator (MethodInvocation впрыскивание, строка Keygenerator) Throws Exception {class <?> Ckg = class.forname (keygenerator); Cachekeygenerator ikg = (cachekeygenerator) ckg.newinstance (); вернуть ikg.generate (vloction.getArguments ()); } Private Static Class KeyInfo {String Key; int [] keyArgs; String keyProperties []; String Keygenerator; Static KeyInfo fromCachable (Cachable c) {keyInfo ki = new KeyInfo (); ki.key = c.key (); ki.keyargs = C.keyArgs (); c.keygenerator (); ki.keyproperties = c.keyproperties (); return ki;} static keyinfo fromcacheevict (cacheevict ce) {keyinfo ki = new Keyinfo (); ki.key = ce.key (); ki.keyargs = ce.keyargs (); ce.keygenerator (); ki.keyproperties = ce.keyproperties (); return ki;} string key () {return key;} int [] keyArgs () {return keyArgs;} string [] keyProperties () {return keyProperties;} string keygener () {return keygener; // Установить клавишу с параметрами @Cachable (namespace = "BlackList", KeyArgs = {0, 1}) public int intemethond (int a, int b) {return 100; } Пакет com.jeex.sci.test; import net.spy.memcached.memcachedclient; import org.junit.test; import org.springframework.context.applicationContext; import org.springframework.context.support.filesyStemxMlextCplicationContextcom Throws urrouptedException {ApplicationContext ctx = new FileSystemxMlapplicationContext ("/src/test/resources/beans.xml"); memcachedclient mc = (memcachedclient) ctx.getbean ("memcachedclient"); BlackListdaImplient dao = (BlackListdaoImpl) ctx.getbean ("BlackListDaoImpl"); while (true) {System.out.println("############################################################################## НЕОБХОДИМО НЕОБХОДИМО ##### Знил главянком #####леднуть N########лед Знил ##лед N##лед Знил. START##################################");mc.flush();BlackListQuery query = new BlackListQuery(1, "222.231.23.13");dao.searchBlackListCount(query);dao.searchBlackListCount2(query);BlackListQuery query2 = new BlackListQuery (1, "123.231.23.14"); Dao.AnotherMethond (333, 444); dao.searchblacklistcount2 (Query2); dao.searchblacklistcount3 (Query2); dao.evict (Query); dao.searchblacklistcount2 (Query); dao.evictall (); dao.searchblacklistcount3 (Query2); Thread.sele (300);Выше приведено все содержание этой статьи о примере примера реализации для пользовательского кэша с использованием перехватчика Spring, и я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!