专栏首页Linyb极客之路解决使用redisTemplate set方法保存出现\x00\问题
原创

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

在项目有个需求要保存一个字符串到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)

这个方法

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Redis实用监控工具一览

    第一个就介绍一下,Redis自带的性能检测工具redis-benchmark, 该工具可以模拟 N 个客户端同时发出 Y 个请求。可以使用 redis-benc...

    lyb-geek
  • 操作日志追踪记录之MDC入门

    MDC(Mapped Diagnostic Context,映射调试上下文)是 log4j 和 logback 提供的一种方便在多线程条件下记录日志的功能。某些...

    lyb-geek
  • mybatis异常集之Cannot determine value type from string ‘xxx‘

    本文的创作来源于朋友在自学mybatis遇到的问题,问题如文章标题所示Cannot determine value type from string 'xxx'...

    lyb-geek
  • 创客贴 CEO 王宝臣入选福布斯亚洲30位年轻企业家

    福布斯中国2018年30位30岁以下精英榜(30 under 30)正式发布,本榜单首次涵盖了20个不同领域的青年才俊,创客贴创始人兼 CEO 王宝臣入选。

    重庆华哥哥
  • 基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - 账户与角色

          前面的文章我介绍了AgileEAS.NET平台关于模块插件的集成,本文我介绍AgileEAS.NET平台中的一个重要功能,账户和角色。       ...

    魏琼东
  • HttpServletRequest.getParameter()出现乱码现象解决方案

    一、首先在项目中添加一个过滤器类,用来将所有参数转化为指定格式(UTF-8) import java.io.IOException;   import java...

    Venyo
  • 智能合约语言 Solidity 教程系列12 - 库的使用

    这是Solidity教程系列文章第12篇介绍库的使用:库与合约的不同,使用库的正姿势。

    Tiny熊
  • 机器学习7:集成学习--XGBoost

    对于XGBoost算法原理看陈天奇的PPT和一份算法实战指导文档就够了(文末附网盘链接)。

    用户5473628
  • 分享 Github Trending榜最热门的Java10个项目

    Arthas支持JDK 6+,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。

    用户5224393
  • logging总结 - log4j2使用流程[归档存储]

    <web-app> 2.5 以前要多个依赖 log4j-web,还需要在web.xml配置listener、filter

    wuweixiang

扫码关注云+社区

领取腾讯云代金券