详解Redis中数值乱码的根本原因以及解决方式

 更新时间:2024年02月06日 11:21:37   作者:码农研究僧  
这篇文章给大家详细分析了Redis中数值乱码的根本原因以及解决方式,通过代码示例给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下

1. 问题所示

某些信息存储在缓存中,对此修改缓存,想通过可视化的Redis Desktop来操作,但是发现都是二进制的数据,不好操作:

在这里插入图片描述

于是想着以命令行的方式修改,但又怕改错,毕竟都是难以读懂的二进制数据,如图所示:(由于信息比较隐私,此处打码了)

在这里插入图片描述

2. 原理分析

RedisTemplate 存储的数据通常是二进制的。Redis 是一个键值存储系统,它存储的值可以是字符串、二进制数据、甚至是序列化的对象。

RedisTemplate 是 Spring Data Redis 提供的一个类,用于在 Spring 应用中与 Redis 进行交互。

它提供了一种在 Java 对象和 Redis 数据之间进行序列化和反序列化的机制。
默认情况下,RedisTemplate 使用 JDK 的序列化机制将 Java 对象转换为二进制数据,并存储在 Redis 中。

3. 拓展

在使用Redis作为数据存储时,合理的键值序列化配置和RedisTemplate的使用方式对于应用性能和数据可维护性至关重要。

默认情况下,Spring Data Redis使用JdkSerializationRedisSerializer作为RedisTemplate的默认序列化器

这意味着键和值都将以Java对象的二进制形式进行序列化,并以字节流的方式存储在Redis中。

  • 不对值进行额外序列化的理由:虽然值以二进制形式存储,但在Java代码中获取值时会进行反序列化,因此这不会影响业务逻辑和数据的正确性。
    同时,对值进行额外的序列化可能会限制存储的数据类型,例如将值序列化为字符串将仅能存储字符串类型的值。
  • 额外序列化的场景
    如果需要存储复杂的数据结构或非字符串类型的值,可以选择配置RedisTemplate使用其他序列化器,例如JSON序列化器或自定义序列化器。
  • 这样可以更灵活地存储各种类型的数据,但需要注意在读取时正确地反序列化。
  • 特殊值的处理
    对于包含特殊类型(如LocalDateTime、LocalDate、LocalTime等)的值,可能需要注意转换为字符串或选择合适的序列化方式。

通过理解Redis默认行为和灵活运用RedisTemplate,可以更好地应对不同类型数据的存储需求,从而优化系统性能并提升开发效率

给出一个Demo代码更加容易懂:

先引入这两个依赖包:

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-redis</artifactId>
    <version>2.6.5.RELEASE</version> <!-- 使用你项目中的实际版本 -->
</dependency>

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.7.0</version> <!-- 使用你项目中的实际版本 -->
</dependency>

对key进行可视化:

import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

public class Demo {
    public static void main(String[] args) {

        // 创建 Redis 连接配置
        JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
        jedisConnectionFactory.setHostName("localhost");
        jedisConnectionFactory.setPort(6379);
        // jedisConnectionFactory.setPassword(RedisPassword.of("your-redis-password"));

        // 手动调用 afterPropertiesSet()
        jedisConnectionFactory.afterPropertiesSet();

        // 创建 RedisTemplate 实例
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        //设置String类型的key设置序列化器
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        //设置Hash类型的key设置序列化器
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());

        redisTemplate.setConnectionFactory(jedisConnectionFactory);
        redisTemplate.afterPropertiesSet();

        // 存储字符串
        redisTemplate.opsForValue().set("message", "Hello, Redis!");

        // 获取字符串
        String message = (String) redisTemplate.opsForValue().get("message");
        System.out.println("Message: " + message);

        // 存储哈希
        HashOperations<String, String, String> hashOperations = redisTemplate.opsForHash();
        hashOperations.put("user", "id", "1");
        hashOperations.put("user", "name", "码农研究僧");

        // 获取哈希
        String userId = hashOperations.get("user", "id");
        String userName = hashOperations.get("user", "name");
        System.out.println("User ID: " + userId);
        System.out.println("User Name: " + userName);
    }
}

如果不对key可视化,只需要删除这两行代码即可:

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

截图如下:

在这里插入图片描述

以上就是详解Redis中数值乱码的根本原因以及解决方式的详细内容,更多关于Redis数值乱码的资料请关注脚本之家其它相关文章!

相关文章

  • 详解redis在服务器linux下启动的相关命令(安装和配置)

    详解redis在服务器linux下启动的相关命令(安装和配置)

    这篇文章主要介绍了redis在服务器linux下的启动的相关命令(安装和配置),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • 高并发技巧之Redis和本地缓存使用技巧分享

    高并发技巧之Redis和本地缓存使用技巧分享

    在这篇文章中,我主要介绍的是分布式缓存和本地缓存的使用技巧,包括缓存种类介绍,各种的使用场景,以及如何使用,最后再给出实战案例,需要的可以参考一下
    2022-10-10
  • Redis 哨兵高模式搭建及Java代码配置

    Redis 哨兵高模式搭建及Java代码配置

    这篇文章主要介绍了Redis 哨兵高模式搭建及Java代码配置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 浅谈分布式锁的几种使用方式(redis、zookeeper、数据库)

    浅谈分布式锁的几种使用方式(redis、zookeeper、数据库)

    这篇文章主要介绍了浅谈分布式锁的几种使用方式(redis、zookeeper、数据库),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • redis-benchmark并发压力测试的问题解析

    redis-benchmark并发压力测试的问题解析

    这篇文章主要介绍了redis-benchmark并发压力测试的问题解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Redis的数据类型和内部编码详解

    Redis的数据类型和内部编码详解

    Redis是通过Key-Value的形式来组织数据的,而Key的类型都是String,而Value的类型可以有很多,在Redis中最通用的数据类型大致有这几种:String、List、Set、Hash、Sorted Set,下面通过本文介绍Redis数据类型和内部编码,感兴趣的朋友一起看看吧
    2024-04-04
  • Redis实现接口防抖的示例代码

    Redis实现接口防抖的示例代码

    本文介绍了一种通过AOP、自定义注解和Redis实现的接口防抖技术,这种方法能有效避免因网络波动等原因短时间内发送多个请求导致的数据重复添加问题,感兴趣的可以了解一下
    2024-10-10
  • linux安装配置及使用redis

    linux安装配置及使用redis

    本文主要跟大家讲解的是在Linux环境下,Redis的安装与部署,非常的简单实用,有需要的小伙伴可以参考下
    2018-04-04
  • 将音频文件转二进制分包存储到Redis的实现方法(奇淫技巧操作)

    将音频文件转二进制分包存储到Redis的实现方法(奇淫技巧操作)

    这篇文章主要介绍了将音频文件转二进制分包存储到Redis的实现方法(奇淫技巧操作),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • redis键值出现\xac\xed\x00\x05t\x00&的问题及解决

    redis键值出现\xac\xed\x00\x05t\x00&的问题及解决

    这篇文章主要介绍了redis键值出现\xac\xed\x00\x05t\x00&的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07

最新评论