Можно сказать, что кэширование является очень эффективным и простым способом ускорения ответа на обслуживание. В области кэширования существует много известных структур, таких как Ehcache, Guava, Hazelcast и т. Д. В качестве базы данных ключевых значений Redis также стал популярным инструментом кэширования данных из-за своей функции.
Традиционно, код обработки кэша очень раздут.
Например: нам нужно добавить функцию запроса в функцию кэша, которая требует примерно трех шагов.
1. Прежде чем выполнять функцию, нам нужно проверить, есть ли данные в кэше. Если он существует, верните кэшированные данные.
2. Если его не существует, его необходимо запрашивать в данных базы данных.
3. Наконец, сохраните данные в кеше. Когда эта функция будет вызвана в следующий раз, вы можете использовать кэшированные данные непосредственно для снижения давления на базу данных.
Итак, сколько кода требуется для реализации приведенных выше трех шагов? Вот пример:
Красная часть на рисунке выше - это все шаблон, но код, который действительно связан с этой функцией, учитывает только 1/5. Для всех функций, которые необходимы для реализации функций кэша, требуется раздутый код шаблона. Это чрезвычайно неотъемлемое решение.
Итак, как мы можем вернуть раздутый код в самое свежее время?
Разве AOP не является лучшим решением этого кода в стиле шаблона? К счастью, нам больше не нужно реализовать разделы сами. SpringCache предоставил нам хороший раздел. Нам нужно только сделать простые конфигурации, чтобы вернуться к исходной, например, следующее:
Вам нужно только добавить аннотацию. Вам даже не нужно менять исходный код. Вы хотите попробовать?
Есть только три шага для настройки SpringCache:
Шаг 1: Добавьте соответствующие зависимости:
<depervice> <groupid> redis.clients </GroupId> <ArtifactId> jedis </artifactid> <serse> 2.9.0 </version> </depervice> <dependency> <groupid> org.springframework.data </GroupId> <strifactid> spring-data-redis </artifactid> <serse> 1,6. <Depective> <groupid> org.apache.commons </GroupId> <artifactid> commons-lang3 </artifactid> <sersive> 3.3.2 </version> </gethyseriation>
Шаг 2: Настройте SpringCache, Redis Connection и другую информацию
ApplicationContext-redis.xml
<? xml version = "1.0" Encoding = "UTF-8"?> <Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns: p = "http://www.springframework.org/schema/p" xmlns: context = "http://www.springframework.org/schema/mvc" xmlns: cache = "http://www.springframe.orns." xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.spramework.org/schema/context http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd http://www.spramework.org/schema/cache http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-4.2.xsd "> <!-Загрузка файла конфигурации-> <context: placeholder =" classpath:*. cache-manager = "cachemanager" /> <!-Redis Connection Pool-> <bean id = "boolconfig"> <name = "maxidle" value = "$ {redis.maxidle}" /> <name = "maxwaitmillis" value = "$ {redis.maxwait}" /> <name = "testonborrok" value = "$ {redis.testonbourrow}"/> </bean> <!-Фабрика соединения-> <bean id = "jedisconnectionfactory" p: host-name = "$ {redis.host}" P: port = "$ {redis.port}" p: password = "$ {redis.pass}" p: pool-config-ref} "p: password =" $ {redis.pass} "? Шаблон-> <bean id = "redistemplate"> <property name = "connectionFactory" ref = "jedisconnectionFactory" /> < /bean> <bean id = "cachemanager"> <name = "caches"> <set> <!-Вы можете настроить несколько Redis здесь-> <bean> <propate name = "redistemplate" ref = "redisteptate" /> name <bean> <property = "redisteplate" ref = " /" /" /" /" /" /" /". value = "content"/> <!-Имя, соответствующее имени, следует использовать в аннотации класса или метода-> </bean> </set> </property> </bean> </beans>redis.properties файл:
# Redis settings # server ip redis.host = 192.168.100.55 # порт сервера redis.port = 6379 # server pass redis.pass = # используйте dbindex redis.database = 0 #max idel экземпляр jedisredis.maxidle = 300 # if wat Long, jediscenexceptionexception.maxwait = 300 Пример, то, что вы получаете экземпляр, все полезно.
Третий шаг - написать класс реализации интерфейса кэша
Весна предоставляет только абстрактный интерфейс для кеша и функции вызовов через интерфейсы. Там нет конкретного класса реализации, поэтому нам нужно сами внедрить конкретные операции.
В приведенной выше конфигурации мы видим, что каждый класс реализации внедрит экземпляр Redistemplate, и мы можем управлять Redis через Redistemplate
пакет com.cky.rest.utils; import java.io.serializable; импорт org.apache.commons.lang3.serializationutils; импорт org.springframework.cache.cache; импорт org.springframework.cache.support.simplevaluewrapper; org.springframework.data.redis.connection.redisconnection; import org.springframework.data.redis.core.rediscallback; импорт org.springframework.data.redis.core.redistemplate; Public Class Rediscache Imprames {Private Redistemptate <string, объект> redistemptrate; Приватное название строки; @Override public void clear () {System.out.println ("---------------"); redistemplate.execute (new resiscallback <string> () {@Override public String doInredis (Redisconnection Connection) Throws DataCcessException {connection.flushdb (); return "ok";}}); } @Override public void evict (object Key) {System.out.println ("-----------------"); final String keyf = key.toString (); redistemplate.execute (new resiscallback <long> () {@override public long doinredis (redisconnection connection) throws DataCcessException {return connection.del (keyf.getbytes ());}}); } @Override public valueWrapper get (Object Key) {System.out.println ("-----------------------"+key.tostring ()); final String keyf = key.toString (); Объект объекта = null; object = redistemplate.execute (new resiscallback <object> () {@Override public Object doInredis (redisconnection connection) Throws DataCcessException {byte [] key = keyf.getbytes (); byte [] value = connection.get (key); if (value = null) {System.out.out.println ("-----------------"); Serializationutils.deserialize (value); Valuewrapper obj = (Object! = Null? New SimpleValueWrapper (Object): null); System.out.println ("-------------------------------------"+obj); вернуть OBJ; } @Override public void put (ключ объекта, значение объекта) {System.out.println ("-----------------------"); System.out.println ("key ----:"+key); System.out.println ("key ----:"+value); final String Keystring = key.toString (); окончательное значение объекта = значение; окончательный длинный ливт = 86400; redistemplate.execute (new resiscallback <long> () {@override public doinredis (redisconnection connection) throws DataCcessException {byte [] keyb = keystring.getbytes (); byte [] valueb = serializationUtils.serialize ((serializeable); connection.expire (keyb, livetime); } @Override public <t> t get (Object arg0, class <t> arg1) {// todo Автогенерированный метод заглушка return null; } @Override public String getName () {return this.name; } @Override public Object getNativeCache () {return this.redistemplate; } @Override public valueWrapper putifabsent (Object arg0, Object arg1) {// todo Автогенерированный метод заглушка return null; } public redistemplate <String, Object> getRedistemplate () {return redistemplate; } public void setredistemplate (Redistemplate <String, Object> Redistemplate) {this.redistemplate = redistemplate; } public void setName (string name) {this.name = name; }}В процессе конфигурации было две ошибки:
1.xxxx.classnotfoundexception Наконец, я обнаружил, что загрузка JAR неполна. Просто удалите соответствующую папку пакета JAR в локальном репозитории Maven и загрузите ее снова.
2.xxxx.methodnotfoundexception Эта ситуация - неправильная версия, просто измените версию на первом шаге.
Использование общих аннотаций в SpringCache:
@Cachable Annotation
Наиболее часто используемая аннотация будет кэшировать возвратное значение аннотированного метода. Как это работает: сначала посмотрите в кэше, если метод не выполняется, и результат кэшируется, а затем данные возвращаются. Имя кэша этой аннотации должно быть указано и соответствует значению имени кэша в кэшах в Cachemanager. Может быть указан с использованием значения или кахенанов.
Если атрибут ключа не указан, Spring будет использовать генератор первичных ключей по умолчанию для генерации первичных клавиш. Вы также можете настроить первичный ключ, и в ключе можно использовать выражения SPEL. следующее:
@Cachable (cachenames = ”content», key = ”#user.userid») public user getUser (пользователь пользователя) {xxxxx}Вы можете использовать атрибут условия для добавления условий в кэш, следующим образом:
@Cachable (cachenames = ”content”, key = ”#user.userid», condition = ”#user.age <40”) public user getUser (пользователь пользователя) {xxxxx}@Cacheput аннотация
Сначала выполните метод, а затем поместите возвратное значение обратно в кэш. Можно использовать в качестве кэшированных обновлений.
@Cacheevict аннотация
Эта аннотация отвечает за явное удаление данных из кэша. Обычно кэшированные данные имеют дату истечения срока действия, и данные также будут удалены, когда они истекают.
Эта аннотация имеет два дополнительных атрибута:
Удаляет ли Allentries все записи кэша.
Перед включением: заполните операцию удаления до или после вызова метода. Верно/Неверно
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.