站長資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        SSM項目加入Redis支持的方法介紹

        SSM項目加入Redis支持的方法介紹

        需要先搭好SSM開發(fā)環(huán)境,并安裝好Redis,下面是具體的實現(xiàn)步驟:

        1、在項目中引入jedis架包:jedis-2.8.2.jar、spring-data-redis-1.6.2.RELEASE.jar和commons-pool-1.6.jar,注意引入的jar版本,過高或過低都有可能引發(fā)異常,上面提到這些版本組合親測可用;

        2、編寫Redis需要用的2個工具類 RedisUtil.java和SerializeUtil.java

        3、新增一個Cache類MybatisRedisCache,實現(xiàn) org.apache.ibatis.cache.Cache 接口

        4、開啟mybatis對緩存的支持,在本項目中,是修改 mybatis-config.xml文件

        5、在相關(guān)的 mapper.xml 添加自定義的緩存類MybatisRedisCache

        RedisUtil工具類是用以跟Redis數(shù)據(jù)通信,SerializeUtil為序列化工具類,也是lang包下的工具,主要用于序列化操作,同時提供對象克隆接口。下面是具體代碼:

        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);         }     } }
        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;      } }

        mybatis-config.xml文件,在spring-mybatis.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>

        以下是mybatis-config.xml詳細代碼:

        <?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"/>          <!-- 查詢時,關(guān)閉關(guān)聯(lián)對象即時加載以提高性能 -->         <setting name="lazyLoadingEnabled" value="false"/>          <!-- 對于未知的SQL查詢,允許返回不同的結(jié)果集以達到通用的效果 -->         <setting name="multipleResultSetsEnabled" value="true"/>          <!-- 允許使用列標簽代替列名 -->         <setting name="useColumnLabel" value="true"/>          <!-- 不允許使用自定義的主鍵值(比如由程序生成的UUID 32位編碼作為鍵值),數(shù)據(jù)表的PK生成策略將被覆蓋 -->         <setting name="useGeneratedKeys" value="false"/>          <!-- 給予被嵌套的resultMap以字段-屬性的映射支持 FULL,PARTIAL -->         <setting name="autoMappingBehavior" value="PARTIAL"/>          <!-- 對于批量更新操作緩存SQL以提高性能 BATCH,SIMPLE -->         <!-- <setting name="defaultExecutorType" value="BATCH" /> -->          <!-- 數(shù)據(jù)庫超過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>

        最后在需要緩存的映射文件mapper.xml的namespace加上引用的

        <?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>

        然后就可以進行測試了,測試時先進行第一次查詢,如果開啟打印sql,將會發(fā)現(xiàn)控制臺打印出剛才執(zhí)行查詢的SQL語句,再進行同樣條件的查詢,這時注意觀察控制臺,如果沒有打印SQL,直接輸出查詢結(jié)果,說明是從Redis讀取到數(shù)據(jù)返回給你,而不是去數(shù)據(jù)庫中查詢得到的結(jié)果。此時配置就成功了。

        當然,我們可以開啟Redis客戶端和服務器端,在Redis安裝目錄下找到redis-cli,雙擊打開,輸入keys *回車,將會看到生成的key,Redis就是根據(jù)key去獲取所需的value。

        在實際操作的過程中要注意RedisUtil工具類,需要根據(jù)自己的情況設置port、ADDR 、如果安裝的Redis設置有密碼,還需加上AUTH,如果沒有設置密碼,這項不要添加在工具類中,哪怕賦空值也不行,

        曾經(jīng)試過這樣: private static String AUTH = " ";

        結(jié)果運行的時候報了這個異常: jedis.exceptions.JedisDataException: ERR Client sent AUTH, but no password is set

        意思就是redis服務器沒有設置密碼,但客戶端向其發(fā)送了AUTH請求。 此外,要緩存的類需要implements Serializable。 如果懷疑你安裝的Redis有問題,可通過下面的方法進行測試:

          @Test     public void testRedis(){          //連接本地的 Redis 服務         Jedis jedis = new Jedis("localhost");         System.out.println("連接成功");         //查看服務是否運行         System.out.println("服務正在運行: "+jedis.ping());         //設置 redis 字符串數(shù)據(jù)         jedis.set("success", "oobom");         // 獲取存儲的數(shù)據(jù)并輸出         System.out.println("redis 存儲的字符串為: "+ jedis.get("success"));     }

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
        主站蜘蛛池模板: 亚洲精品国产日韩无码AV永久免费网| 无码人妻精品中文字幕免费| 中文字幕精品久久| MM1313亚洲精品无码| 久久久久99精品成人片欧美| 国产一区二区三区欧美精品| 国产99视频精品免视看7| 四虎国产精品成人免费久久| 亚洲午夜精品久久久久久浪潮 | 亚洲国产精品无码av| wwwvr高清亚洲精品二区| 国产欧美日韩精品a在线观看| 亚洲精品岛国片在线观看| 国产精品国产AV片国产| 国产精品久久久久天天影视| 亚洲国产精品va在线播放| 欧美精品一区二区久久| 国产欧美精品一区二区色综合 | 国产成人AV无码精品| 囯产精品一品二区三区| 日本内射精品一区二区视频 | 欧美精品国产一区二区三区| 国产99精品一区二区三区免费| 国产精品宾馆在线精品酒店| 久久综合久久自在自线精品自| 一本大道无码日韩精品影视| 精品人妻V?出轨中文字幕| segui久久国产精品| 无码精品一区二区三区免费视频| 国产精品揄拍100视频| 无码人妻精品一区二区三区66 | 国产精品久久久久久福利69堂| 99久久这里只有精品| 黑人巨大精品欧美| 精品无码人妻一区二区三区品| 亚洲国产精品国自产拍AV| 午夜精品久久久久9999高清| 欧美 日韩 精品 另类视频| 久久精品国产亚洲av瑜伽| 国产在线精品一区二区三区不卡| 国产精品麻豆VA在线播放|