Redis客户端 - RedisSerializer

这篇具有很好参考价值的文章主要介绍了Redis客户端 - RedisSerializer。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原文首更地址,阅读效果更佳!

Redis客户端 - RedisSerializer | CoderMast编程桅杆https://www.codermast.com/database/redis/redistemplate-redis-serializer.html

前景回顾

在上一篇中,我们实现了一个简单的案例,操作一个 String 类型的数据,插入了一个 name = codermast 的数据到Redis。

使用redis-cli客户端连接对应的Redis服务器后,按道理来讲get name这个指令的返回结果应该是 codermast

Redis客户端 - RedisSerializer

redis-cli客户端查看

返回的结果是无,这是为什么呢?使用可视化工具查看一下,看看到底数据是否存储在Redis服务器中。

Redis客户端 - RedisSerializer

使用可视化工具查看

可以明显的看到,所存储的 key 之前加上了一段字符,但是从代码中看,存储的 key 为 "name",但是实际存储的 key 是 \xac\xed\x00\x05t\x00\x04name,而且里面的 value 也做了同样的处理 \xac\xed\x00\x05t\x00\x09codermast

出现这种现象的原因是什么呢?这是因为 RedisTemplate 在底层将数据序列化处理以后,才存储到 Redis 服务器中。

RedisTemplate 可以接收任意 Object 作为值写入 Redis ,只不过在写入之前会把 Object 序列化成为字节形式,默认是采用 JDK 序列化,得到的结果就如图所示。

缺点

  • 可读性差
  • 资源占用高

既然这样可读性又差,资源占用又高,那么如何解决这些问题呢?我们可以通过自定义 RedisTemplate 序列化的方式来解决。

#编写一个 RedisConfig 配置类

@Configuration
public class RedisTemplate{
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory){

        // 1.创建RedisTemplate对象
        RedisTemplate<String ,Object> redisTemplate = new RedisTemplate<>();

        // 2.设置连接⼯⼚
        redisTemplate.setConnectionFactory(factory);
        
        // 3.创建序列化对象
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        
        // 4.设置 key 和 hashKey 采⽤ String 的序列化⽅式
        redisTemplate.setKeySerializer(stringRedisSerializer);
        redisTemplate.setHashKeySerializer(stringRedisSerializer);
        
        // 5.设置 value 和 hashValue 采⽤ json的 序列化⽅式
        redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);
        redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer);

        return redisTemplate;
    }
}

注意

我们自定义的配置类中,使用到了 Jackson 序列化类,所以在使用之前需要导入 jackson-datebind 这个依赖项。

<!-- jackson-databind 依赖 -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>

#自定义序列化方式

自定义的序列化方式也加进去了对引用类型的序列化,我们来实际测试一下。

  • 编写一个 User 类
@Data
public User{
    Integer age;
    String name;
}

类中属性需要给出 set 和 get方法

  • 将 User 对象存储至 Redis
@Test
void testObject(){
    User user = new User();
    user.setAge(18);
    user.setName("codermast");

    // 插入一条 Object 类型的数据
    redisTemplate.opsForValue().set("user",user);

    // 获取一条 Object 类型的数据
    User user_coder = (User)redisTemplate.opsForValue().get("user");

    System.out.println(user_coder);
}

Redis客户端 - RedisSerializer

 

虽然 JSON 的序列化方式可以满足我们存储对象的需求,为了在反序列化时知道对象的类型,将对象的类路径地址也序列化进 JSON 结果中,存入 Redis ,会带来额外的资源消耗。

针对如图所示的特殊情况,类路径地址比我们真实的数据内容还大,造成了极大的资源浪费。

#优化自定义序列化

为了节省内存空间,通常情况下不会使用 JSON 序列化器来处理 Value ,而是统一使用 String 序列化器,要求只能存储 String 类型的 key 和 value。当要存储 Java 对象时,手动完成对象的序列化和反序列化。

Redis客户端 - RedisSerializer

 

Spring 默认提供了一个 StringRedisTemplate 类,它的 key 和 value 的序列化方式默认就是 String 方式,省去了我们自定义的 RedisTemplate 的过程。

现在在存储数据之前需要进行手动序列化,在获取数据以后,需要手动反序列化对象。

#小结

RedisTemplate 的两种序列化实践方案

  1. 方案一
    • 自定义RedisTemplate
    • 修改RedisTemplate 的序列化器为 GenericJackson2JsonRedisSerializer
  2. 方案二
    • 使用 StringRedisTemplate
    • 写入 Redis 之前,将对象手动序列化为 JSON
    • 读取数据以后,将 JSON 手动反序列化为对象

提示

上述仅说明了操作 String 类型的数据,操作 Hash、List、Set、SortedSet类型时,使用对应的 ops 对象即可操作。文章来源地址https://www.toymoban.com/news/detail-492537.html

到了这里,关于Redis客户端 - RedisSerializer的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Redis的Java客户端

    以下是redis.io官网所推荐使用前五的Java客户端 Java客户端 特点 Jedis 以Redis命令作为方法名称,学习成本低,简单实用,但是Jedis实例是线程不安全的,多线程环境下需要基于连接池来使用 lettuce Lettuce是基于Netty实现的,支持同步、异步和响应式编程方式,并且是线程安全的。

    2024年02月13日
    浏览(45)
  • Redis中的Java客户端

    Jedis是一个Java实现的Redis客户端连接工具。 Jedis使用非常简单,直接引入依赖。基于默认参数的Jedis连接池,初始化连接池类(使用默认连接池参数)JedisPool,获取一个Jedis连接Jedis jedis=jp.getResource()。 Jedis是线程不安全的,多线程使用同一个Jedis实例,会出现并发问题,原因是

    2024年01月17日
    浏览(49)
  • redis教程 二 redis客户端Jedis使用

    在Redis官网中提供了各种语言的客户端,地址:https://redis.io/docs/clients/ 其中Java客户端也包含很多但在开发中用的最多的还是Jedis,接下来就让我们以Jedis开始我们的快速实战。 入门案例详细步骤 案例分析: 创建工程: 创建一个maven管理的java项目 引入依赖: 在pom.xml文件下添

    2024年02月05日
    浏览(50)
  • 【Redis入门篇】| Redis的Java客户端

    目录 一: Redis的Java客户端 1. Jedis快速入门 2. Jedis连接池 3. SpringDataRedis快速入门 4. RedisSerializer配置 5. StringRedisTemplate 图书推荐 在Redis官网中提供了各种语言的客户端,地址: https://redis.io/resources/clients/ Jedis: 以 Redis 命令作为方法名称,学习成本低,简单实用。但是 Jedis 实

    2024年02月03日
    浏览(102)
  • Redis客户端Redisson使用示例

    Redisson作为Java连接Redis的客户端,提供了连接、操作Redis的方法,还提供分布式锁、红锁等并发工具。Redisson除了提供同步接口外,还提供了异步(Async)、反射式(Reactive)和RxJava2标准的接口。Redisson会序列化Java对象然后保存到redis,所以通过redis命令行设置的值,Redisson来获

    2024年02月06日
    浏览(62)
  • Redis系列之客户端Redisson

    官方推荐的客户端,支持Redis单实例、Redis哨兵、Redis Cluster、Redis master-slave等各种部署架构。 GitHub, 功能: 分布式锁 使用Redisson提供的分布式锁的一个最常见场景,应用部署为多个节点,然后使用Spring提供的原生@Scheduled任务调度功能;而没有使用xxl-job等轻量级分布式任务调

    2024年02月09日
    浏览(49)
  • 使用C++操作Redis客户端

    \\\"Who can say where the path will go?\\\"           前面我们花了很大的篇幅,讲解了redis中常见常使用的五种数据结构,以及五种数据结构的操作和redis命令。不过在日常开发中,我们的这些操作都是在redis为我们提供的客户端中的,就像使用mysql一样,很多时候不是在mysql-cli去编写s

    2024年02月10日
    浏览(48)
  • 【征服redis5】redis的Redisson客户端

    目录 1 Redisson介绍 2. 与其他Java Redis客户端的比较 3.基本的配置与连接池 3.1 依赖和SDK 3.2 配置内容解析 4 实战案例:优雅的让Hash的某个Field过期 5 Redisson的强大功能 Redisson 最初由 GitHub 用户 “mrniko” 创建,并在 Apache 2.0 许可证下发布。它的目标是提供一组强大的工具和 API,

    2024年01月17日
    浏览(51)
  • Redis学习路线(3)——Redis的Java客户端

    一、如何使用Redis的Java客户端 官方文档: https://redis.io/docs/clients/java/ Java-Redis客户端 使用场景 Jeids 以Redis命令作为方法名称,学习成本低,简单实现,但是Jedis实例是线程不安全的,多线程环境下需要基于连接池使用。 lettuce Lettuce 是基于Netty实现的,支持同步、异步和响应式

    2024年02月15日
    浏览(43)
  • Redis的Java客户端-Jedis

    在 Redis官网 中提供了各种语言的客户端,地址: https://redis.io/docs/clients/ 其中Java客户端也包含很多: 标记为 ❤ 的就是推荐使用的java客户端,包括: Jedis和Lettuce:这两个主要是提供了Redis命令对应的API,方便我们操作Redis,而SpringDataRedis是对这两种做了抽象和封装。 Redisso

    2024年02月19日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包