您当前的位置: 首页 >  redis

石头wang

暂无认证

  • 3浏览

    0关注

    295博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

为什么通过命令行查不到redis中的key

石头wang 发布时间:2021-09-10 16:42:20 ,浏览量:3

为什么通过命令行查不到redis中的key

背景

在调试java程序中,可能会发生一些匪夷所思的事情。比如命令行中用redis命令为什么查不到key,但是应用程序却能读取到这个值。比如你用命令行连接上去后发现 get your_key为nil,或者是 keys your_key 发现没这个key。

原因

如下代码的RedisTemplate都没有特别配置序列化器,在执行后,使用命令行连上redis,执行keys my_key*,发现只有第二个key存在,第一个消失了,但是代码执行后是能够取到值的。这是为什么?

在这里插入图片描述

是因为命令行的工具有bug吗?不是的。使用 keys *my_key*,就可以显示两个key都存在。

在这里插入图片描述

可以看到第二key前面有一些奇怪的字符,这是是因为代码中第一个 redisTemplate 的序列化器,无论是key还是value都是使用jdk的序列化器(JdkSerializationRedisSerializer),所以导致了key前面有些奇怪的字符,所以用 keys *my_key* 这种两边都模糊的就能匹配出来。 但是第二个不是也是redisTemplate 吗?为什么key 前面没有奇怪的符号,因为Spring 在遇到 泛型的时候注入的不是 RedisTemplate 类,而是 StringRedisTemplate 类,而后者的所有序列化器都是 String的序列化器(StringRedisSerializer),所以就很正常了。

最佳实践

建议设置一下 key 和 hash key 的序列化器为String序列化器,这样可读性才强,debug的时候才好发现,另外不需要重复 new StringRedisSerializer(),共用即可,线程安全

@Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate template = new RedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
         //建议设置一下 key 和 hash key 的序列化器为String序列化器,这样可读性才强,debug的时候才好发现,另外不需要重复 new StringRedisSerializer(),共用即可,线程安全
        RedisSerializer stringRedisSerializer = new StringRedisSerializer();
        template.setKeySerializer(stringRedisSerializer);
        template.setHashKeySerializer(stringRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }
关注
打赏
1663722529
查看更多评论
立即登录/注册

微信扫码登录

0.0396s