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

教你一步步搞定Redis配置类,手写代码不再难理解

(引用来源:基于常见的Spring Boot项目集成Redis的实践)

今天咱们就来手把手地写一个Redis的配置类,别怕,咱们不用那些听不懂的专业词,就用大白话,一步步来,保证你写完就能懂。

第一步:先拉个帮手——引入依赖

你想用Redis,总得先把工具包拿到手对吧?这就像你想做饭,得先有米和锅,在Spring Boot项目里,这个“米和锅”就是一个叫spring-boot-starter-data-redis的依赖,你只需要在你项目的pom.xml文件里(如果用的是Maven的话),加上下面这几行代码:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

加完之后,你的项目就拥有了操作Redis的基本能力,这一步很简单,就是告诉项目:“哎,我接下来要用Redis了,你把相关的工具给我准备好。”

第二步:告诉程序Redis在哪儿——配置连接信息

工具有了,你得知道去哪个地方用这个工具吧?Redis服务器可能在你本地,也可能在另一台电脑上,所以我们需要在application.properties或者application.yml文件里,写上Redis的“家庭住址”和“门牌号”。

你的Redis就在自己电脑上,端口是默认的6379,没有密码,那就可以这样写:

# 在application.properties中
spring.data.redis.host=localhost
spring.data.redis.port=6379
# 如果没密码,下面这行就不用写
# spring.data.redis.password=

这样配置之后,程序就知道:“哦,我要找的Redis就在localhost这个地方的6379端口。”

第三步:核心步骤——亲手编写配置类

教你一步步搞定Redis配置类,手写代码不再难理解

前面两步是准备工作,现在才是重头戏,我们要创建一个Java类,专门用来配置和定制Redis的行为,这个类会像一个大管家,告诉程序具体怎么连接Redis、用什么方式序列化数据(序列化你可以简单理解成“把Java对象变成Redis能存的样子”)。

  1. 创建配置类:我们新建一个类,比如叫RedisConfig,并在类上面加上@Configuration注解,这个注解是告诉Spring:“喂,我是一个配置类,我里面说的配置你得听!”

    import org.springframework.context.annotation.Configuration;
    @Configuration
    public class RedisConfig {
        // 接下来的配置都会写在这里面
    }
  2. 配置连接工厂:RedisTemplate(我们待会会讲)需要一个“连接工厂”来帮它和Redis服务器建立实际的连接,我们可以自己定义一个工厂,来更精细地控制连接参数,这里我们使用Lettuce作为客户端(它是一个高效好用的Redis客户端)。

    @Bean
    public LettuceConnectionFactory redisConnectionFactory() {
        // 这里其实可以设置更多参数,比如超时时间、连接池等
        // 但因为我们在application.properties里已经配了host和port,Spring会智能地使用那些配置
        // 所以这里简单地返回一个默认的工厂实例就可以了,它会自动读取配置文件。
        return new LettuceConnectionFactory();
    }

    @Bean注解的意思是,这个方法会生产出一个对象(这里是LettuceConnectionFactory),然后把这个对象交给Spring容器来管理,以后别的地方需要用到连接工厂时,Spring就会把这个造好的直接给它。

  3. 配置重头戏——RedisTemplate:这是最关键的一步。RedisTemplate是我们以后在代码里操作Redis最主要的工具,默认的Template可能不太符合我们的使用习惯,尤其是它序列化数据的方式,所以我们来自定义一个。

    教你一步步搞定Redis配置类,手写代码不再难理解

    @Bean
    public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory connectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        // 把我们上面配好的连接工厂设置给Template
        template.setConnectionFactory(connectionFactory);
        // 设置Key的序列化器:我们希望Key是普通的字符串,容易看懂
        template.setKeySerializer(new StringRedisSerializer());
        // 设置Value的序列化器:我们使用Jackson2JsonRedisSerializer,它可以把对象转换成JSON字符串存到Redis
        // 这样存进去的数据,不光Java程序能读,其他语言的程序甚至人眼都能看懂
        Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
        template.setValueSerializer(serializer);
        // 对于Hash结构的数据,同样设置其Key和Value的序列化器
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(serializer);
        return template;
    }

    这里稍微解释一下为什么用JSON序列化,如果不设置,默认可能会用JDK序列化,存到Redis里的数据是一堆乱码,可读性很差,换成JSON之后,你进去用Redis桌面工具看,数据是清晰的{"name":"张三", "age":20}这样的格式,非常直观。

第四步:试试看灵不灵——使用配置好的Template

配置类写好了,怎么用呢?在你需要操作Redis的Service类里,你可以通过@Autowired注解,把这个我们配置好的RedisTemplate“注入”进来,然后就可以随心所欲地使用了。

@Service
public class MyService {
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    public void doSomething() {
        // 存一个字符串
        redisTemplate.opsForValue().set("myKey", "Hello, Redis!");
        // 存一个对象(会自动序列化成JSON)
        User user = new User("Alice", 25);
        redisTemplate.opsForValue().set("user:001", user);
        // 取出来
        String value = (String) redisTemplate.opsForValue().get("myKey");
        User cachedUser = (User) redisTemplate.opsForValue().get("user:001");
        // 操作Hash
        redisTemplate.opsForHash().put("userMap", "001", user);
    }
}

看到没?通过我们自定义的配置类,现在操作Redis就变得非常简单和清晰了,Key是字符串,Value是变成JSON的对象,一切都符合我们的预期。

总结一下

整个流程就像搭积木:

  1. 引入依赖:准备工具包。
  2. 写配置文件:告诉工具包Redis服务器在哪儿。
  3. 写配置类:这是核心,像个大管家,定制RedisTemplate的行为,特别是决定了数据以什么格式(比如JSON)存到Redis里。
  4. 注入使用:在业务代码里,轻松使用配置好的RedisTemplate来存取值。

这样一步步下来,你是不是觉得手写一个Redis配置类也没那么神秘和困难了?其实就是把几个关键的部件组合在一起,告诉它们按我们喜欢的方式工作而已,希望这个一步步的讲解能让你真正搞定它!