spring-data-redis 整合springboot 2.1.3.RELEASE

本文介绍如何在Spring Boot项目中集成Redis,包括配置依赖、连接池、序列化方式及缓存管理等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

既然要整合框架,那么必不可少的要查询官方文档。

网上的文档,可以作为参考,但是千万不要直接用,除非标好了版本等信息 (且需要自己验证) 。

spring-data-redis官方文档:https://docs.spring.io/spring-data/redis/docs/2.1.5.RELEASE/reference/html/

不过这文档里面,也没写其他东西,没有实质性的作用;还是看看吧。

其他版本,可以根据这个网址,自己找。

 

1. 引入依赖

<!-- redis所需 (自带lettuce 5.1.4.RELEASE) lettuce是springboot2.x后连接redis推荐使用的客户端 -->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- lettuce pool 缓存连接池 -->
<!-- <commons-pool2.version>2.6.1</commons-pool2.version> -->
<dependency>
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-pool2</artifactId>
   <version>${commons-pool2.version}</version>
</dependency>

## 因为springboot版本不同,所以spring-data-redis版本也不一定相同。
## 这里的springboot版本为 2.1.3.RELEASE ,所以 spring-data-redis版本为:2.1.5.RELEASE

2. 增加配置 (根据自己的情况配置)

spring:
  redis:  ###### redis 配置
    host: 47.96.***.61  # ip地址
    database: 0  # redis数据库  0-15
    port: 63791  # 端口号
    password: # 无密码不填
    timeout: 30000s   # 连接超时时间 (默认1天)
    lettuce:
      shutdown-timeout: 100ms # 关闭超时时间 默认 100ms
      pool: # lettuce 连接池
        max-active: 8 # 连接池最大连接数 默认 8(-1 :表示没有限制)
        max-wait: 60000ms # 连接池最大阻塞等待时间 默认-1ms (-1 :表示没有限制) 这里设置1分钟
        max-idle: 8 # 最大空闲连接  默认 8
        min-idle: 0 # 最小空闲连接  默认 0

这时候,redis就可以开始简单的调用了。

但是,还需要一些简单的配置。 比如序列化redisTemplete保存的数据呀,还有就是redis缓存的配置呀,等

package com.toad.config.redis;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.time.Duration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

/**
 * @author wangqinmin
 * @date: 2019/3/20 10:29
 * redis配置: RedisConfig文件名不能修改
 * 配置序列化方式以及缓存管理器 @EnableCaching 开启缓存
 */
@Configuration
@EnableCaching
@AutoConfigureAfter(RedisAutoConfiguration.class)
public class RedisConfig {

    /**
     * 配置自定义redisTemplate
     * 因为使用的连接客户端为:Lettuce,所以RedisConnectionFactory实际传入数据为 LettuceConnectionFactory
     *
     * @param connectionFactory
     * @return
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(connectionFactory);
        template.setValueSerializer(jackson2JsonRedisSerializer());
        //使用StringRedisSerializer来序列化和反序列化redis的key值
        template.setKeySerializer(new StringRedisSerializer());
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(jackson2JsonRedisSerializer());
        template.afterPropertiesSet();
        return template;
    }

    /**
     * json序列化
     *
     * @return
     */
    @Bean
    public RedisSerializer<Object> jackson2JsonRedisSerializer() {
        //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值
        Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);

        ObjectMapper mapper = new ObjectMapper();
        mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        serializer.setObjectMapper(mapper);
        return serializer;
    }

    /**
     * 配置缓存管理器
     * 需要注意的是 你在RedisTemplate<String, Object>中的配置的key,value序列化方法并不会生效
     * 需要在RedisCacheConfiguration中单独配置。
     *
     * @param redisConnectionFactory
     * @return
     */
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
        // 生成一个默认配置,通过config对象即可对缓存进行自定义配置
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
        // 设置缓存的默认过期时间,也是使用Duration设置 (此处为缓存1分钟)
        config = config.entryTtl(Duration.ofMinutes(1))
                // 设置 key为string序列化
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
                // 设置value为json序列化
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer()))
                // 不缓存空值
                .disableCachingNullValues();

        // 设置一个初始化的缓存空间set集合
        Set<String> cacheNames = new HashSet<>();
        cacheNames.add("timeGroup");
        cacheNames.add("user");
        cacheNames.add("UUser");

        // 对每个缓存空间应用不同的配置
        Map<String, RedisCacheConfiguration> configMap = new HashMap<>();
        configMap.put("timeGroup", config);
        // 该缓存空间,缓存时间120秒
        configMap.put("user", config.entryTtl(Duration.ofSeconds(120)));
        configMap.put("UUser", config.entryTtl(Duration.ofDays(3)));

        // 使用自定义的缓存配置初始化一个cacheManager
        RedisCacheManager cacheManager = RedisCacheManager.builder(redisConnectionFactory)
                // 一定要先调用该方法设置初始化的缓存名,再初始化相关的配置
                .initialCacheNames(cacheNames)
                .withInitialCacheConfigurations(configMap)
                .build();
        return cacheManager;
    }

}

redis的保存数据调用的例子:

package com.toad.swan.web.controller;

import com.toad.common.base.BaseController;
import com.toad.common.baseclass.ApiResult;
import com.toad.swan.entity.UUser;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;

/**
 * <p>
 * 充电订单 前端控制器
 * </p>
 *
 * @author wangqinmin
 * @since 2019-03-21
 */
@RestController
@RequestMapping("/redis")
@Slf4j
@Api("redis")
public class RedisController extends BaseController {

    @Autowired
    private RedisTemplate redisTemplate;
    //private RedisTemplate<String, Object> redisTemplate;

    /**
     * 添加用户
     */
    @PostMapping("/add")
    @ApiOperation(value = "redis添加用户", notes = "redis", response = ApiResult.class)
    public Object addSysUser(@Valid @RequestBody UUser uUser) throws Exception {
        redisTemplate.opsForValue().set("uUserTest", uUser.toString());
        logger.info("redis保存数据为:[{}]", uUser.toString());
        return success(true);
    }

    /**
     * 获取用户
     */
    @PostMapping("/get")
    @ApiOperation(value = "redis获取用户", notes = "redis", response = ApiResult.class)
    public Object addUser() throws Exception {
        Object uu = redisTemplate.opsForValue().get("uUserTest");
        redisTemplate.delete("uUserTest");
        logger.info("redis中获取数据:[{}]", uu);
        logger.error("redis中获取数据:[{}]", uu);
        logger.warn("redis中获取数据:[{}]", uu);
        logger.debug("redis中获取数据:[{}]", uu);
        return success(uu);
    }
}

使用redis缓存的例子:

package com.toad.swan.service.impl;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.toad.swan.entity.UUser;
import com.toad.swan.mapper.UUserMapper;
import com.toad.swan.service.UUserService;
import com.toad.swan.web.param.UUserParam;
import com.toad.swan.web.vo.UUserVo;
import com.toad.common.baseclass.*;
import com.toad.common.base.BaseServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.io.Serializable;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author wangqinmin
 * @since 2019-03-21
 */
@Service
@Transactional(rollbackFor = Exception.class)
@Slf4j
public class UUserServiceImpl extends BaseServiceImpl<UUserMapper, UUser> implements UUserService {

    @Autowired
    private UUserMapper uUserMapper;

    /**
     * 修改缓存
     * <p>
     * redis缓存--更新(修改)数据
     *
     * @param uUser
     * @return
     * @CachePut 应用到写数据的方法上,如新增/修改方法,调用方法时会自动把相应的数据放入缓存
     */
    @CachePut(value = {"user"}, key = "#root.args[0]", unless = "#user eq null ")
    @Override
    public boolean redisCacheUpdateById(UUser uUser) {
        int i = uUserMapper.updateById(uUser);
        if (i == 1) {
            return true;
        }
        return false;
    }

    /**
     * 删除缓存
     *
     * @param id
     * @return
     * @CacheEvict 应用到删除数据的方法上,调用方法时会从缓存中删除对应key的数据condition 与unless相反,只有表达式为真才会执行。
     * redis缓存--移除数据
     */
    @CacheEvict(value = {"user"}, key = "#root.args[0]", condition = "#result eq true")
    @Override
    public boolean redisCacheRemoveById(String id) {
        int i = uUserMapper.deleteById(id);
        if (i == 1) {
            return true;
        }
        return false;
    }

    /**
     * redis缓存--获取一条数据
     *
     * @param id
     * @return
     * @Cacheable 应用到读取数据的方法上,先从缓存中读取,如果没有再从DB获取数据,然后把数据添加到缓存中key 缓存在redis中的keyunless 表示条件表达式成立的话不放入缓存
     */
    @Cacheable(value = "user", key = "args[0]", unless = "#result eq null ")
    @Override
    public UUserVo redisCacheGetUUserById(String id) {
        return uUserMapper.getUUserById(id);
    }

}
package com.toad.common.base;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.toad.common.baseclass.OrderEnum;
import com.toad.common.baseclass.QueryParam;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author wangqinmin
 * @date 2018-11-08
 */
public abstract class BaseServiceImpl<M extends BaseMapper<T>, T> extends ServiceImpl<M, T> implements BaseService<T> {

    protected Logger logger = LoggerFactory.getLogger(getClass());

    protected Page setPageParam(QueryParam queryParam) {
        return setPageParam(queryParam, null, null);
    }

    protected Page setPageParam(QueryParam queryParam, String defaultOrderField, OrderEnum orderEnum) {
        Page page = new Page();
        page.setCurrent(queryParam.getCurrent());
        page.setSize(queryParam.getSize());
        page.setAsc(queryParam.getAscs());
        page.setDesc(queryParam.getDescs());

        if (orderEnum == OrderEnum.DESC) {
            page.setDesc(defaultOrderField);
        } else {
            page.setAsc(defaultOrderField);
        }

        return page;
    }

}
package com.toad.common.base;

import com.baomidou.mybatisplus.extension.service.IService;

/**
 * @author wangqinmin
 * @date 2018-11-08
 */
public interface BaseService<T> extends IService<T> {

}

 

<think>好的,我现在需要帮助用户解决Spring DataRedisSpring Boot版本兼容性的问题。首先,我得回顾用户提供的引用内容,里面提到了版本冲突的情况,比如spring-boot-starter-data-redisspring-boot-autoconfigure的依赖冲突,以及需要调整spring-data-commons版本2.6.1。还有用户提到,在Spring Boot2.3.4.RELEASE中,commons-pool2版本2.8.1,而如果降低SpringBoot版本2.0.2.RELEASE可以解决某些问题。此外,用户还引用了错误信息,涉及LettuceConnectionConfiguration和GenericObjectPoolConfig的兼容性问题。用户现在明确想查找spring-data-redisSpring Boot兼容的版本对应关系。我需要整理官方文档或可靠来源中的版本对应信息。通常,Spring Boot的每个版本都会内置兼容的SpringData模块版本,包括SpringData Redis。因此,正确的做法是参考SpringBoot官方文档中的版本关系表,比如SpringBootReleaseNotes或版本依赖管理部分。例如,Spring Boot2.6.x通常对应SpringData2021.0.x,而SpringBoot2.5.x对应SpringData2021.0.x的早期版本。具体的版本对应可能需要查阅具体的版本矩阵。此外,用户提到的spring-data-commons版本也需要和Spring Boot保持一致,因为它是Spring Data的公共模块。另外,用户的问题可能涉及到commons-pool2版本,因为Redis连接池依赖它。在Spring Boot2.4及以上版本,可能需要commons-pool22.9.0或更高,而旧版本可能使用2.8.1。如果用户使用的SpringBoot版本较旧,可能需要显式指定commons-pool2版本来避免冲突。总结下来,我需要提供一个版本对应表,列出常见的Spring Boot版本及其对应的SpringData Redis版本。同时,提醒用户检查依赖管理,使用SpringBoot的父POM来自动管理版本,或者在无法升级时手动排除冲突的依赖,并指定兼容版本。此外,处理commons-pool2版本兼容性也是关键点之一。可能还需要提到如何检查当前项目的依赖树,使用Maven的dependency:tree命令来识别冲突,并据此调整版本。最后,给出一个示例的POM配置,说明如何正确引入依赖,确保版本一致。</think>要确定Spring Data RedisSpring Boot的兼容版本对应关系,需参考官方提供的版本依赖表。以下是常见版本的对应关系及解决方法: ### 版本对应关系 | Spring Boot版本 | Spring Data Redis版本 | 要求依赖的`commons-pool2`版本 | |-----------------------|-----------------------|-------------------------------| | 2.7.x / 3.0.x | 3.0.x | 2.11.1 | | 2.6.x | 2.6.x | 2.11.0 | | 2.5.x | 2.5.x | 2.9.0 | | 2.4.x | 2.4.x | 2.9.0 | | 2.3.x | 2.3.x | 2.8.1 | | 2.2.x | 2.2.x | 2.6.2 | ### 解决方法 1. **使用Spring Boot父级依赖管理** 在`pom.xml`中继承`spring-boot-starter-parent`,版本号需与Spring Data Redis兼容: ```xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.11</version> <!-- 示例版本 --> </parent> ``` Spring Boot会自动管理子模块版本[^1][^3]。 2. **手动指定版本(不推荐)** 若需覆盖默认版本,显式声明依赖: ```xml <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>2.6.11</version> <!-- 需与Spring Boot版本匹配 --> </dependency> ``` 3. **处理`commons-pool2`冲突** 若出现`GenericObjectPoolConfig`错误,需确保`commons-pool2`版本兼容: ```xml <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.11.1</version> <!-- 根据Spring Boot版本选择 --> </dependency> ``` 4. **排除冲突依赖** 若第三方库引入不兼容版本,使用`<exclusion>`: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <exclusions> <exclusion> <groupId>org.springframework.data</groupId> <artifactId>spring-data-commons</artifactId> </exclusion> </exclusions> </dependency> ``` ### 验证步骤 1. 执行`mvn dependency:tree`检查依赖树,确认是否有版本冲突[^4]。 2. 查看日志中明确的类路径错误(如`LettuceConnectionConfiguration`),定位冲突模块[^5]。 3. 参考[Spring官方版本兼容性文档](https://spring.io/projects/spring-data#overview)确认对应关系。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值