一:配置Redis服務器
在springboot中配置redis服務器很簡單,只要把相應的配置寫在配置文件裏面(比如application.properties):
#Redis配置
#Matser的ip地址
redis.hostName=192.168.1.110
spring.redis.host=192.168.1.110
#端口號
spring.redis.port=6379
#如果有密碼
#redis.password=123456
#客戶端超時時間單位是毫秒 默認是2000
spring.redis.timeout=10000
#最大空閒數
spring.redis.jedis.pool.max-idle=300
#連接池的最大數據庫連接數。設爲0表示無限制,如果是jedis 2.4以後用redis.maxTotal
#redis.maxActive=600
#控制一個pool可分配多少個jedis實例,用來替換上面的redis.maxActive,如果是jedis 2.4以後用該屬性
redis.maxTotal=1000
#最大建立連接等待時間。如果超過此時間將接到異常。設爲-1表示無限制。
redis.maxWaitMillis=1000
#連接的最小空閒時間 默認1800000毫秒(30分鐘)
redis.minEvictableIdleTimeMillis=300000
#每次釋放連接的最大數目,默認3
redis.numTestsPerEvictionRun=1024
#逐出掃描的時間間隔(毫秒) 如果爲負數,則不運行逐出線程, 默認-1
redis.timeBetweenEvictionRunsMillis=30000
#是否在從池中取出連接前進行檢驗,如果檢驗失敗,則從池中去除連接並嘗試取出另一個
redis.testOnBorrow=true
#在空閒時檢查有效性, 默認false
redis.testWhileIdle=true
可以根據自己需求添加和修改相關的配置,添加了這些屬性之後,在springboot啓動的時候會創建有關Redis的操作對象,比如:RedisConnectionFactory類,RedisTemplate,StringRedisTemplate等常用的Redis對象.
二:修改RedisTemplate默認屬性
我們都知道spring中操作基本redis都是通過RedisTemplate來進行的,但是根據配置文件配置redis來生成的RedisTemplate往往不能滿足要求,比如:RedisTemplate的默認的序列化器是:JdkSerializationRedisSerializer。這樣Redis服務器存入的的就是經過序列化後的特殊字符串,有時候對於我們查看並不方便,如果使用默認的序列化器,則我們存入的key值會變成下面的樣子:
127.0.0.1:6379> keys *
1) "\xac\xed\x00\x05t\x00\x06test03"
2) "\xac\xed\x00\x05t\x00\x06test04"
這是因爲Redis是一種基於字符串存儲的NoSql,而java是基於對象的語言,對象是無法存儲到Redis中的,不過Java提供了序列化機制,只要類實現了java.io.Serializable接口,就代表類的對象可以進行序列化,通過將類的對象進行序列化就能夠得到二進制字符串,這樣Redis就可以將這些類對象以字符串的格式進行存儲。Java也可以將這些二進制字符串進行反序列化來得到對象。Spring給我提供了一些序列化器讓我們可以自定義序列化的方式,這些序列化方式通過RedisTemplate來設置。
RedisTemplate中提供瞭如下的一些序列化器的屬性
屬性 | 描述 | 備註 |
---|---|---|
defaultSerializer | 默認序列化器 | 如果沒設置,則使用JdkSerializationRedisSerializer |
keySerializer | Redis鍵序列化器 | 如果沒設置,則使用默認序列化器 |
valueSerializer | Redis值序列化器 | 如果沒設置,則使用默認序列化器 |
hashKeySerializer | Redis散列結構field序列化器 | 如果沒設置,則使用默認序列化器 |
hashValueSerializer | Redis散列結構value序列化器 | 如果沒設置,則使用默認序列化器 |
stringSerializer | 字符串序列化器 | RedisTemplate自動賦值爲StringRedisSerializer |
我們在Java配置中設置我們自己的序列化器如下(注意備註信息!):
/**
*springboot默認的redisTemplate添加了@ConditionOnMissingBean所以,如果自定義了,默認的就不會加載
*/
@Bean
@SuppressWarnings("all")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new
Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key採用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
// hash的key也採用String的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
// value序列化方式採用jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
// hash的value序列化方式採用jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
設置上面的屬性之後,再看我們的存入的key值變成如下內容:
127.0.0.1:6379> keys *
1) "test04"
2) "test03"
這是對於key:value中的key的設置,上述代碼中也對value的序列化進行設置,設置內容見下。
三:設置中文序列化
如果我們的value裏面包含了中文內容,而我們想看到完整正確的value內容,需要增加valueSerializer的設置。如上設置的jackson2JsonRedisSerializer。但是你可能加上這個配置去Redis後臺去查看的時候還是會看到如下的情況:
127.0.0.1:6379> get test03
"\xac\xed\x00\x05t\x00\t\xe4\xbd\xa0\xe5\xa5\xbd\xe5\x95\x8a"
這種時候並不是設置沒有起作用的原因,而是Redis服務器的啓動的時候需要添加 -- raw 參數,它能讓數據按原格式輸出,不顯示多餘的內容,也能使中文顯示。啓動命令如下:
./redis-cli --raw
啓動之後再查詢如下:
127.0.0.1:6379> get test03
"李銀河"