Глава 1 Анализ требований
Планируется добавить Redis для реализации обработки кэша в проекте команды с открытым исходным кодом. Поскольку бизнес-функции были реализованы частично, написав классы инструментов Redis, а затем ссылаясь на них, количество изменений велика, а развязка не может быть достигнута, поэтому я подумал о AOP (разделение-ориентированное программирование) пружинной структуры.
Проект с открытым исходным кодом: https://github.com/u014427391/jeepatform
Глава 2 Введение в Springboot
В качестве важной структуры с открытым исходным кодом в области Javaee Framework, Spring Framework играет важную роль в разработке корпоративных приложений. В то же время, Spring Framework и его подфрам много, поэтому количество знаний очень широкое.
Springboot: подраздел Spring Framework, также называемый MicroFramework, представляет собой фреймворк, запущенная в 2014 году, которая упрощает разработку Spring Framework. После изучения всех знаний о весенних рамках, Spring Frameworks неизбежно требует большого количества XML. Если вы используете фреймворки Springboot, вы можете использовать разработку аннотаций, чтобы значительно упростить разработку на основе Spring Frameworks. Springboot в полной мере использует режим конфигурации Javaconfig, а концепция «Конвенция лучше, чем конфигурация», которая может значительно упростить разработку веб -приложений и служб REST на основе SpringMVC.
Глава 3 Введение в Redis
3.1 Установка и развертывание Redis (Linux)
Для установки и развертывания Redis, пожалуйста, см. В моем блоге (Redis написан на основе C, поэтому установите компилятор GCC перед установкой): //www.vevb.com/article/79096.htm
3.2 Введение в Redis
Редис теперь стал одной из самых популярных баз данных в памяти в сообществе веб-развития. Благодаря быстрому развитию Web2.0 и увеличению доли полуструктурированных данных, веб-сайты имеют все больше и больше требований к эффективной производительности.
Кроме того, большие сайты обычно имеют сотни или более серверов Redis. Как мощная система, Redis имеет свое собственное использование, будь то хранилище, очередь или кэш -систему.
Для начала работы с Springboot Framework, пожалуйста, обратитесь к предыдущей статье: http://www.vevb.com/article/111197.htm
Глава 4 Реализация Redis Cache
4.1 Следующая структурная диаграмма
Диаграмма структуры проекта:
4.2 Конфигурация файла YML Springboot
Добавить конфигурацию Application.yml ниже ресурса, где в основном настроены MySQL, Druid и Redis
Spring: DataSource: # Основной магазин источника данных: URL: JDBC: MySQL: //127.0.0.1: 3306/jeepatform? AutoreConnect = true & UseUnicode = true & HearlyCoding = utf8 & incommestresults = utf8 & usessl = false usernam com.alibaba.druid.pool.druiddatasource # Настройки пула соединений Druid: Начальный размер: 5 мин IDLE: 5 MAX-ACTIVE: 20 # Настройка времени, чтобы получить время ожидания подключения. Настройте минимальное время для выживания в пуле, в миллисекундах Min-Evictable-Idle-Time-Millis: 300000 # Oracle Пожалуйста, используйте Select 1 из двойной проверки-Query: Выберите «x 'test-while-idle: True Test-On-natural: False Test-on-retur MAX-POOL-PREPARED-Statement-Be-Connection-размер: 20 # Настройка фильтров для пересечения статистики мониторинга. После удаления интерфейса мониторинга SQL не может быть подсчитано, «стена» используется для фильтров брандмауэра: stat, стена, SLF4J # Открыть функцию MergesQL через свойство ConnectProperties; Mlow SQL Records Connection-Properties: Druid.stat.mergeSql = true; Druid.stat.SlowsQlmillis = 5000 # Данные мониторинга слияния множественных DruidDatasource use-global-data-source-stat: true jpa: бата данных: mysql hibernate: show_sql: true format_squrate: none-n-nling: true a-ataut Физическая стратегия: org.hibernate.boot.model.naming.physicalnamingStrategystandardimpl Mvc: Просмотр: префикс:/web-inf/jsp/суффикс: .jsp #jedis configuration
Напишите класс конфигурации, чтобы запустить конфигурацию jedisconfig.java:
пакет org.muses.jeepatform.config; import org.springframework.beans.factory.annotation.autowired; import org.springframework.beans.factory.annotation.qualifier; импорт org.springframework.beans.factory.antation.value; org.springframework.boot.autoconfigure.condition.conditionalonmissingbean; import org.springframework.boot.context.properties.configurationProperties; импорт org.springframework.context.annotation.bean; imporm.springframework.nantation.annotation. redis.clients.jedis.jedispool; import redis.clients.jedis.jedispoolconfig; @configuration //@configurationproperties (prefix = jedisconfig.jedis_prefix) открытый класс jedisconfig {// public Static final String jedis_prefix = "jedisis"; @Bean (name = "jedispool") @autowired public jedispool jedispool (@qualifier ("jedispoolconfig") jedispoolconfig config, @value ("$ {spring.jedis.pool.host}") Струнный хост, @value ("$ {spring.jedis.pool.port}") @Value ("$ {spring.jedis.pool.timeout}") int timeout, @value ("$ {spring.jedis.pool.password}") String пароль) {return new jedispool (config, хост, порт, тайм -аут, пароль); } @Bean (name = "jedispoolconfig") public jedispoolconfig jedispoolconfig (@value ("$ {spring.jedis.pool.config.maxtotal}") int maxtotal, @value ("$ {spring.jedis.pool.config.maxidle}") @Value ("$ {spring.jedis.pool.config.maxwaitmillis}") int maxwaitmillis) {jedispoolconfig config = new jedispoolconfig (); config.setmaxtotal (maxtotal); config.setmaxidle (maxidle); config.setmaxwaitmillis (maxwaitmillis); вернуть конфигурацию; }}4.3 Написание класса мета-аннотации
Напишите класс мета -аннотации rediscache.java. Все классы, определенные модифицированной аннотацией, автоматически реализованы в обработке кэша AOP.
Пакет org.muses.jeepatform.annotation; import org.muses.jeepatform.common.rediscachenamespace; импорт java.lang.annotation.*;/***Метата {// rediscachenamespace space ();} В дополнение к удержанию, есть еще три аннотации, предоставленные JDK 5, а именно цель, унаследованные и документированные. На основании этого мы можем реализовать пользовательские мета -аннотации
Мы установили rediscache на ссылку на основе уровня метода метода.
1. RetentionPolicy.source Этот тип аннотаций зарезервирован только на уровне исходного кода и будет игнорироваться во время компиляции.
2. harementpolicy.class Этот тип аннотаций сохраняется во время компиляции и существует в файле класса, но JVM будет игнорировать его.
3. streationPolicy.Runtime Этот тип аннотаций будет зарезервирован JVM, поэтому их можно прочитать и использовать JVM или другим кодом, который использует механизмы отражения во время выполнения.
4.4 Позвоните JEDispool для реализации обработки кэша Redis
пакет org.muses.jeepatform.cache; import org.springframework.beans.factory.annotation.autowired; import org.springframework.stereotype.component; импорт org.springframework.stereoty.service; импорт redis.clients.jedis.jedis; импорт. javax.annotation.resource; @component ("rediscache") открытый класс rediscache {@autowired private jedispool jedispool; Частный jedispool getjedispool () {return jedispool; } public void setjedispool (jedispool jedispool) {this.jedispool = jedispool; } / ** * Получить данные из Redis Cache * @param rediskey * @return * / public Object getDataFromredis (String Rediskey) {jedis jedis = jedispool.getresource (); byte [] bytearray = jedis.get (rediskey.getbytes ()); if (bytearray! = null) {return serializeutil.unserialize (bytearray); } return null; } / ** * Сохранить данные в redis * @param rediskey * / public String savedatatoredis (String rediskey, Object obj) {byte [] bytes = serializeutil.serialize (obj); Jedis jedis = jedispool.getresource (); String Code = jedis.set (rediskey.getbytes (), байты); код возврата; }}Класс инструмента сериализации объекта:
пакет org.muses.jeepatform.cache; import java.io.*; public class serializeutil { / *** serialized object* @param obj* @return* / public static byte [] serialize (Object obj) {objectOutputStream oos = null; BytearrayOutputStream BAOS = NULL; try {baos = new BytearrayOutputStream (); oos = new ObjectOutputStream (BAOS); OOS.WriteObject (OBJ); byte [] bytearray = baos.tobytearray (); вернуть Bytearray; } catch (ioException e) {e.printstackTrace (); } return null; } / ** * Deserialize Object * @param bytearray * @return * / public static onserialize (byte [] bytearray) {bytearrayinptream bais = null; try {// deserialize to object bais = new Bytearrayinputstream (Bytearray); ObjectInputStream OIS = new ObjectInputStream (BAIS); return ois.readobject (); } catch (Exception e) {e.printstackTrace (); } return null; }} Здесь я помню, что классы VO должны реализовать сериализуемые
Например, информация о меню VO Class, это класс объектов JPA-картирования
пакет org.muses.jeepatform.core.entity.admin; импорт javax.persistence. { / ** Меню идентификатор ** / private int menuid; / ** Superior Id **/ private int parentid; / ** Имя меню **/ Private String Menuname; / ** Значок меню **/ Private String Menuicon; / ** Меню URL **/ Private String Menuurl; / ** Тип меню **/ Private String Menutype; / ** Меню сортировка **/ частное строковое меню; / ** Статус меню **/ частная строка Menustatus; частный список <меню> подменю; частная строковая цель; Частный логический Hassubmenu = false; Публичное меню () {super (); } @ID @GeneratedValue (стратегия = GenerationType.identity) public int getMenuId () {return this.menuid; } public void setmenUid (int menuid) {this.menuid = menuid; } @Column (длина = 100) public int getParentId () {return parentId; } public void setParentId (int parentId) {this.parentid = parentId; } @Column (длина = 100) public String getMenuname () {return this.menuname; } public void setmenUname (String menuname) {this.menuname = menuname; } @Column (длина = 30) public String getMenUicon () {return this.menuicon; } public void setmenUicon (String menuicon) {this.menuicon = menuicon; } @Column (длина = 100) public String getMenUurl () {return this.menuurl; } public void setmenUurl (String Menuurl) {this.menuurl = menuurl; } @Column (длина = 100) public String getMenUtype () {return this.menutype; } public void setMenUtype (String menutype) {this.menutype = menutype; } @Column (длина = 10) public String getMenUorder () {return Menuorder; } public void setmenUorder (строковое меню) {this.MenuOrder = MenuOder; } @Column (длина = 10) public String getMeNustatus () {return menustatus; } public void setMeNustatus (String menustatus) {this.menustatus = menustatus; } @Transient Public List <Menu> getSubmenu () {return saper; } public void setSubMenu (list <Menu> saper) {this.submenu = sumenu; } public void settarget (String Target) {this.Target = target; } @Transient public String getTarget () {return Target; } public void sethassubmenu (boolean hassubmenu) {this.hassubmenu = hassubmenu; } @Transient public boolean gethassubmenu () {return hassubmenu; }}4.5 Spring AOP реализует кэш методов, который контролирует все аннотированные @rediscache
Сначала получите кеш от Redis. Если вы не можете запросить это, запросите базу данных MySQL, а затем сохраните ее в кеш Redis. В следующий раз, когда вы запросите, позвоните в кеш Redis напрямую.
Пакет org.muses.jeepatform.cache; import org.aspectj.lang.proudeingjoinpoint; import org.aspectj.lang.annotation.Around; импорт org.aspectj.lang.annotation.aspept; import org.aspectj.lang.annotation.pointcut; import.smort.smom.logger; org.slf4j.loggerfactory; import org.springframework.beans.factory.annotation.autowired; import org.springframework.beans.factory.annotation.qualifier; импорт org.springframework.stereotype.component;/** ** aop interiz Static Final Logger logger = loggerFactory.getLogger (redisaspect.class); @Autowired @qualifier ("rediscache") private resiscache rediscache; /*** Методы для перехвата всех мета -аннотаций RESISCATH ANNOTATION* /@pointcut (" @annotation (org.muses.jeepatform.annotation.rediscache)") public void pointcutmethod () {} /*** Для обработки окружающей среды сначала получите кэш из redis. Если вы не можете запрашивать, вы запросите базу данных MySQL, * затем сохраните ее в Redis Cache * @param joinpoint * @return */@around ("pointcutmethod ()") открытый объект вокруг (roeveringjoinpoint joinpoint) {// предыдущий: получить кэш из Redis // Сначала Get Target Method Parametertime = System.CurrentTimememLITILITILITILITILITILITILITILITILITILITILITILITILITILITILITILITILITILITILITILITILITILITILITILITIM String Applid = null; Object [] args = joinPoint.getArgs (); if (args! = null && args.length> 0) {applid = string.valueof (args [0]); } // Получить класс, где целевой метод находится строка, target target = joinpoint.getTarget (). ToString classname = target.split ("@") [0]; // Получить имя метода целевого метода String Methodname = joinPoint.getSignature (). GetName (); // Формат клавиш Redis: Applid: имя метода string rediskey = Applid + ":" + classname + ".". " + methodname; Object obj = rediscache.getDataFromredis (rediskey); if (obj! = null) {logger.info ("************ Данные, найденные из Redis *************** Logger.info ("Redis Key Value:"+Rediskey); Logger.info ("redis value:"+obj.tostring ()); вернуть OBJ; } long EndTime = System.CurrentTimeMiLlis (); Logger.info ("Redis Cache Aop Time Rockesing:"+(EndTime-starttime)); Logger.info ("*************** try {obj = joinpoint.proceed (); } catch (throwable e) {e.printstacktrace (); } Logger.info ("*************** // post-steet: Сохранить данные, найденные в базе данных в Redis String Code = rediscache.savedatatoredis (Rediskey, OBJ); if (code.equals ("ok")) {logger.info ("************ Данные были успешно сохранены в Redis Cache !!! ************"); Logger.info ("Redis Key Value:"+Rediskey); Logger.info ("redis value:"+obj.tostring ()); } вернуть obj; }}Затем вызовите @rediscache, чтобы реализовать кэш
/ ** * Получить информацию меню через идентификатор меню * @param id * @return */ @transactional @rediscache public menu findmenubyid (@rediscachekey int id) {return menurepository.findmenubymenuid (id); }Методы, которые входят в систему, а затем добавляют аннотацию @rediscache, будут реализовать обработку кэша Redis
Вы можете видеть, что Redis сохраняется в кеш
Код проекта: https://github.com/u014427391/jeepatform
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.