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

有目标就不怕路远。年轻人.无论你现在身在何方.重要的是你将要向何处去。只有明确的目标才能助你成功。没有目标的航船.任何方向的风对他来说都是逆风。因此,再遥远的旅程,只要有目标.就不怕路远。没有目标,哪来的劲头?一车尔尼雷夫斯基

导读:本篇文章讲解 为什么通过命令行查不到redis中的key,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

为什么通过命令行查不到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 在遇到 <String, String> 泛型的时候注入的不是 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<String> stringRedisSerializer = new StringRedisSerializer();
        template.setKeySerializer(stringRedisSerializer);
        template.setHashKeySerializer(stringRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/135180.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!