SpringBoot實踐(三)整合Redis

一:配置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
"李銀河"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章