在項(xiàng)目有個(gè)需求要保存一個(gè)字符串到redis,并設(shè)置一個(gè)過期時(shí)間。這個(gè)需求一看非常簡單,使用redisTemplate一行代碼搞定,代碼如下
但保存后,查看redis發(fā)現(xiàn)value的前綴多出了
一開始以為是redis的序列化問題,于是就修改了redisTemplate的序列化方式,終于還是沒能解決問題。那問題出在哪里?翻看源碼,發(fā)現(xiàn)redisTemplate.opsForValue().set()有重載方法,一個(gè)是
另外一個(gè)是
調(diào)用set(K key, V value, long offset)這個(gè)方法,其底層調(diào)用的是redis的setrange命令,這個(gè)命令看官網(wǎng)介紹
其含義是從指定的偏移量開始,覆蓋整個(gè)值范圍內(nèi)從key存儲(chǔ)的字符串的一部分。如果偏移量大于key處字符串的當(dāng)前長度,則該字符串將填充零字節(jié)以使偏移量適合。不存在的鍵被視為空字符串,因此此命令將確保它包含足夠大的字符串以能夠?qū)⒅翟O(shè)置為offset。 調(diào)用set(K key, V value, long timeout, TimeUnit unit)這個(gè)方法,其底層調(diào)用的是redis命令setex。這個(gè)命令看官網(wǎng)介紹
很顯然這個(gè)方法,才是我們真正想要的方法。因此解決使用restemplate set方法保存出現(xiàn)\x00\問題的方案就是使用
這個(gè)方法 |
|