Spring Boot 中使用 Redis

前言

Spring Boot 中使用 Redis,具体有以下几个步骤:

  1. 添加依赖
  2. 编辑配置文件
  3. 编辑配置类

1. 添加 Redis 客户端的 Maven 依赖


xml 复制代码
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

脚本很简单,但是有 2 个问题,需要我们探讨一下

  • 什么是Redis客户端
  • 什么是Spring Boot Starter

Spring Boot 项目中使用 Redis,需要使用对应的 Redis客户端

Redis客户端

能够与 Redis 服务器进行通信并执行数据操作的程序或工具 ,其核心作用是作为用户与 Redis 服务之间的交互接口。

常见的Redis 客户端 Java 库有:JedisLettuce

从性能、资源损耗等多个对比维度,来说,Lettuce会更有优势

spring-boot-starter-data-redis 默认的Redis客户端工具就是Lettuce

本文也是使用Lettuce作为Redis 客户端

那么,什么又是Spring Boot Starter呢?

它的翻译是:Spring Boot 场景启动器

作用是把当前场景要用的jar包都引入进来,简化依赖配置

命名格式

官方格式通常为:spring-boot-starter-*

第三方格式:*-spring-boot-starter


比如前面添加的spring-boot-starter-data-redis,我们就可以得知,它是Spring官方提供的一个场景启动器
每一个starter都有一个基础依赖:spring-boot-starter

2. 编辑 yaml 配置文件


yaml 复制代码
spring:
  redis:
    host: 192.168.0.1
    port: 6379
    password: 123321
    lettuce:
      pool:
        max-active: 10  #最大连接
        max-idle: 10   #最大空闲连接
        min-idle: 1   #最小空闲连接
        max-wait: 1s #连接等待时间
        time-between-eviction-runs: 30s # 定期检测空闲连接

主要是配置Redis连接信息,以及lecttuce连接池信息

Redis 连接池

一种 管理 Redis 连接的机制,用于避免频繁创建和销毁连接带来的性能开销,提升系统效率和资源利用率

可以视具体情况考虑是否使用连接池,以及调整连接池参数

3. 编辑配置类


java 复制代码
@Configuration
@Slf4j
public class RedisConfiguration {

    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
        log.info("开始创建redis模板对象...");
        RedisTemplate redisTemplate = new RedisTemplate();
        // 设置redis的连接工厂对象
        // 在这步可以切换 redis 客户端,前提是定义好 redisConnectionFactory
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        
        // 设置redis key的序列化器
        redisTemplate.setKeySerializer(RedisSerializer.string());
        redisTemplate.setHashKeySerializer(RedisSerializer.string());
        // 设置redis value的序列化器
        // 自动添加 `@class` 类型信息,避免反序列化失败
        // 特征:序列化后有 class 信息
        redisTemplate.setValueSerializer(RedisSerializer.json());
        redisTemplate.setHashValueSerializer(RedisSerializer.json());
        return redisTemplate;
    }
}

我们着重关注对于Rdis序列化器改造,即

java 复制代码
redisTemplate.setKeySerializer(RedisSerializer.string());
redisTemplate.setHashKeySerializer(RedisSerializer.string());

redisTemplate.setValueSerializer(RedisSerializer.json());
redisTemplate.setHashValueSerializer(RedisSerializer.json());

注意 以上代码属于Spring Data Redis 2.2+推荐写法,如果你的Spring Data Redis版本较低,可以使用如下代替

java 复制代码
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());

redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());

为什么我们要自定义序列化器呢?

默认的序列化器,在redis中存储的数据是这样的

缺点很明显:可读性差,内存占用较大

自定义序列化器便是为了解决这些问题

当然,也有其他方式进行自定义序列化,比如Jackson2JsonRedisSerializerFastJson等方式,在此不做展开

测试


自此,我们便可以通过redisTemplate提供的相关方法进行使用了

java 复制代码
 @SpringBootTest
class RedisStringTests {

    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    void testString() {
        // 写入一条String数据
        redisTemplate.opsForValue().set("name", "Tom");
        // 获取string数据
        Object name = stringRedisTemplate.opsForValue().get("name");
        System.out.println("name = " + name);
    }
}
相关推荐
练习时长一年1 小时前
AopAutoConfiguration源码阅读
java·spring boot·intellij-idea
Q_Q19632884756 小时前
python的电影院座位管理可视化数据分析系统
开发语言·spring boot·python·django·flask·node.js·php
TT哇7 小时前
@[TOC](计算机是如何⼯作的) JavaEE==网站开发
java·redis·java-ee
蚰蜒螟9 小时前
Spring 和 Lettuce 源码分析 Redis 节点状态检查与失败重连的工作原理
java·redis·spring
Runing_WoNiu9 小时前
Redis主从架构、哨兵模式及集群比较
数据库·redis·架构
悟纤9 小时前
Spring Boot 实用小技巧:多级缓存(Caffeine + Redis)- 第545篇
spring boot·后端·spring
MrSYJ10 小时前
UserDetailService是在什么环节生效的,为什么自定义之后就能被识别
java·spring boot·后端
Noii.12 小时前
Spring Boot初级概念及自动配置原理
java·spring boot·后端
勿在浮沙筑高台12 小时前
无法获取实体类com.example.springdemo2.entity.po.UserPO对应的表名!
java·spring boot·mybatis
掉头发的王富贵13 小时前
ShardingSphere-JDBC入门教程(上篇)
spring boot·后端·mysql