如何通过redis get命令消除垃圾值?

时间:2016-01-25 12:08:56

标签: redis jedis

问题:

  • 我正在为redis get call获取像“OK”这样的垃圾值。
  • 此问题通常会在特定时间段内重现,无论尝试通过get命令获取密钥。

我正在使用:

  • Redis版本2.8
  • Jedis client 2.5.1连接Redis

请提出解决此问题的解决方案。

1 个答案:

答案 0 :(得分:2)

问题在this page中列出。来自文章:

  

我在Spring RedisTemplate类中启用Redis事务时学到了很多教训redisTemplate.setEnableTransactionSupport(true);: Redis在运行几天后开始返回垃圾数据,导致严重的数据损坏。 StackOverflow报告了类似的案例。

     

通过运行monitor命令,我的团队发现在Redis操作或RedisCallback之后,Spring并没有像它应该那样自动关闭Redis连接。重用未关闭的连接可能会从Redis中的意外密钥返回垃圾数据。有趣的是,在RedisTemplate中将事务支持设置为false时,此问题并未显示。

     

我们发现通过在Spring上下文中配置PlatformTransactionManager(例如DataSourceTransactionManager),然后使用@Transactional注释来声明Redis事务的范围,我们可以自动使Spring关闭Redis连接。

     

基于这种经验,我们认为在Spring上下文中配置两个单独的RedisTemplates是一个好习惯:在大多数Redis操作中使用一个事务设置为false的实例;启用事务的另一个仅适用于Redis事务。当然必须声明PlatformTransactionManager和@Transactional以防止返回垃圾值。

     

此外,我们了解了将Redis事务与关系数据库事务混合的缺点,在本例中为JDBC。混合交易的行为与您的预期不符。