個人筆記僅供參考。
1、spring data redis推薦jedis,jedis是redis的java用戶端。
<dependency> <groupId>org.springframework.boot</groupId><!-- 會附帶引進jedis的包 --> <artifactId>spring-boot-starter-redis</artifactId> </dependency>
2、 RedisConnectionFactory
spring data redis串連到redis通過RedisConnectionFactory來獲得有效RedisConnection。RedisConnection負責建立和處理和redis後端通訊。RedisConnection提供getNativeconnection返回用來通訊的底層connection。
3、RedisTemplate
spring data redis支援低層次的通過連接器connector串連到Redis,支援高層次的友好的模板類RedisTemplate,RedisTemplate是建立在低層級的connection基礎之上。RedisConnection接收或返回位元組數組需要自身處理串連,比如關閉串連,而RedisTemplate負責處理序列化和反序列化,並且管理對串連進行管理。RedisTemplate提供操作視圖,比如(Bound)ValueOperations,(Bound)ListOperations,(Bound)SetOperations,(Bound)ZSetOperations,(Bound)HashOperations。RedisTemplate是安全執行緒的,能夠用於多個執行個體中。
RedisTemplate預設選擇java-based序列化,也可以切換為其它的序列化方式,或者設定enabledDefaultSerializer為false或者設定序列化器為null,則RedisTemplate用raw byte arrays表示資料。其它序列化方式有protocol buffer,JSON,帶有遞迴的二進位位元組流的方式等。
StringRedisTemplate是RedisTemplate的唯一子類。
RedisTemplate預設定義了兩個常用的序列化類別
private RedisSerializer<?> defaultSerializer = newJdkSerializationRedisSerializer(); 以及 private RedisSerializer<String> stringSerializer = newStringRedisSerializer();
4、序列化
在未配置序列化方式前,採用
redisTemplate.opsForValue().set(key, value);
得到的key和value將都是被序列化後的數字或符號,如
解決這個問題就需要將key和value序列化,如果是xml配置的
我們直接注入官方給定的keySerializer,valueSerializer,hashKeySerializer即可,那麼使用註解的話我們需要自己編寫RedisCacheConfig配置類
緩衝主要有幾個要實現的類:
1、CacheManager緩衝管理器;
2、具體操作實作類別;
3、CacheManager工廠類(這個可以使用設定檔配置的進行注入,也可以通過編碼的方式進行實現);
4、緩衝key生產策略(當然Spring內建建置原則,但是在Redis用戶端進行查看的話是系列化的key,對於我們肉眼來說就是感覺是亂碼了,這裡我們先使用內建的緩衝策略)。
/** * 緩衝管理(註解用) * @author Administrator */@Configuration@EnableCaching//啟用緩衝的意思public class CacheConfig extends CachingConfigurerSupport{ /** * 自訂key. 這個可以不用 * 此方法將會根據類名+方法名+所有參數的值產生唯一的一個key,即使@Cacheable中的value屬性一樣,key也會不一樣。 */ /* @Override public KeyGenerator keyGenerator() { System.out.println("RedisCacheConfig.keyGenerator()"); returnnew KeyGenerator() { @Override public Object generate(Object o, Method method, Object... objects) { // This will generate a unique key of the class name, the method name //and all method parameters appended. StringBuilder sb = new StringBuilder(); sb.append(o.getClass().getName()); sb.append(method.getName()); for (Object obj : objects) { sb.append(obj.toString()); } System.out.println("keyGenerator=" + sb.toString()); returnsb.toString(); } }; } */ @Bean public CacheManager cacheManager(RedisTemplate redisTemplate) { RedisCacheManager rcm = new RedisCacheManager(redisTemplate); /* //設定緩衝到期時間 // rcm.setDefaultExpiration(60);//秒 //設定value的到期時間 Map<String,Long> map=new HashMap(); map.put("test",60L); rcm.setExpires(map);*/ return rcm; } /** * RedisTemplate配置 * @param factory * @return */ @Bean public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) { StringRedisTemplate template = new StringRedisTemplate(factory); //定義key序列化方式 //RedisSerializer<String> redisSerializer = new StringRedisSerializer();//Long類型會出現異常資訊;需要我們上面的自訂key建置原則,一般沒必要 //定義value的序列化方式 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); // template.setKeySerializer(redisSerializer); template.setValueSerializer(jackson2JsonRedisSerializer); template.setHashValueSerializer(jackson2JsonRedisSerializer); template.afterPropertiesSet(); return template; }}