ç¸å ³é 读
ãå°å®¶javaãjava5æ°ç¹æ§ï¼ç®è¿°å大æ°ç¹æ§ï¼ éè¦ä¸è·
ãå°å®¶javaãjava6æ°ç¹æ§ï¼ç®è¿°å大æ°ç¹æ§ï¼ 鸡èå级
ãå°å®¶javaãjava7æ°ç¹æ§ï¼ç®è¿°å «å¤§æ°ç¹æ§ï¼ 䏿¸©ä¸ç«
ãå°å®¶javaãjava8æ°ç¹æ§ï¼ç®è¿°å大æ°ç¹æ§ï¼ 饱åèµèª
ãå°å®¶javaãjava9æ°ç¹æ§ï¼ç®è¿°å大æ°ç¹æ§ï¼ è¤è´¬ä¸ä¸
ãå°å®¶javaãjava10æ°ç¹æ§ï¼ç®è¿°å大æ°ç¹æ§ï¼ å°æ¥è¿ä»£
ãå°å®¶javaãjava11æ°ç¹æ§ï¼ç®è¿°å «å¤§æ°ç¹æ§ï¼ é¦ä¸ªéç£ LTSçæ¬
æ¯ç¯ä¸å¥
stay hungry , stay foolish
åè¨
ä¸ä¸ç¯å·²ç»ä»ç»äºä¼é çæä½Redisï¼
ãå°å®¶SpringãSpring Bootä¸ä½¿ç¨RedisTemplateä¼é çæä½Redisï¼å¹¶ä¸è§£å³RedisTemplateæ³åæ³¨å ¥çé®é¢ãæ¬ç¯çéä»ç»ä¸ä¸å ç§å¸¸ç¨çåºååæ¹å¼
æè¿å¨åä¸ä¸ªé¡¹ç®ï¼ç±äºå¹¶åé大ï¼å¤§é使ç¨å°äº
RedisTemplate
æ¥æä½Redisãä½ä½¿ç¨è¿ç¨ä¸ï¼éå°äºä¸å°çåï¼åç§ç¿»çæºç æ¥è·è¸ªï¼ä¹æ»ç»åºäºä¸å°çç»éªã
å æ¤ä»å¤©ä¸é¨åä¸ç¯ä¸ææ¥è®°å½è¿äºåï¼ä¹å ·ä½è¯´è¯´
RedisTemplate
çåç§åºååæ¹å¼ç差弿§ã叿坹大家ä¹è½ææå¸®å©ï¼å¸®å©å¤§å®¶è§£å³ä¸äºçæ
- åºååé®é¢
-
å¨éå°å¤æç±»åçè¿åºååæ¶ï¼å³ä½¿å äºæ³åï¼è·åå°çæ¶æºç±»å为RedisTemplate
LinedHashMap
ï¼éè¦å¾å°ç»æå忬¡è¿åºååï¼ä¸ç¶ä¼æ¥ç±»å转æ¢å¼å¸¸ã
å¦ä¸ï¼è¿æ ·å¤çææ¯å®å ¨çï¼
【小家Spring】Redis序列化、RedisTemplate序列化方式大解读,介绍Genericjackson2jsonredisserializer序列化器的坑关注A哥 - 卿§è¡åºååçæ¶åï¼æä½ç妿æ¯Beanï¼å¿ é¡»æé»è®¤æé å¨ï¼å¦åæ¥é
- redisé群é®é¢ï¼å ³äºé群çè¿å 个é®é¢ï¼åç»å¨ä¸é¨æ¼ç¤ºåè§£éï¼
- å¦æè¿æ¥ç为Redisé群ï¼åä¸è½ç¨ç®¡éçæ¹æ³ï¼é¤éæ¹å管éçç±»
- æ¨¡ç³æ¥è¯¢çæ¶åéè¦è·åå°ææçnodeä¿¡æ¯ï¼ä¾æ¬¡æ¥è¯¢
Springæä¾çåºååæ¹å¼
仿ºç éçï¼
æä»¬å¯ä»¥å¾æ¸ æ°ççå°ï¼Spring为æä»¬æä¾äº
6ç§
ä¸åçåºååæ¹å¼ã
ç¹å«è¯´æä¸ä¸ï¼å¦æä½ æ¯å¨
Spring Boot1.5.x
ç¯å¢ä¸ä½¿ç¨ï¼ä½ å¯è½çå°æ¯9ç§å®ç°æè æ¯7ç§å®ç°ï¼å¦ä¸å¾æç¤º
è§£éï¼
å ³äºåé¢ä¸¤ä¸ªï¼å¹¶éSpring宿¹æä¾ï¼èæ¯ç±alibabaç
FastJson
èªå·±å®ç°çãæä»¬çç
FastJson
çå ç»æï¼åç°å®å¾å好çæä¾äºä¸äºå¸¸ç¨ç转åå¨ï¼
å æ¤æ¤å¤ææ¶ä¸åè¿å¤æè¿°ï¼åé¢å说ã
å¦å¤è¿æä¸ä¸ª
JacksonJsonRedisSerializer
ç±»ï¼è¢«æ è®°ä¸ºè¿æãèè¿ä¸ªç±»å¨SpringBoot2.0å°±ç´æ¥è¢«ç§»é¤æäºï¼å æ¤ä»¥åççæ¬ä¸ç¨çä¼äºã
ä¸é¢ä¸»è¦ä»ç»ä¸ä¸ï¼Spring宿¹ç°å¨è¿åå¨ç6大åºååå¨ï¼
Genericåè¯ææï¼ä¸è¬ç; éç¨çï¼ç±»çï¼å±æ§ç;
-
以xmlæ ¼å¼åå¨ï¼ä½è¿æ¯Stringç±»å~ï¼ï¼è§£æèµ·æ¥ä¹æ¯è¾å¤æï¼æç乿¯è¾ä½ãå æ¤å 乿²¡æäººåä½¿ç¨æ¤æ¹å¼äºOxmSerializer
-
仿ºç éå¯ä»¥çåºï¼è¿æ¯RestTemplateç±»é»è®¤çåºååæ¹å¼ãè¥ä½ 没æèªå®ä¹ï¼é£å°±æ¯å®äºãJdkSerializationRedisSerializer
@Override
public void afterPropertiesSet() {
super.afterPropertiesSet();
boolean defaultUsed = false;
if (defaultSerializer == null) {
defaultSerializer = new JdkSerializationRedisSerializer(
classLoader != null ? classLoader : this.getClass().getClassLoader());
}
...
使ç¨JDKèªå¸¦çåºååæ¹å¼ï¼æææ¾ç缺ç¹ï¼
é¦å å®è¦æ±åå¨ç对象é½å¿ é¡»å®ç°
java.io.Serializable
æ¥å£ï¼æ¯è¾ç¬¨é
å ¶æ¬¡ï¼ä»åå¨ç为äºè¿å¶æ°æ®ï¼è¿å¯¹å¼åè æ¯ä¸å好ç
忬¡ï¼å 为ä»åå¨ç为äºè¿å¶ã使¯ææ¶åï¼æä»¬çRedisä¼å¨ä¸ä¸ªé¡¹ç®çå¤ä¸ªprojectä¸å ±ç¨ï¼è¿æ ·å¦æåä¸ä¸ªå¯ä»¥ç¼åç对象å¨ä¸åçprojectä¸è¦ä½¿ç¨ä¸¤ä¸ªä¸åçkeyæ¥åå«ç¼åï¼æ¢éº»ç¦ï¼å浪费ã
使ç¨JDKæä¾çåºåååè½ã ä¼ç¹æ¯ååºååæ¶ä¸éè¦æä¾ï¼ä¼ å ¥ï¼ç±»åä¿¡æ¯(class)ï¼ä½ç¼ºç¹æ¯éè¦å®ç°Serializableæ¥å£ï¼è¿æåºåååçç»æé常åºå¤§ï¼æ¯JSONæ ¼å¼ç5åå·¦å³ï¼è¿æ ·å°±ä¼æ¶èredisæå¡å¨ç大éå åã
@Autowired
private RedisTemplate redisTemplate;
@Test
public void contextLoads() {
ValueOperations<String, Person> valueOperations = redisTemplate.opsForValue();
valueOperations.set("aaa", new Person("fsx", 24));
Person p = valueOperations.get("aaa"); //Person(name=fsx, age=24)
System.out.println(p);
}
åå¨ç为äºè¿å¶ï¼æ ¹æ¬å¼ä¸åºæ¥æ¯ä»ä¹ï¼å¯¹å¼åè è°è¯ä¹å¾ä¸å好
-
StringRedisSerializer
乿¯StringRedisTemplateé»è®¤çåºååæ¹å¼ï¼keyåvalueé½ä¼éç¨æ¤æ¹å¼è¿è¡åºååï¼æ¯è¢«æ¨è使ç¨çï¼å¯¹å¼åè å好ï¼è½»éçº§ï¼æç乿¯è¾é«ã
ï¼ä¾åç¥ï¼
-
ä»éè¦è°ç¨è ç»ä¼ ä¸ä¸ªå¯¹è±¡å°å符串äºè½¬çConverterï¼ç¸å½äºè½¬æ¢ä¸ºå符串çæä½äº¤ç»è½¬æ¢å¨å»åï¼ï¼ä¸ªäººè§å¾ä½¿ç¨èµ·æ¥å ¶æ¯è¾éº»ç¦ï¼è¿ä¸å¦ç´æ¥ç¨å符串å¢ãæä»¥ä¸å¤ªæ¨è使ç¨GenericToStringSerializer
åé¢ä¸¤ç§åºå忹弿¯éç¹
-
ä»ååå¯ä»¥çåºæ¥ï¼è¿æ¯æä¸ä¸ªå¯¹è±¡ä»¥Jsonçå½¢å¼åå¨ï¼æçé«ä¸å¯¹è°ç¨è å好Jackson2JsonRedisSerializer
ä¼ç¹æ¯é度快ï¼åºåååçå符串çå°ç²¾æï¼ä¸éè¦å®ç°Serializableæ¥å£ã
ä½ç¼ºç¹ä¹é常è´å½ï¼é£å°±æ¯æ¤ç±»çæé 彿°ä¸æä¸ä¸ªç±»ååæ°ï¼å¿ é¡»æä¾è¦åºåå对象çç±»åä¿¡æ¯(.class对象)ã éè¿æ¥çæºä»£ç ï¼åç°å ¶å¨ååºååè¿ç¨ä¸ç¨å°äºç±»åä¿¡æ¯ï¼å¿ é¡»æ ¹æ®æ¤ç±»åä¿¡æ¯å®æååºååï¼ã
-
åºæ¬åä¸é¢çJackson2JsonRedisSerializeråè½å·®ä¸å¤ï¼ä½¿ç¨æ¹å¼ä¹å·®ä¸å¤ï¼GenericJackson2JsonRedisSerializer
**使¯æ¯æ¨è使ç¨ç**
éè¦æ³¨æï¼ï¼ä½¿ç¨åºå«ï¼
@Test
public void contextLoads() {
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
//ValueOperations<String, String> valueOperations = stringRedisTemplate.opsForValue();
//æ¤å¤æ³å å 为ç¼è¯å¨æ æ³æ ¡éª æä»¥å¦ævalueåºå忹弿¯å符串 ä¸é¢å°±ä¼æ¥éäº
ValueOperations<String, Person> valueOperations = redisTemplate.opsForValue();
valueOperations.set("key", new Person("fsx", 24)); //java.lang.ClassCastException: com.fsx.run2.bean.Person cannot be cast to java.lang.String
Person value = valueOperations.get("key");
System.out.println(value);
}
å¦ä¸ï¼å妿valueçåºååæ¹å¼è®¾ç½®ä¸ºStringåºååå¨ã使¯setå¼çæ¶åæ¾å¯¹è±¡äºãè¿ä¸ªæ¶åå°±ç´æ¥æ¥éäºï¼å¹¶ä¸ä¼èªå¨è°ç¨toString()æ¹æ³ï¼æ¤å¤ä¸å®è¦æ³¨æã
è¿éè¦ç¹å«æ¯åå§åRestTemplateçæ¶åï¼valueçåºååæ¹å¼ç¦æ¢ä½¿ç¨æç±»åååçStringRedisSerializer
ãè¥æéè¦ï¼ä½ ç´æ¥ä½¿ç¨
StringRedisTemplate
æä½å³å¯
Jackson2JsonRedisSerializeråGenericJackson2JsonRedisSerializerçå¼å
Jackson2JsonRedisSerializer
ï¼ä¸ºæä»¬æä¾äºä¸¤ä¸ªæé æ¹æ³ï¼ä¸ä¸ªéè¦ä¼ å ¥åºåå对象Classï¼ä¸ä¸ªéè¦ä¼ å ¥å¯¹è±¡çJavaType:
public Jackson2JsonRedisSerializer(Class<T> type) {
this.javaType = getJavaType(type);
}
public Jackson2JsonRedisSerializer(JavaType javaType) {
this.javaType = javaType;
}
è¿ç§çåå¤ï¼å¾æ¾ç¶ï¼æä»¬å°±ä¸è½å ¨å±ä½¿ç¨ç»ä¸çåºååæ¹å¼äºï¼èæ¯æ¯æ¬¡è°ç¨RedisTemplateåï¼é½éè¦ç±»ä¼¼è¿ä¹å¤çï¼
redisTemplate.setKeySerializer(RedisSerializerType.StringSerializer.getRedisSerializer());
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Person.class));
ä½å 为redisTemplateæä»¬é½æ¯åä¾çï¼æä»¥è¿æ ·è®¾ç½®æ¾ç¶æ¯é常ä¸å¯åçè¡ä¸ºãè½ç¶å®æå¥½å¤~~~~~~~~~~
è¿ç§åºååæ¹å¼ç好å¤ï¼ä»è½å®ç°ä¸åçProjectä¹é´æ°æ®äºéï¼å 为没æ@classä¿¡æ¯ï¼æä»¥åªè¦å段åç¸åå³å¯ï¼ï¼å ä¸ºå ¶å®å°±æ¯Jsonçè¿åºååï¼åªè¦ä½ æå®äºç±»åï¼å°±è½ååºååæåï¼å 为å®åå åæ å ³ï¼
使ç¨è¿ç§Jsonåºååæ¹å¼æç¶æ¯å¯ä»¥æåçå¨ä¸åprojectä¸è¿è¡åºåååååºååçã使¯ï¼ä½æ¯ï¼ä½æ¯ï¼å¨å®é ç使ç¨ä¸ï¼æä»¬å¸æèè´£åä¸åé«å èçï¼æä»¥å¹¶ä¸å¸ææä»¬åå¨ç对象ï¼å ¶å®æå¡å¯ä»¥ç´æ¥è®¿é®ï¼é£æ ·å°±é常ä¸å¥½æ§å¶äºï¼å æ¤æ¤ç§æ¹å¼ä¹ä¸å»ºè®®ä½¿ç¨~
GenericJackson2JsonRedisSerializer
ï¼è¿ç§åºååæ¹å¼ä¸ç¨èªå·±æå¨æå®å¯¹è±¡çClassãæä»¥å ¶å®æä»¬å°±å¯ä»¥ä½¿ç¨ä¸ä¸ªå ¨å±éç¨çåºååæ¹å¼äºã使ç¨èµ·æ¥å
JdkSerializationRedisSerializer
åºæ¬ä¸æ ·ã
åæ ·ç
JdkSerializationRedisSerializer
ä¸è½åºåååååºååä¸åå è·¯å¾å¯¹è±¡çæ¯ç å®ä¹æãå 为å®åºååä¹åçå å®¹ï¼æ¯åå¨äºå¯¹è±¡çclassä¿¡æ¯çï¼
========> Jackson2JsonRedisSerializerçåï¼
å卿®éå¯¹è±¡çæ¶åæ²¡æé®é¢ï¼ä½æ¯å½æä»¬åå¨å¸¦æ³åçListçæ¶åï¼ååºå就伿¥éäºï¼
@Test
public void contextLoads() {
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(List.class));
ValueOperations<String, List<Person>> valueOperations = redisTemplate.opsForValue();
valueOperations.set("aaa", Arrays.asList(new Person("fsx", 24), new Person("fff", 30)));
List<Person> p = valueOperations.get("aaa");
System.out.println(p); //[{name=fsx, age=24}, {name=fff, age=30}]
List<Person> aaa = (List<Person>) redisTemplate.opsForValue().get("aaa");
System.out.println(aaa); //[{name=fsx, age=24}, {name=fff, age=30}]
}
ç»è®ºï¼ç½ä¸å¾å¤å¸åé½è¯´è¿æ ·ä¼åºé®é¢ï¼ä½æå®éªè¿ååç°ä¸ä¼æé®é¢ãæ¶é´æéï¼æè¿ä¸ªæ¯åºäºSpring Boot2.1è¿è¡æµè¯çï¼è¥ä½ 们æµè¯ççæ¬æé®é¢ï¼æ¬¢è¿åç¥æï¼æååè¿ä¸æ¥çéªè¯ï¼å¤è°¢ã
========> GenericJackson2JsonRedisSerializerçåï¼
@Test
public void contextLoads() {
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
ValueOperations<String, Long> valueOperations = redisTemplate.opsForValue();
valueOperations.set("aaa", 1L);
//Long p = valueOperations.get("aaa"); //转æ¢å¼å¸¸ java.lang.Integer cannot be cast to java.lang.Long
Object p = valueOperations.get("aaa");
System.out.println(p);
}
**å1ï¼**æ³åéææè¿åçå°±æ¯Longç±»åï¼ä½ä½ ç¨Longæ¥ï¼å°±ç´æ¥æåºè½¬æ¢å¼å¸¸äº
ä»ä¸å¾ä¸æä»¬å¯ä»¥æ¸ æ°ççè§ï¼getåºæ¥è¿åççå®ç±»åç«ç¶æ¯
Integer
ç±»åï¼æä»¥å¼ºè½¬è¯å®æ¥éå
åçä¸ä¾ï¼setç±»å
@Test
public void contextLoads() {
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
SetOperations<String, Long> setOperations = redisTemplate.opsForSet();
setOperations.add("bbb", 1L);
setOperations.add("bbb", 2L);
Set<Long> p = setOperations.members("bbb");
System.out.println(p);
}
æä»¬åç°ï¼éé¢è£ çç«ç¶ï¼ç«ç¶æ¯Integerç±»åãè¿ç§Javaæ³åçbugæä»¬å¨ä¹åçåæéæè®²è¿°è¿ï¼ç¹å«åãè¿ä¸ªæ¶åè¿ä¸ªåéå°±æ¯ä¸ªå°é·ï¼åªè¦ä¸ç¢°ï¼å°±æ¥é
å¦å¤ï¼å°±ç®ä½ è·åç并䏿¯Listç±»åï¼èæ¯ä¸ä¸ªå¼ï¼ä¹å¿ é¡»è¦è½¬æ¢ä¸ä¸ï¼å¦åç±»å转æ¢å¼å¸¸ãåä¸é¢è¿ä¹æä½ææ¯å®å ¨çï¼
Object teaIdObj = setOperLong.pop(teaCategoryKey);
if (teaIdObj != null) {
log.info("ä»redisèå¸ä»åº{}éæ¿å°äºä¸ä¸ªèå¸{}", teaCategoryKey, teaIdObj);
teacherIds.add(Long.parseLong(teaIdObj.toString()));
}
ç±»å转æ¢å¼å¸¸åå åæ
å 为
GenericJackson2JsonRedisSerializer
è¿ç§åºååæ¹å¼å®å¨æ¯å¤ªéç¨äºï¼æä»¥æè¿æ¯å¸ææ¾åºåå ï¼è§£å³è¿ä¸ªé®é¢çãå æ¤æå°±è·è¸ªæºç ï¼ççå°åºæ¯åªéåºäºé®é¢ï¼
æ§è¡
setOperations.members("bbb")
è¿å¥æç»é½å°äº
RedisTemplateçexecute
æ¹æ³ï¼
æ¹æ³ä½çè¿ä¸è¡ï¼è§£æäºè¿åçvalueå¼ï¼
tipsï¼Spring Boot1.xæ¤å¤connToExpose使ç¨çæ¯jedisçï¼èBoot2.x使ç¨çæ¯Lettuceçäºã使¯å¯¹è°ç¨è æ¯éæçï¼å¯è°é常å好
ç»§ç»è·è¸ªåç°ï¼æç»ä¼è°ç¨æä»¬é 置好çåºååå¨è¿è¡åºååï¼
V deserializeValue(byte[] value) {
if (valueSerializer() == null) {
return (V) value;
}
return (V) valueSerializer().deserialize(value);
}
å æ¤å¥é½ä¸è¯´äºï¼å°
GenericJackson2JsonRedisSerializer
å»ççå®ç
deserialize
æ¹æ³å§ï¼å°±å¨è¿ä¸å¥è¯ï¼
// è°ç¨äºjacksonçObjectMapperæ¹æ³è¿è¡è¿åºåå 使¯type为Object.class
return mapper.readValue(source, type);
ä¸ºä½æçæ³åç±»å丢失äºå¢ï¼åä¸è¿½æº¯ä¸æ¥ï¼æä»¬åç°ï¼
static <T extends Collection<?>> T deserializeValues(@Nullable Collection<byte[]> rawValues, Class<T> type,
@Nullable RedisSerializer<?> redisSerializer) {
// connection in pipeline/multi mode
if (rawValues == null) {
return (T) CollectionFactory.createCollection(type, 0);
}
Collection<Object> values = (List.class.isAssignableFrom(type) ? new ArrayList<>(rawValues.size())
: new LinkedHashSet<>(rawValues.size()));
for (byte[] bs : rawValues) {
values.add(redisSerializer.deserialize(bs));
}
return (T) values;
}
æä»¬çç±»åå ¨é¨åæäº
Collection
éé¢ç
Object
ç±»åï¼æä»¬çæ³åå°±è¿æ ·ä¸¢å¤±äº
ãæä»¥å¨åºååçæ¶åï¼åªè¦éå°æ°åï¼æè æ³åï¼ï¼èªç¶å°±æ¯å½ä½Integeræ¥å¤çäºï¼å æ¤å°±åºç°äºæä»¬çå°ç诡å¼ç°è±¡ã
å 为
GenericJackson2JsonRedisSerializer
æ¬æ¥å¤çåºååç齿¯ä¸ç±»åæ å ³çï¼æä»¥é½è½¬æ¢ä¸ºObjectè¿è¡å¤çãå æ¤åºç°æ¤ç§ç°è±¡ä¹æ¯å¨æ çä¹ä¸çã
è§£å³æ¹æ¡
æ¢ç¶ä½ éè¦
GenericJackson2JsonRedisSerializer
å®çéç¨æ§ï¼é£ä¹ä½ 就徿¥åä»åªè½å¤çObjectç±»åã
å æ¤å¨ä½¿ç¨çæ¶åéä¸è¿ç§æ åµï¼éè¦ç¨å 注æäºãæä»¬å¯ä»¥å ç¨Objectæ¥æ¶ï¼ç¶å转æå符串åè°ç¨Long.valueOf()æ¹æ³å»é´æ¥å®ç°ãããæè ä½ å¨ä½¿ç¨åæå¨æå®åºååç±»åï¼ä½ååãååä¸å»ºè®®è¿ä¹å»å
å®å¤çListãSetãLongç±»åçé½ä¼æç±»ä¼¼çé®é¢ã使ç¨çæ¶åç¨å 注æå³å¯ï¼å 为Javaä¸é»è®¤æ°åç±»åæ¯IntegerãDoubleçï¼
å½ç¶è¿æä¸ç§æ¹æ¡æ¯
èªå®ä¹åºååå¨
ï¼å¦èªå®ä¹Stringåºååå¨ï¼æ¥åä¸åç±»åï¼å®æ¹çæ³åéå¶äºåªæ¥åStringç±»åãè¿ä¹ä¸æ¥ï¼@Cacheableçæ³¨è§£çkeyæ¯æä¸ä» ä» æ¯Stringç±»åäºï¼:
/**
* å¿
é¡»éååºååå¨ï¼å¦å@Cacheable注解çkey伿¥ç±»å转æ¢é误
*/
public class StringRedisSerializer implements RedisSerializer<Object> {
private final Charset charset;
private final String target = "\"";
private final String replacement = "";
public StringRedisSerializer() {
this(Charset.forName("UTF8"));
}
public StringRedisSerializer(Charset charset) {
Assert.notNull(charset, "Charset must not be null!");
this.charset = charset;
}
@Override
public String deserialize(byte[] bytes) {
return (bytes == null ? null : new String(bytes, charset));
}
@Override
public byte[] serialize(Object object) {
//åºå±è¿æ¯è°ç¨çfastjsonçå·¥å
·æ¥æä½ç
String string = JSON.toJSONString(object);
if (string == null) {
return null;
}
string = string.replace(target, replacement);
return string.getBytes(charset);
}
}
顺便æä¸å¥ï¼åå
æµè¯çæ¶åå¯è½ç¢°ä¸è¿ä¸ªå¼å¸¸ï¼ WRONGTYPE Operation against a key holding the wrong kind of value
ï¼ä¸è¦æ
ãè¿ä¸ªæ¯å 为keyçç±»åä¸ä¸è´å¯¼è´ï¼ä¸è¬åªæå¨æµè¯æ
åµä¸æä¼åç**ãæ¯å¦ä¹åè¿ä¸ªkeyç¨ç¨ä½k-vçå½¢å¼ï¼ç°å¨æè¿ä¸ªkeyå½ä½setæ°æ®ç±»åæ¥ç¨ï¼å°±ä¼æ¥è¿ä¸ªéï¼æ¢ç»keyå°±è¡ã**
说æï¼çæçç¨å¾®ä¼äº
Jackson2JsonRedisSerializer
GenericJackson2JsonRedisSerializer
ï¼ä½æ¯ä½¿ç¨èµ·æ¥è¿æ²¡æGenericæ¹ä¾¿ã
åä½çå®å¯ä»¥æ ¹æ®èªå·±ä¸å¡çå®é æ åµï¼é æ éæ©å§~~~~
ç¬¬ä¸æ¹åºååå¨ï¼FastJsonRedisSerializerãKryoRedisSerializer
ç±äºRedisçæµè¡ï¼å¾å¤ç¬¬ä¸æ¹ç»ä»¶é½æä¾äºå¯¹åºçåºååå¨ãæ¯è¾èåçæé¿éå·´å·´ç
FastJsonRedisSerializer
è¿å¥½alié»è®¤å·²ç»å¸®æä»¬å®ç°äºåºäºfastjsonçåºååæ¹å¼ï¼æä»¬é½ä¸ç¨èªå·±å¨æäºã
FastJsonRedisSerialize
rå
GenericFastJsonRedisSerializer
åä¸é¢ä¸æ ·è®²è¿°ç䏿 ·ï¼
FastJsonRedisSerializer
éè¦æå®ååºååç±»åï¼è
GenericFastJsonRedisSerializer
忝è¾éç¨ãä½åæ ·çGenericç³»ååå¨ä¸é¢æè¯´çåæ ·çé®é¢ï¼å¤§å®¶ä½¿ç¨æ¶éè¦å¤å 注æã
KryoRedisSerializerï¼å®å°±æ²¡æè¿ä¹è¿ä¹å好äºï¼ä½èªå·±å®ç°ä¸ä¸ªä¹æ¯è½»èæä¸¾çäºï¼
public class KryoRedisSerializer<T> implements RedisSerializer<T> {
private Kryo kryo = new Kryo();
@Override
public byte[] serialize(T t) throws SerializationException {
System.out.println("[serialize]" + t);
byte[] buffer = new byte[2048];
Output output = new Output(buffer);
kryo.writeClassAndObject(output, t);
return output.toBytes();
}
@Override
public T deserialize(byte[] bytes) throws SerializationException {
System.out.println("[deserialize]" + Arrays.toString(bytes));
Input input = new Input(bytes);
@SuppressWarnings("unchecked")
T t = (T) kryo.readClassAndObject(input);
return t;
}
}
æå®RedisTemplateçåºååæ¹å¼
è¿ä¸ªå°±æ¯è¾ç®åäºï¼å¯ä»¥å¨æ³¨åBeançæ¶åå°±setï¼æ¨èï¼ï¼ä¹å¯ä»¥ä½¿ç¨çæ¶åååï¼é常é叏䏿¨èï¼ä¼æå¹¶åå®å ¨é®é¢ï¼
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 使ç¨Jackson2JsonRedisSerialize æ¿æ¢é»è®¤åºååï¼å¤æ³¨ï¼æ¤å¤æç¨Object为ä¾ï¼åä½çå®è¯·æ¢æèªå·±çç±»åå¦~ï¼
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
// 设置valueçåºååè§åå keyçåºååè§å
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setKeySerializer(new StringRedisSerializer());
// æå¥½æ¯è°ç¨ä¸ä¸è¿ä¸ªæ¹æ³
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
javaæºçåºååçæçå·²ç»é常é«äºï¼ä½æ¯kryoæ¯javaåçåºååæ§è½åå åï¼kryoåªé对javaè¯è¨ï¼ä¸è·¨è¯è¨ãè·¨è¯è¨çåºå忹弿ï¼ProtostuffãThriftçã æä»¥å¦æä½ æ³èªå®ä¹åºååå¨çè¯ï¼ä¸ªäººå»ºè®®å¯ä»¥å¯¼å ¥kryoå ï¼ç¶åèªå·±ä¹¦åä¸ä¸ªåºåå卿³¨åè¿å»~~~ï¼
å ³æ³¨Aå¥
Author | Aå¥(YourBatman) |
---|---|
个人ç«ç¹ | www.yourbatman.cn |
[email protected] | |
å¾® ä¿¡ | fsx641385712 |
| |
å ¬ä¼å· | BATç乿é¦ï¼IDï¼BAT-utopiaï¼ |
ç¥è¯æç | BATçä¹æé¦ |
æ¯æ¥æç« æ¨è | æ¯æ¥æç« æ¨è |