前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >解决使用redisTemplate set方法保存出现\x00\问题

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

原创
作者头像
lyb-geek
修改2020-06-17 17:44:50
1.4K0
修改2020-06-17 17:44:50
举报
文章被收录于专栏:Linyb极客之路Linyb极客之路

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

代码语言:txt
复制
redisTemplate.opsForValue().set("userKey", data, 10000); 

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

代码语言:txt
复制
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x

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

代码语言:txt
复制
void set(K key, V value, long offset) 

另外一个是

代码语言:txt
复制
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\问题的方案就是使用

代码语言:txt
复制
void set(K key, V value, long timeout, TimeUnit unit)

这个方法

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档