SSM+Redis Integration
Фреймворк SSM была построена ранее, поэтому здесь не будет выполнено копирование кода.
Здесь мы в основном используем Redis, чтобы сделать вторичный кэш Mybatis. Все выбранные в файле отображения MyBaits будут обновлять существующий кэш. Если его не существует, будет создан новый кэш. Все операции вставки и обновления будут обновлять кэш.
Преимущества Redis также очевидны, что может повысить производительность доступа к данным системы. В этом разделе показываются только методы и эффекты интеграции, и впоследствии будет дополнено статьями, разделяющими кластеры Redis, балансировку нагрузки и сеансы.
Давайте начнем работу по интеграции:
Бэкэнд начинается первым (метод запуска и удаленного подключения к службам Linux требует изменения файла Redis.conf) и запуска команды »./src/redis-server ./redis.conf"
Я разработал его под системой Windows. Я рекомендую визуальный инструмент "Redis Desktop Manager". Это требует удаленного подключения к Redis в Linux, и порт должен быть открыт для публики в рамках Linux (конкретный метод состоит в том, чтобы изменить файл/etc/sysconfig/iptables и добавить команды разработки внешнего порта).
После того, как все вышеперечисленные операции завершены, удаленное соединение будет успешным, как показано на рисунке:
Там еще нет записи кеша. Давайте введем кодовой этап. Во -первых, добавьте необходимый пакет redis jar в pom.xml.
<depervice> <groupid> redis.clients </GroupId> <ArtifactId> jedis </artifactid> <serse> 2.9.0 </version> </depervice> <dehydency> <groupid> org.springframework.data </GroupId> <artifactid> spring-data-redis </artifactid> <sers> 1.6. <groupId>org.mybatis</groupId> <artifactId>mybatis-ehcache</artifactId> <version>1.0.0</version> </dependency> <!-- Add druid connection pool package--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.24</version> </dependency>
После написания pom.xml необходимо добавить два новых файла конфигурации: redis.properties
redis.host = 192.168.0.109redis.port = 6379redis.pass = 123456redis.maxidle = 200redis.maxactive = 1024redis.maxwait = 10000redis.testonborror = true
Поля также просты для понимания, а затем добавьте файл конфигурации: Spring-Redis.xml
<Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-insstance" xmlns: p = http://www.spramemema expramemema "xmlns: p =" http://www.spramemema "/" http://www.spramema-instance ". xmlns: mvc = "http://www.springframework.org/schema/mvc" xmlns: util = "http://www.springframework.org/schema/util" xmlns: aop = "http://wwww.spramefema" xmlns: aop = "http://wwww.spramemema/xmlns:" http://wwww.spramemema "/http://www.spramemabema/xmlns:" http://www.sprame xmlns: context = "http://www.springframework.org/schema/context" xmlns: task = "http://www.springframework.org/schema/task" xsi: schemalocation = "http://wwww.springframe.orschema. http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-hop-4..s.5.x.x. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd "> <!-Базовая конфигурация параметров пула соединений, аналогично Database Connection. <bean id = "poolconfig"> <name = "maxtotal" value = "$ {redis.maxactive}"/> <name = "maxidle" value = "$ {redis.maxidle}"/> <name = "testonbourrow" value = "$ {redis.testonborrow}"/> </bean> <! <bean id = "jedisconnectionfactory"> <name = "hostname" value = "$ {redis.host}"> </property> <name = "port" value = "$ {redis.port}"> </property> <name = "password" value = "$ {redis.pass}"> </properation> <property name = "poolconfig" reliscig ". </bean> <!-Call Connection Pool Configururation-> <!-<Bean Id = "Redistemplate"> <name = "jedisconnectionFactory" ref = "jedisconnectionFactory"> </property> Если сериализатор не настроен, то используйте строку интеллектуально при хранении. Если вы используете тип пользователя для хранения, он подскажет, что пользователь ошибки не может поднять на строку! ! ! <имя свойства = "keyserializer"> <bean/> </property> <property name = "valueserializer"> <bean/> </property> </bean> -> <bean id = "rediscachetransfer"> <property name = "JedisconnectionFactory" Ref = "jedisconnectionFactory"/> </bean> </beans>После того, как файл конфигурации записан, начните написать код Java:
Jedisclusterfactory.java
пакет com.cjl.util; import java.util.hashset; import java.util.properties; импорт java.util.set; import java.util.regex.pattern; импорт org.apache.commons.pool.impl.genericobjectpoolconfig; import org.spramework.beancory org.springframework.beans.factory.InitializingBean;import org.springframework.core.io.Resource;import redis.clients.jedis.HostAndPort;import redis.clients.jedis.JedisCluster;public class JedisClusterFactory implements FactoryBean<JedisCluster>, InitializingBean { private Resource addressConfig; Private String AddressKeyprefix; Частный Jediscluster Jediscluster; частный целочисленный тайм -аут; частное целое число MaxRideRections; Private GenericObjectPoolConfig GenericObjectPoolConfig; Приватный шаблон p = pattern.compile ("^.+[:] // d {1,5} // s*$"); public jediscluster getObject () бросает исключение {return jediscluster; } открытый класс <? extends jediscluster> getObjectType () {return (this.jediscluster! = null? this.jediscluster.getClass (): jediscluster.class); } public boolean issingleton () {return true; } private set <hostandport> parsehostandport () throws exception {try {Properties prop = new Properties (); prop.load (this.addressconfig.getInputStream ()); Set <hostandport> hasps = new Hashset <hostandport> (); for (ключ объекта: prop.keyset ()) {if (! ((String) key) .startSwith (addresskeyprefix)) {продолжение; } String val = (string) prop.get (key); Boolean Isipport = p.matcher (val) .matches (); if (! isipport) {бросить новый allodalargumentException («IP или порт незаконно»); } String [] ipandport = val.split (":"); Hostandport hap = new Hostandport (ipandport [0], integer.parseint (ipandport [1])); haps.add (hap); } return hASP; } catch (allogalargumentException ex) {throw ex; } catch (Exception ex) {бросить новое исключение ("Файл конфигурации parse jedis не удался", Ex); }} public void efpropertiesset () бросает исключение {set <hostandport> hasp = this.parsehostandport (); jediscluster = new jediscluster (haps, timeout, maxredections, geneicobjectpoolconfig); } public void setAddressConfig (resource addressconfig) {this.addressconfig = addressconfig; } public void settimeout (int timeout) {this.Timeout = timeout; } public void setMaxRedections (int maxredections) {this.maxredections = maxredirections; } public void setAddresskeyprefix (string addresskeyprefix) {this.addresskeyprefix = addresskeyprefix; } public void setGenericObjectPoolConfig (geneicObjectPoolConfig genericObjectPoolConfig) {this.genericObjectPoolConfig = genericObjectPoolConfig; }}Rediscache.java
пакет com.cjl.util; import java.util.concurrent.locks.readwritelock; import java.util.concurrent.locks.reentrantreadwritelock; импорт org.apache.ibatis.cache.cache; org.slf4j.logger; import org.loggerfactory; org.springframework.data.redis.connection.jedis.jedisconnection; импорт org.springframework.data.redis.connection.jedis.jedisconnectionFactory; импорт org.springframework.data.redis.serialize org.springframework.data.redis.serializer.redisserializer; import redis.clients.jedis.exceptions.jedisconnectionException; открытый класс rediscache реализует кэш {private static final logger = loggerfactory.getlogger (rediscache.class); Частный статический jedisconnectionfactory jedisconnectionfactory; Частный финальный идентификатор строки; Частный финальный readwritelock rwl = new Reentrantreadwritelock (); public rediscache (окончательный идентификатор строки) {if (id == null) {бросить новый allosalargumentException ("экземпляры кэша требуют идентификатора"); } logger.debug ("mybatisrediscache: id =" + id); this.id = id; } / *** Очистить все кэши* / public void clear () {rwl.readlock (). Lock (); JedySconnection Connection = NULL; try {connection = jedisconnectionFactory.getConnection (); connection.flushdb (); connection.flushall (); } catch (jedisconnectionException e) {e.printstackTrace (); } наконец {if (connection! = null) {connection.close (); } rwl.readlock (). unlock (); }} public String getId () {return this.id; } / *** Получить общее количество кэш* / public int getSize () {int result = 0; JedySconnection Connection = NULL; try {connection = jedisconnectionFactory.getConnection (); result = integer.valueof (connection.dbsize (). toString ()); logger.info ("добавить вторичный номер кэша MyBaits:" + result); } catch (jedisconnectionException e) {e.printstackTrace (); } наконец {if (connection! = null) {connection.close (); }} return result; } public void putObject (ключ объекта, значение объекта) {rwl.writelock (). lock (); JedySconnection Connection = NULL; try {connection = jedisconnectionFactory.getConnection (); Redisserializer <object> serializer = new jdkserializationredisserializer (); connection.set (serializeutil.serialize (key), serializeutil.serialize (value)); logger.info ("Добавить mybaits вторичный ключ кэша =" + key + ", value =" + value); } catch (jedisconnectionException e) {e.printstackTrace (); } наконец {if (connection! = null) {connection.close (); } rwl.writelock (). unlock (); / Объект результат = null; JedySconnection Connection = NULL; try {connection = jedisconnectionFactory.getConnection (); Redisserializer <object> serializer = new jdkserializationredisserializer (); result = serializer.deserialize (connection.get (serializer.serialize (key))); logger.info («Хит MyBaits Level 2 Cache, value =» + result); } catch (jedisconnectionException e) {e.printstackTrace (); } наконец {if (connection! = null) {connection.close (); } rwl.readlock (). unlock (); } return Result; } public Object RemoveObject (Key Object) {rwl.writelock (). lock (); JedySconnection Connection = NULL; Объект результат = null; try {connection = jedisconnectionFactory.getConnection (); Redisserializer <object> serializer = new jdkserializationredisserializer (); result = connection.expire (serializer.serialize (key), 0); } catch (jedisconnectionException e) {e.printstackTrace (); } наконец {if (connection! = null) {connection.close (); } rwl.writelock (). unlock (); } return Result; } public static void setJedisconnectionFactory (jedisconnectionFactory jedisconnectionFactory) {rediscache.jedisconnectionFactory = jedisconnectionFactory; } public readWritelock getReadWriteLock () {// todo Автопогенерированный метод return return rwl; }}Rediscachetransfer.java
Пакет com.cjl.util; import org.springframework.beans.factory.annotation.autowired; import org.springframework.data.redis.connection.jedis.jedisconnectionFactory;/*** Статическое инъекция промежуточных классов*/public rediscachetransfer setJedisconnectionFactory (jedisconnectionFactory jedisconnectionFactory) {rediscache.setJedisconnectionFactory (jedisconnectionFactory); }}Serializeutil.java
Пакет com.cjl.util; импорт java.io.bytearrayinputstream; import java.io.bytearrayoutputstream; import java.io.objectinputstream; import java.io.objectOutputStream;/** * * @Author CJL * */public classOtiz Object) {objectOutputStream oos = null; BytearrayOutputStream BAOS = NULL; try {// serialization baos = new BytearrayOutputStream (); oos = new ObjectOutputStream (BAOS); oos.writeObject (объект); byte [] bytes = baos.tobytearray (); вернуть байты; } catch (Exception e) {e.printstackTrace (); } return null; } / ***deserialization* / public static Object unserialize (byte [] bytes) {if (bytes! = Null) {bytearrayinptream bais = null; try {// deserialize bais = new BytearrayinputStream (Bytes); ObjectInputStream OIS = new ObjectInputStream (BAIS); return ois.readobject (); } catch (Exception e) {}} return null; }}После того, как все будет готово, вам нужно изменить файл отображения
Чтобы сделать кэш MyBaits эффективным, вам также необходимо включить вторичный кэш, как показано на приведенном выше рисунке. Файл конфигурации также должен быть загружен в web.xml, чтобы вступить в силу
Когда все будет готово, запустите сервис
После того, как стартап будет успешным, нажатие на форму сотрудника может вызвать метод запроса всех сотрудников. Когда оператор запроса выполняется в первый раз, вы можете видеть, что Mybatis напечатал оператор запроса и обновил кэш на сервере Redis.
Мы очищаем консоль и нажимаем кнопку «Сотрудники Query», чтобы выполнить метод запроса. Мы видим, что оператор запроса не выполняется, доказывая, что второй запрос напрямую берет значение из кэша, и нет никакого соединения с MySQL для запроса.
Суммировать
Выше приведено метод интеграции Redis и SSM (кэш Mybatis уровня 2), введенный вам редактором. Я надеюсь, что это будет полезно для всех. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит всем вовремя. Большое спасибо за вашу поддержку сайту wulin.com!