解決使用redisTemplate set方法保存出現\x00\問題

来源:https://www.cnblogs.com/linyb-geek/archive/2020/06/17/13153775.html
-Advertisement-
Play Games

在項目有個需求要保存一個字元串到redis,並設置一個過期時間。這個需求一看非常簡單,使用redisTemplate一行代碼搞定,代碼如下 redisTemplate.opsForValue().set("userKey", data, 10000); 但保存後,查看redis發現value的首碼多 ...


在項目有個需求要保存一個字元串到redis,並設置一個過期時間。這個需求一看非常簡單,使用redisTemplate一行代碼搞定,代碼如下

redisTemplate.opsForValue().set("userKey", data, 10000); 

但保存後,查看redis發現value的首碼多出了

\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x

一開始以為是redis的序列化問題,於是就修改了redisTemplate的序列化方式,終於還是沒能解決問題。那問題出在哪裡?翻看源碼,發現redisTemplate.opsForValue().set()有重載方法,一個是

void set(K key, V value, long offset) 

另外一個是

void set(K key, V value, long timeout, TimeUnit unit)

調用set(K key, V value, long offset)這個方法,其底層調用的是redis的setrange命令,這個命令看官網介紹

Overwrites part of the string stored at key, starting at the specified offset, for the entire length of value. If the offset is larger than the current length of the string at key, the string is padded with zero-bytes to make offset fit. Non-existing keys are considered as empty strings, so this command will make sure it holds a string large enough to be able to set value at offset

其含義是從指定的偏移量開始,覆蓋整個值範圍內從key存儲的字元串的一部分。如果偏移量大於key處字元串的當前長度,則該字元串將填充零位元組以使偏移量適合。不存在的鍵被視為空字元串,因此此命令將確保它包含足夠大的字元串以能夠將值設置為offset。

調用set(K key, V value, long timeout, TimeUnit unit)這個方法,其底層調用的是redis命令setex。這個命令看官網介紹

Set key to hold the string value and set key to timeout after a given number of seconds

很顯然這個方法,才是我們真正想要的方法。因此解決使用restemplate set方法保存出現\x00\問題的方案就是使用

void set(K key, V value, long timeout, TimeUnit unit)

這個方法


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 首先來看一下並口和串口的區別:引腳的區別: 串口SRAM(或其它存儲器)通常有如下的示意圖: 串口SRAM引腳 引腳只有SCK,CS#,SI,SO,HOLDB,VCC,VSS不到8個,一般遵循SPI協議,並口SRAM引腳很多,串口SRAM引腳很少。大部分SRAM是並口(parallel)操作的,也有 ...
  • https://blog.csdn.net/m0_37321987/article/details/903447621、右擊任務欄,啟動任務管理器; 2、選擇“性能“選項卡,點擊“資源監視器”; 3、點擊“CPU”選項卡,在“關聯的句柄”右側的“搜索句柄”輸入框輸入文件名或文件夾名並點擊搜索;win ...
  • 問題:常用命令“ll”失效或命令未找到 原因: "ll"命令不是linux的基本命令, 它是"ls -l"的別名, 部分版本並不直接支持“ll”命令輸出。 ###解決方法: 運行“vi ~/.bashrc” 查看該文件里是否有“alias ll='ls -l'”這樣的數據, 如有,將數據前的“#”去 ...
  • basename命令用於獲取路徑中的文件名或路徑名,還可以對末尾字元進行刪除。 ...
  • 晶元生態很重要,接觸到的一些進口晶元,比如ST、TI、NORDIC、AVR等,有論壇,網上能找到資料,晶元容易買到,SDK不停更新。這也就是ST的晶元、Arduino IDE市場很大、用戶基數多的原因,穩定性、功能、開發速度缺一不可。 從使用上來說,開發產品最喜歡用的還是STM8S003,但是因為價... ...
  • 哨兵作用 哨兵(sentinel) 是一個分散式系統,是程式高可用性的一個保障。用於監視任意多個主伺服器,以及這些主伺服器屬下的所有從伺服器,當出現故障時通過投票機制選擇新的master並將所有slave連接到新的master。 監控 不斷地檢查master和slave是否正常運行 master存活 ...
  • 學習電子書:https://docs.oracle.com/cd/E18283_01/server.112/e16508/consist.htm#CNCPT1339 什麼是排它鎖? 每一個事務在修改資源時會獲得排他鎖,該事務不結束,則其他事務不能修改此資源。(註意:這裡的修改不是數據“增刪查改”中的 ...
  • 1.Sql Server2008的下載 近期項目使用到C#,為了學習.NET相關的技術,開始著手學習Sql Server資料庫。 Sql Server2008是比較經典的資料庫版本,這裡簡單寫一下Sql Server 2008的下載與安裝。 下載地址在微軟官網上:https://www.micros ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...