解决使用redisTemplate set方法保存出现\x00\问题

在项目有个需求要保存一个字符串到redis,并设置一个过时时间。这个需求一看很是简单,使用redisTemplate一行代码搞定,代码以下redis

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

但保存后,查看redis发现value的前缀多出了ide

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

一开始觉得是redis的序列化问题,因而就修改了redisTemplate的序列化方式,终于仍是没能解决问题。那问题出在哪里?翻看源码,发现redisTemplate.opsForValue().set()有重载方法,一个是this

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

另一个是rest

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

调用set(K key, V value, long offset)这个方法,其底层调用的是redis的setrange命令,这个命令看官网介绍code

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 offsetci

其含义是从指定的偏移量开始,覆盖整个值范围内从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 secondsstring

很显然这个方法,才是咱们真正想要的方法。所以解决使用restemplate set方法保存出现\x00\问题的方案就是使用it

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

这个方法

相关文章
相关标签/搜索