一、配置文件
<!-- 加載Properties文件 -->
<bean id="configurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath*:config.properties</value>
</list>
</property>
<property name="ignoreUnresolvablePlaceholders" value="true"/>
</bean>
<!-- 配置JedisPoolConfig實例 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<!--最大空閑數(shù),數(shù)據(jù)庫連接的最大空閑時間顽聂。超過空閑時間乘综,數(shù)據(jù)庫連接將被標(biāo)記為不可用,然后被釋放面氓。設(shè)為0表示無限制-->
<property name="maxIdle" value="300" />
<!--連接池的最大數(shù)據(jù)庫連接數(shù)。設(shè)為0表示無限制-->
<property name="maxTotal" value="600" />
<!--最大建立連接等待時間蛆橡。如果超過此時間將接到異常舌界。設(shè)為-1表示無限制-->
<property name="maxWaitMillis" value="1000" />
<!--在borrow一個jedis實例時,是否提前進(jìn)行alidate操作泰演;如果為true呻拌,則得到的jedis實例均是可用的-->
<property name="testOnBorrow" value="true" />
<!--每次逐出檢查時 逐出的最大數(shù)目 如果為負(fù)數(shù)就是 : 1/abs(n), 默認(rèn)3-->
<property name="numTestsPerEvictionRun" value="3"/>
<!--逐出連接的最小空閑時間 默認(rèn)1800000毫秒(30分鐘)-->
<property name="minEvictableIdleTimeMillis" value="300000"/>
<!--逐出掃描的時間間隔(毫秒) 如果為負(fù)數(shù),則不運行逐出線程, 默認(rèn)-1-->
<property name="timeBetweenEvictionRunsMillis" value="60000"/>
<!--在空閑時檢查有效性, 默認(rèn)false -->
<property name="testWhileIdle" value="true" />
</bean>
<!-- 配置JedisConnectionFactory,類似于數(shù)據(jù)庫的連接池 -->
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="${redis.host}"></property>
<property name="port" value="${redis.port}"></property>
<property name="password" value="${redis.password}"></property>
<property name="database" value="${redis.dbIndex}"></property>
<property name="poolConfig" ref="jedisPoolConfig"></property>
<property name="timeout" value="100000"></property>
</bean>
<!-- 配置RedisTemplate -->
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="jedisConnectionFactory"></property>
<!--如果不配置Serializer,那么存儲的時候缺省使用String睦焕,如果用User類型存儲柏锄,那么會提示錯誤User can't cast to StringD鸺! -->
<property name="keySerializer" >
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
</property>
<property name="valueSerializer" >
<bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer" />
</property>
<property name="hashKeySerializer">
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
</property>
<property name="hashValueSerializer">
<bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer"/>
</property>
<!--開啟事務(wù) -->
<property name="enableTransactionSupport" value="true"></property>
</bean>
注:可以看到我redis的配置中趾娃,對于hash的key使用的是StringRedisSerializer序列化缭嫡,而對于value使用的是GenericJackson2JsonRedisSerializer序列化。
二抬闷、坑一
// 源代碼
HashOperations ho = redisTemplate.opsForHash();
Boolean flag = ho.hasKey(“key”, "key1");
if (flag) {
// 處理邏輯
}
上面這段代碼妇蛀,當(dāng)redis中值不存在時,按照官方的說明文檔笤成,應(yīng)該返回false评架。但是我使用的時候,hasKey方法時而返回的是null炕泳,時而返回的false纵诞,導(dǎo)致空指針異常。搞了半天我也沒搞明白為啥返回false培遵,最后沒辦法我妥協(xié)了(大神如果知道可以回復(fù)我)浙芙。
// 妥協(xié)后代碼
HashOperations ho = redisTemplate.opsForHash();
Boolean flag = ho.hasKey(“key”, "key1");
if (flag != null && flag) {
// 處理邏輯
}
三、坑二
// 將Map放到redis的hash中
public void putRedisHash1(){
HashOperations ho = redisTemplate.opsForHash();
Map<String, Boolean> tempMap = new HashMap<String, Boolean>(3){{
put("isRegistered",false);
put("isWeChat",false);
put("isAliPay",false);
}};
ho.put("key", "key1", tempMap);
}
// 將Map放到redis的hash中
public void putRedisHash2(){
HashOperations ho = redisTemplate.opsForHash();
Map<String, Boolean> tempMap = new HashMap<String, Boolean>(3);
tempMap.put("isRegistered",false);
tempMap.put("isWeChat",false);
tempMap.put("isAliPay",false);
ho.put("key", "key1", tempMap);
}
這兩個方法的功能是一樣的籽腕,但是第一個方法是在Map初始化同時將值放入其中嗡呼,第二個方法是Map初始化以后將值放入其中,執(zhí)行結(jié)果是一樣皇耗,但是在redis中的存儲形式完全不同南窗。由于Hash的value使用的是GenericJackson2JsonRedisSerializer序列化,所以為了反序列化方便郎楼,它會存儲
@class“”這個字段万伤,由于Map初始化時機不同,導(dǎo)致相同內(nèi)容在redis中@class內(nèi)容不一致呜袁,為了使用方便敌买,推薦第二種,即在Map初始化以后將值放入其中傅寡。