Maison >base de données >Redis >Introduction à la méthode d'ajout du support Redis au projet SSM
Vous devez d'abord configurer l'environnement de développement SSM et installer Redis. Voici les étapes de mise en œuvre spécifiques :
1. Introduisez le package jedis rack dans le projet. : jedis- 2.8.2.jar, spring-data-redis-1.6.2.RELEASE.jar et commons-pool-1.6.jar. Faites attention à la version jar introduite. Une version trop élevée ou trop faible peut provoquer des exceptions. sont mentionnés ci-dessus. La combinaison est disponible pour des tests personnels ;
2. Deux classes d'outils RedisUtil.java et SerializeUtil.java sont nécessaires pour écrire Redis
3. org.apache.ibatis .cache.Cache interface
4. Activez la prise en charge de mybatis pour la mise en cache Dans ce projet, modifiez le fichier mybatis-config.xml
5. mapper.xml La classe d'outils de classe de cache MybatisRedisCache
RedisUtil est utilisée pour communiquer avec les données Redis. SerializeUtil est une classe d'outils de sérialisation et un outil sous le package lang. interface de clonage. Voici le code spécifique :
import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; public class RedisUtil { private static String ADDR = "127.0.0.1"; private static int PORT = 6379; private static int MAX_ACTIVE = 1024; private static int MAX_IDLE = 200; private static int MAX_WAIT = 100000; private static int TIMEOUT = 10000; private static boolean TEST_ON_BORROW = true; private static JedisPool jedisPool = null; static { try{ JedisPoolConfig config = new JedisPoolConfig(); config.setMaxIdle(MAX_IDLE); config.setMaxWaitMillis(MAX_WAIT); config.setTestOnBorrow(TEST_ON_BORROW); jedisPool = new JedisPool(config,ADDR,PORT,TIMEOUT); }catch (Exception e) { e.printStackTrace(); } } public synchronized static Jedis getJedis(){ try{ if(jedisPool != null){ Jedis jedis = jedisPool.getResource(); return jedis; }else{ return null; } }catch (Exception e) { e.printStackTrace(); return null; } } public static void returnResource(final Jedis jedis){ if(jedis != null){ jedisPool.returnResource(jedis); } } }rrree
fichier mybatis-config.xml, sélectionnez le chargement global dans le fichier spring-mybatis.xml :
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class SerializeUtil { public static byte[] serialize(Object object) { ObjectOutputStream oos = null; ByteArrayOutputStream baos = null; try { // 序列化 baos = new ByteArrayOutputStream(); oos = new ObjectOutputStream(baos); oos.writeObject(object); byte[] bytes = baos.toByteArray(); return bytes; } catch (Exception e) { e.printStackTrace(); } return null; } public static Object unserialize(byte[] bytes) { if (bytes == null) return null; ByteArrayInputStream bais = null; try { // 反序列化 bais = new ByteArrayInputStream(bytes); ObjectInputStream ois = new ObjectInputStream(bais); return ois.readObject(); } catch (Exception e) { e.printStackTrace(); } return null; } } import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; import org.apache.ibatis.cache.Cache; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class MybatisRedisCache implements Cache { private static Logger logger = LoggerFactory.getLogger(MybatisRedisCache.class); /** The ReadWriteLock. */ private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); private String id; public MybatisRedisCache(final String id) { if (id == null) { throw new IllegalArgumentException("Cache instances require an ID"); } logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>MybatisRedisCache:id="+id); this.id = id; } public String getId() { return this.id; } public void putObject(Object key, Object value) { logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>putObject:"+key+"="+value); RedisUtil.getJedis().set(SerializeUtil.serialize(key.toString()), SerializeUtil.serialize(value)); } public Object getObject(Object key) { Object value = SerializeUtil.unserialize(RedisUtil.getJedis().get(SerializeUtil.serialize(key.toString()))); logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>getObject:"+key+"="+value); return value; } public Object removeObject(Object key) { return RedisUtil.getJedis().expire(SerializeUtil.serialize(key.toString()),0); } public void clear() { RedisUtil.getJedis().flushDB(); } public int getSize() { return Integer.valueOf(RedisUtil.getJedis().dbSize().toString()); } public ReadWriteLock getReadWriteLock() { return readWriteLock; } }
Ce qui suit est le code détaillé de mybatis-config .xml :
<!-- 配置mybatis --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- 加载mybatis的全局配置文件 --> <property name="configLocation" value="classpath:resource/mybatis-config.xml"></property> <!-- mapper扫描 --> <property name="mapperLocations" value="classpath:resource/mapper/*.xml"></property> </bean>
Enfin, ajoutez le
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD SQL Map Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings> <!-- 全局映射器启用缓存 --> <setting name="cacheEnabled" value="true"/> <!-- 查询时,关闭关联对象即时加载以提高性能 --> <setting name="lazyLoadingEnabled" value="false"/> <!-- 对于未知的SQL查询,允许返回不同的结果集以达到通用的效果 --> <setting name="multipleResultSetsEnabled" value="true"/> <!-- 允许使用列标签代替列名 --> <setting name="useColumnLabel" value="true"/> <!-- 不允许使用自定义的主键值(比如由程序生成的UUID 32位编码作为键值),数据表的PK生成策略将被覆盖 --> <setting name="useGeneratedKeys" value="false"/> <!-- 给予被嵌套的resultMap以字段-属性的映射支持 FULL,PARTIAL --> <setting name="autoMappingBehavior" value="PARTIAL"/> <!-- 对于批量更新操作缓存SQL以提高性能 BATCH,SIMPLE --> <!-- <setting name="defaultExecutorType" value="BATCH" /> --> <!-- 数据库超过25000秒仍未响应则超时 --> <!-- <setting name="defaultStatementTimeout" value="25000" /> --> <!-- Allows using RowBounds on nested statements --> <setting name="safeRowBoundsEnabled" value="false"/> <!-- Enables automatic mapping from classic database column names A_COLUMN to camel case classic Java property names aColumn. --> <setting name="mapUnderscoreToCamelCase" value="true"/> <!-- MyBatis uses local cache to prevent circular references and speed up repeated nested queries. By default (SESSION) all queries executed during a session are cached. If localCacheScope=STATEMENT local session will be used just for statement execution, no data will be shared between two different calls to the same SqlSession. --> <setting name="localCacheScope" value="SESSION"/> <!-- Specifies the JDBC type for null values when no specific JDBC type was provided for the parameter. Some drivers require specifying the column JDBC type but others work with generic values like NULL, VARCHAR or OTHER. --> <setting name="jdbcTypeForNull" value="OTHER"/> <!-- Specifies which Object's methods trigger a lazy load --> <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/> <!-- 打印sql语句 --> <setting name="logImpl" value="STDOUT_LOGGING" /> </settings> </configuration>
référencé à l'espace de noms du mappeur de fichiers de mappage. Vous constaterez que la console imprime l'instruction SQL de la requête qui vient d'être exécutée, puis. exécute la requête dans les mêmes conditions. À ce stade, faites attention à la console. Si aucun SQL n'est imprimé, les résultats de la requête sont directement affichés, indiquant que les données sont lues depuis Redis et vous sont renvoyées. en interrogeant la base de données. À ce stade, la configuration est réussie.
Bien sûr, nous pouvons ouvrir le client et le serveur Redis, trouver redis-cli dans le répertoire d'installation de Redis, double-cliquer pour l'ouvrir, saisir les clés * appuyer sur Entrée, vous verrez la clé générée, Redis le fera allez à la clé en fonction de la clé Obtenez la valeur requise.
Pendant l'opération réelle, vous devez faire attention à la classe d'outils RedisUtil. Vous devez définir le port et l'ADDR en fonction de votre propre situation. Si le Redis installé a un mot de passe, vous devez ajouter AUTH. il n'y a pas de mot de passe, ce n'est pas obligatoire. Lorsqu'il est ajouté à une classe d'outils, même l'attribution d'une valeur nulle ne fonctionnera pas
une fois essayé ceci : private static String AUTH = " ";
Par conséquent, cette exception a été signalée lors de l'exécution : jedis.exceptions.JedisDataException : ERR Le client a envoyé AUTH, mais aucun mot de passe n'est défini
signifie que le serveur Redis n'a pas défini de mot de passe, mais que le client lui a envoyé une demande AUTH. De plus, les classes à mettre en cache doivent implémenter Serialisable. Si vous pensez qu'il y a un problème avec le Redis que vous avez installé, vous pouvez le tester via la méthode suivante :
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace="com.krk.sxytj.ytj2001.mapper.YTJ2001Mapper" > <cache type="com.krk.sxytj.utils.redis.MybatisRedisCache>
Pour plus de connaissances sur Redis, veuillez faire attention à la colonne Tutoriel de base de données Redis .
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!