解决redis的key和value出现乱码(更准确的说是二进制形式)

问题描述

redis执行代码时key和value会以乱码(二进制形式)存储,更准确的说不是乱码,只是redis以二进制的方式存储,这种方式不方便用可视化的redis管理工具查看,所以我们需要将它序列化


原因分析:

这是因为在redis储存的时候没有对key和value进行序列化,默认情况下的模板RedisTemplate<Object, Object>,默认序列化使用的是 JdkSerializationRedisSerializer ,存储二进制字节码。这时需要自定义模板。


解决方案:

1、自定义RedisTemplate模板(redis的key需序列化,value可以不序列化)

@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String,Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory){
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        //设置String类型的key设置序列化器
        redisTemplate.setKeySerializer(new StringRedisSerializer());

        //设置Hash类型的key设置序列化器
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());

        //设置redis链接Lettuce工厂
        redisTemplate.setConnectionFactory(lettuceConnectionFactory);
        return redisTemplate;
    }
}

当然也可以对value进行序列化,至于为什么不对value序列化等下再作出解释

2、注入模板,执行代码

@Autowired
private RedisTemplate redisTemplate;
@Test
void test(){
    ValueOperations ops = redisTemplate.opsForValue();
    ops.set("name","YHJ");
}

3、结果如下

Value还是以二进制的形式存进去,这是因为我们没有对value进行序列化,虽然value的格式有点难看,但是这样也可以正常取出来,因为在java代码取value值的时候,还会进行反序列化,不会影响业务的逻辑和数据的正确性,结果如下:

 4、我们为什么不对value进行序列化呢

这是因为redis的value最好不要设置String序列化,若设置序列化了,value只能存入String类型,不能存进LocalDateTime、LocalDate、LocalTime等时间类型(若想存这些类型也是可以的,需要将这些数据强转为string类型再存进value里即可),通常开发中我们是不需要查看value的,只需要查看key。

若想value也序列化的话就是用这配置,但是记得若将值存进value的话最好还是要保证要存进去的值是String类型

/**
 * Redis配置类,设置序列化
 */
@Configuration
public class RedisConfig {

    /**
     * 设置序列化
     *
     * @return
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();

        // String类型 key序列器
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        // String类型 value序列器
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());

        // Hash类型 key序列器
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        // Hash类型 value序列器
        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());

        // 把连接工厂放进去
        redisTemplate.setConnectionFactory(connectionFactory);

        return redisTemplate;
    }

}

### 回答1: 要查看Redis中所有的keyvalue,可以使用以下命令: 1. 查看所有的key: ``` keys * ``` 2. 查看某个keyvalue: ``` get key_name ``` 注意:使用`keys *`命令会返回所有的key,但是在生产环境中不建议使用,因为这个命令会阻塞Redis服务器,导致性能下降。如果需要查看所有的key,可以使用SCAN命令。 ### 回答2: Redis 是开源的,高性能键值缓存数据库软件,它支持多个数据结构,包括字符串、哈希表、列表、集合和有序集合等等。在 Redis 中,我们可以用 `keys *` 命令来查看所有的 key。但是,由于这个命令会返回所有的 key,所以它在生产环境中不太建议使用,因为它会占用比较多的内存和 CPU 资源。 如果你真的需要查看所有的 keyvalue,那么有以下几种方法: 1. 使用客户端 GUI 工具。像 RedisDesktopManager、Rebrow 等客户端 GUI 工具都内置了查看 Redis 中所有 keyvalue 的功能。这些工具可以方便地展示 Redis 数据库的全部内容,包括键,值和类型。 2. 使用 SCAN 命令。SCAN 命令是一种迭代产生 key 的方法。在 SCAN 命令的参数中,你可以指定从哪个 key 开始遍历。命令的返回结果是一个包含两个元素的列表,第一个元素是下一个开始遍历的位置,第二个元素是从当前位置开始的 key 列表。比如,如果你想查看 Redis 中所有的 key,那么你可以使用 SCAN 0 命令来开始遍历,然后将返回结果不停地迭代,直到返回的 key 列表为空为止。 3. 使用 Redis Dump 和 Restore 命令。这种方法可以将 Redis 的内存中数据全部转储到一个文件中,然后再将文件中的数据全部还原到 Redis 中。不过,这种方法会占用比较多的磁盘空间,还需要在还原时占用较长的时间。 综上所述,使用客户端 GUI 工具是最方便的方法,而使用 SCAN 命令是比较实用的方法,它可以在生产环境中很好地处理查看所有 keyvalue 的需求。 ### 回答3: Redis是一个内存数据库,主要用于缓存数据,常用于缓存一些经常用到的数据,以提升系统访问速度。而在实际工作中,我们有时需要查看所有存储Redis数据库中的KeyValue,以及对这些数据进行管理操作。下面是几种查看Redis所有KeyValue的方法: 1.使用Redis命令行工具:可以通过“redis-cli”命令进入Redis的命令行界面,输入“keys *”命令,就可显示所有的Key,然后输入“get [key]”命令,就可以查看对应的Value。 2.使用Redis Desktop Manager:Redis Desktop Manager是一款图形化的Redis管理工具,可以直接连接Redis数据库,并提供了查看KeyValue的功能。在Redis Desktop Manager中,只需要打开某个数据库连接,就可以查看所有的KeyValue。另外,还可以使用搜索功能快速查找指定KeyValue。 3.使用Redis命令扩展:Redis提供了一些命令扩展,可以帮助我们快速查看所有的KeyValue。例如,使用scan命令,可以通过游标的方式遍历整个Key空间;使用hgetall命令,可以查看hash类型的所有field和value等等。 总之,无论是使用Redis命令行工具、Redis Desktop Manager还是Redis命令扩展,都可以帮助我们快速查看所有的KeyValue,并对这些数据进行管理操作,以满足实际工作需求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值