最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決RedisTemplate存儲(chǔ)至緩存數(shù)據(jù)出現(xiàn)亂碼的情況

 更新時(shí)間:2021年03月02日 14:57:23   作者:呢喃北上  
這篇文章主要介紹了解決RedisTemplate存儲(chǔ)至緩存數(shù)據(jù)出現(xiàn)亂碼的情況,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

前言

RedisTemplate是Spring對(duì)于Redis的封裝。

如上圖所示,RedisTemplate中定義了對(duì)5種數(shù)據(jù)結(jié)構(gòu)操作。

redisTemplate.opsForList();//操作list
redisTemplate.opsForValue();//操作字符串
redisTemplate.opsForCluster();//集群時(shí)使用
redisTemplate.opsForGeo();//地理位置時(shí)使用
redisTemplate.opsForHash();//操作hash
redisTemplate.opsForSet();//操作set
redisTemplate.opsForZSet();//操作有序set

與StringRedisTemplate的區(qū)別

StringRedisTemplate繼承RedisTemplate。

它們采用的序列化策略不同:

* StringRedisTemplate默認(rèn)采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。

* RedisTemplate默認(rèn)采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。

RedisTemplate和StringRedisTemplate它們存取的數(shù)據(jù)是相互獨(dú)立的。

解決辦法

上文已經(jīng)提及,在動(dòng)手的過(guò)程中,我采用的是RedisTemplate,在傳遞String類型的數(shù)據(jù)結(jié)構(gòu)后,查看緩存會(huì)發(fā)現(xiàn)數(shù)據(jù)亂碼現(xiàn)象。

這時(shí)候我們需要修改RedisTemplate的序列化策略。

RedisSerializer<String> stringSerializer = new StringRedisSerializer();
      redisTemplate.setKeySerializer(stringSerializer);
      redisTemplate.setValueSerializer(stringSerializer);
      redisTemplate.setHashKeySerializer(stringSerializer);
      redisTemplate.setHashValueSerializer(stringSerializer);

但是注意一點(diǎn),由于采用了String的序列化策略,所以只接受value值類型為String的參數(shù)。

如果像我一樣傳遞了Integer類型的參數(shù),直接使用toString()方法存入緩存。

ops.set("stock", redPacket.getStock().toString(),TIME_OUT, TimeUnit.SECONDS);

這樣就解決了亂碼問(wèn)題。

附:SpringBoot啟動(dòng)實(shí)例化配置

@Configuration
public class RedisConfigurtion {
  @Autowired
  private RedisTemplate redisTemplate;
  @Bean
  public RedisTemplate<String, Object> stringSerializerRedisTemplate() {
    RedisSerializer<String> stringSerializer = new StringRedisSerializer();
    redisTemplate.setKeySerializer(stringSerializer);
    redisTemplate.setValueSerializer(stringSerializer);
    redisTemplate.setHashKeySerializer(stringSerializer);
    redisTemplate.setHashValueSerializer(stringSerializer);
    return redisTemplate;
  }
}

補(bǔ)充:redis key和value的亂碼問(wèn)題解決,含日期轉(zhuǎn)化格式問(wèn)題

在項(xiàng)目中,遇到的問(wèn)題是redis的key和value出現(xiàn)的亂碼問(wèn)題:

而原本的內(nèi)容為下:

{
  "status":"success",
  "data":{
    "id":3,
    "title":"花林",
    "price":99,
    "stock":81,
    "description":"美女一只",
    "sales":17,
    "imgUrl":"https://xiaolei1996.oss-cn-shanghai.aliyuncs.com/blog/title/we1.jpg",
    "promoStatus":2,
    "promoPrice":50,
    "promoId":1,
    "startDate":"2020-03-23 21:50:59"
  }
}

原因:

是因?yàn)楹蛂edis內(nèi)部的編碼協(xié)議出現(xiàn)了問(wèn)題,所以需要改進(jìn)。spring提供了一個(gè)優(yōu)化方案。

springboot的redisTemplate改進(jìn)。

@Component
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 3600)
public class RedisConfig {
  @Bean
  public RedisTemplate redisTemplate(RedisConnectionFactory factory){
    RedisTemplate redisTemplate = new RedisTemplate();
    redisTemplate.setConnectionFactory(factory);
    //首先解決key的序列化問(wèn)題
    StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
    redisTemplate.setKeySerializer(stringRedisSerializer);
    //解決value的序列化問(wèn)題
    Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
    redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
    return redisTemplate;
  }
}

比之前好了,但是還有點(diǎn)小問(wèn)題,json的數(shù)據(jù)比以前多了,這是因?yàn)槿掌诘霓D(zhuǎn)化出現(xiàn)問(wèn)題,這塊的知識(shí)觸及盲區(qū),就先把解決方案寫(xiě)下面,以后有時(shí)間在研究。

public class JodaDateTimeJsonSerializer extends JsonSerializer<DateTime> {
  @Override
  public void serialize(DateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
    gen.writeString(value.toString("yyyy-MM-dd HH:mm:ss"));
  }
}
public class JodaDateTimeJsonDeserializer extends JsonDeserializer<DateTime> {
  @Override
  public DateTime deserialize(JsonParser p, DeserializationContext ctxt
  ) throws IOException, JsonProcessingException {
    String dateString= p.readValueAs(String.class);
    DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
    return DateTime.parse(dateString,dateTimeFormatter);//轉(zhuǎn)成
  }
}
@Component
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 3600)
public class RedisConfig {
  @Bean
  public RedisTemplate redisTemplate(RedisConnectionFactory factory){
    RedisTemplate redisTemplate = new RedisTemplate();
    redisTemplate.setConnectionFactory(factory);
    //首先解決key的序列化問(wèn)題
    StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
    redisTemplate.setKeySerializer(stringRedisSerializer);
    //解決value的序列化問(wèn)題
    Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
    redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
    //改進(jìn)日期轉(zhuǎn)化問(wèn)題
    ObjectMapper objectMapper = new ObjectMapper();
    SimpleModule simpleModule = new SimpleModule();
    simpleModule.addSerializer(DateTime.class,new JodaDateTimeJsonSerializer());
    simpleModule.addDeserializer(DateTime.class,new JodaDateTimeJsonDeserializer());
//解決反序列化問(wèn)題 objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
    objectMapper.registerModule(simpleModule);
    jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
    redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
    return redisTemplate;
  }
}

最后終于出現(xiàn)了預(yù)期的效果

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • SpringBoot中@Import注解如何正確使用

    SpringBoot中@Import注解如何正確使用

    這篇文章主要介紹了SpringBoot中@Import注解的使用方式,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-06-06
  • Spring MVC溫故而知新系列教程之從零開(kāi)始

    Spring MVC溫故而知新系列教程之從零開(kāi)始

    Spring MVC 框架在 Java 的 Web 項(xiàng)目中應(yīng)該是無(wú)人不知的吧,你不會(huì)搭建一個(gè) Spring 框架?作為身為一個(gè)剛剛學(xué)習(xí)Java的我都會(huì),如果你不會(huì)的話,那可真令人憂傷。下面這篇文章主要給大家介紹了關(guān)于Spring MVC從零開(kāi)始的相關(guān)資料,需要的朋友可以參考下
    2018-05-05
  • SpringMVC實(shí)現(xiàn)文件上傳與下載、攔截器、異常處理器等功能

    SpringMVC實(shí)現(xiàn)文件上傳與下載、攔截器、異常處理器等功能

    這篇文章主要給大家介紹了關(guān)于SpringMVC實(shí)現(xiàn)文件上傳與下載、攔截器、異常處理器等功能的相關(guān)資料,這些功能在我們?nèi)粘i_(kāi)發(fā)中經(jīng)常會(huì)遇到,本文通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-09-09
  • spring WebSocket示例詳解

    spring WebSocket示例詳解

    websocket是Html5新增加特性之一,目的是瀏覽器與服務(wù)端建立全雙工的通信方式,本篇文章主要介紹了spring WebSocket示例詳解 ,有興趣的可以了解一下。
    2017-01-01
  • SpringBoot?實(shí)現(xiàn)全局異常處理的示例代碼

    SpringBoot?實(shí)現(xiàn)全局異常處理的示例代碼

    本文主要介紹了SpringBoot實(shí)現(xiàn)全局異常處理,全局異常處理器的使用可以顯著提高Spring Boot項(xiàng)目的代碼質(zhì)量和可維護(hù)性,減少冗余代碼,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • Springboot手動(dòng)連接庫(kù)并獲取指定表結(jié)構(gòu)的示例代碼

    Springboot手動(dòng)連接庫(kù)并獲取指定表結(jié)構(gòu)的示例代碼

    這篇文章主要介紹了Springboot手動(dòng)連接庫(kù)并獲取指定表結(jié)構(gòu)的示例代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • 使用Java實(shí)現(xiàn)MapReduce詞頻統(tǒng)計(jì)示例代碼

    使用Java實(shí)現(xiàn)MapReduce詞頻統(tǒng)計(jì)示例代碼

    這篇文章主要介紹了使用Java實(shí)現(xiàn)MapReduce詞頻統(tǒng)計(jì)的相關(guān)資料,通過(guò)詞頻統(tǒng)計(jì)示例來(lái)展示MapReduce的運(yùn)行機(jī)制,涵蓋了Mapper和Reducer的實(shí)現(xiàn),并說(shuō)明了如何配置和執(zhí)行MapReduce作業(yè),需要的朋友可以參考下
    2024-11-11
  • SpringBoot執(zhí)行有返回值的異步任務(wù)問(wèn)題

    SpringBoot執(zhí)行有返回值的異步任務(wù)問(wèn)題

    這篇文章主要介紹了SpringBoot執(zhí)行有返回值的異步任務(wù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 基于spring如何實(shí)現(xiàn)事件驅(qū)動(dòng)實(shí)例代碼

    基于spring如何實(shí)現(xiàn)事件驅(qū)動(dòng)實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于基于spring如何實(shí)現(xiàn)事件驅(qū)動(dòng)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用spring具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Spring boot創(chuàng)建自定義starter的完整步驟

    Spring boot創(chuàng)建自定義starter的完整步驟

    這篇文章主要給大家介紹了關(guān)于Spring boot創(chuàng)建自定義starter的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09

最新評(píng)論

屯留县| 吉林省| 岚皋县| 沁阳市| 宁明县| 米脂县| 红桥区| 台东县| 托克托县| 东宁县| 江都市| 庐江县| 封丘县| 桦南县| 天祝| 芒康县| 独山县| 洪江市| 天峨县| 石狮市| 象山县| 武山县| 雅江县| 潮安县| 东光县| 长寿区| 辽宁省| 高雄市| 重庆市| 迁西县| 永州市| 丰宁| 宜黄县| 新昌县| 榆中县| 吉安市| 张家川| 浮梁县| 洛南县| 新绛县| 岳阳县|