当前位置:首页 > 问答 > 正文

Redis连接池怎么简单搭建,还有序列化那些事儿你得知道

关于Redis连接池的简单搭建和序列化的问题,我们得从为什么需要它们开始说起,想象一下,你开了一家小店,每次有顾客来买东西,你都现去仓库拿货,顾客走了你就把仓库门关上,来一个顾客,你就重复一次开门、拿货、关门的动作,这效率太低了,对吧?更糟的是,如果顾客很多,你光忙着开门关门就累垮了,仓库的门锁也可能因为频繁使用而坏掉。

这个“仓库”就是Redis服务器,而“开门关门”就是创建和关闭网络连接,频繁地创建和关闭连接会消耗很多资源,而且很慢,解决的办法就是搞一个“仓库前台”——也就是连接池,你在前台常驻几个伙计(连接),顾客来了,直接由一个空闲的伙计去取货,服务完了这个伙计不休息,继续接待下一位顾客,这样就不用反复跑仓库开门关门了,效率大大提高。

在Java中,我们最常用的Redis客户端是Jedis和Lettuce,现在Lettuce更受推荐,因为它基于Netty,性能更好,而且是线程安全的,但无论是哪个,它们都内置了连接池的管理功能,以Spring Boot项目为例,搭建起来非常简单,你几乎不用写什么代码。

Redis连接池怎么简单搭建,还有序列化那些事儿你得知道

根据博客园“阿迈达”的文章《SpringBoot整合Redis(Lettuce详解)》中的介绍,你只需要做这么几步:

  1. 加依赖:在你的pom.xml文件里加上Spring Boot的Redis启动器依赖,这东西就像个万能工具箱,一下子把该引入的包都给你引好了。
  2. 写配置:在application.yml或者application.properties文件里,写上Redis服务器的地址、端口、密码(如果有的话),最重要的是配置连接池,就像你决定前台要安排几个伙计。
    • max-active:最大连接数,就是最多允许同时有多少个伙计当班,太多了会占资源,太少了顾客要排队。
    • max-idle:最大空闲连接数,就是没顾客的时候,前台最少留几个伙计待命。
    • min-idle:最小空闲连接数,就是再怎么着也得保证有几个伙计在岗,以防突然来一大波顾客。
    • max-wait:最大等待时间,如果所有伙计都在忙,新来的顾客愿意等多久,等不到可能就直接走人了(抛出异常)。
  3. 用注解:在你的代码里,需要操作Redis的地方,使用@Autowired注解注入一个叫RedisTemplate的家伙,这个RedisTemplate就是你的大管家,它背后已经帮你管理好连接池了,你直接用它来存数据、取数据就行,完全不用操心连接是怎么来的、怎么还回去的。

你看,在Spring Boot的帮助下,搭建一个稳定高效的Redis连接池就是这么简单,几乎就是“开箱即用”。

好了,连接池的问题解决了,你的应用能高效地和Redis打交道了,但紧接着第二个问题就来了:你要往Redis里存什么?怎么存? 这就涉及到“序列化那些事儿”了。

Redis连接池怎么简单搭建,还有序列化那些事儿你得知道

Redis的数据库本质上是“键值对”存储,而且键和值都必须是字节数组,你不能直接把一个Java对象,比如一个User对象(里面有姓名、年龄等属性),扔给Redis说:“帮我存一下。” Redis会一脸茫然,因为它只认识二进制数据。

你需要一个“翻译官”,把Java对象转换成字节数组,这个过程就叫序列化;反过来,从Redis里读出字节数组,再变回Java对象,这个过程叫反序列化,这个“翻译官”就是序列化器。

根据CSDN博主“码农小胖哥”在《Spring Redis Template序列化》一文中的总结,Spring的RedisTemplate默认使用的是JDK序列化,这种序列化方式虽然什么对象都能序列化,但它有几个大问题:

Redis连接池怎么简单搭建,还有序列化那些事儿你得知道

  • 可读性差:序列化后的数据是二进制的,你在Redis客户端里看到的是一堆乱码,根本看不懂存的是什么。
  • 兼容性差:如果你的类结构变了(比如增删了字段),反序列化很可能失败。
  • 体积大:序列化后的字节数组比较臃肿,占用的内存空间更大。

我们通常不会用默认的JDK序列化,而是换成更好的“翻译官”,最常见的选择有两种:

  1. Jackson2JsonRedisSerializer:这个翻译官会把对象转换成JSON字符串,然后再存成字节数组,它的好处是:

    • 可读性好:你在Redis里看到的是明明白白的JSON字符串,一目了然。
    • 通用性强:JSON是跨语言的,其他语言(比如Python)写的程序也能轻松读取这些数据。
    • 缺点是需要引入额外的库,而且序列化复杂的对象关系时可能需要额外配置。
  2. GenericJackson2JsonRedisSerializer:这是上一个的升级版,它会在JSON里多存一个@class属性,标明这个JSON是哪个类的对象,这样在反序列化的时候,就能准确地变回原来的类型,非常方便。

怎么换掉默认的“翻译官”呢?你需要在代码里稍微配置一下你的RedisTemplate,大概的步骤是:自己new一个RedisTemplate对象,然后给它设置好连接工厂,接着分别设置它的keySerializer(键的序列化器)和valueSerializer(值的序列化器),你可以把键设置为StringRedisSerializer(这样键就是普通的字符串,很清晰),把值设置为GenericJackson2JsonRedisSerializer

连接池解决了“高效沟通”的问题,让你不用频繁地建立和断开连接;而序列化解决了“语言不通”的问题,让Java对象和Redis的二进制数据能互相转换。 这两件事是使用Redis的基础,配置好了它们,你的应用才能健壮、高效地和Redis协同工作,在Spring Boot框架下,这些事情通过一些简单的配置就能完成,大大降低了我们使用的门槛。