【springboot学习】集成redis-RedisTemplate

本文详细介绍Redis数据类型的存储机制,以及如何通过Spring Boot配置RedisTemplate实现对象的序列化存储,包括不同序列化方式的选择与配置。
redis数据类型指的啥

redis自身是一个map,其中所有的数据嗾使采用key:value的形式存储。

key永远都是字符串,数据类型(字符串,hash,set,list)永远指的是右边value
在这里插入图片描述
redis最终存储的都只是基本数据类型,字符串,整数,浮点数,布尔值,字符等,而无法直接存储对象,但是我们可以通过序列化手段把对象变成字符串,这样就可以存储在redis中了,但是jedis只支持字符串和字节数组,而字符串最终也会转换成字节数组写到redis中(字节流传输)。如果想要直接存储对象,可以使用spring的RedisTemplate,方便基础类型和 Java 对象之间的转换。
首先导入依赖包

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

而对象保存在redis中,只保存空对象肯定没啥意义,这就需要序列化对象,将对象持久化到redis中,RedisTemplate默认使用JDK的序列化方式,当然我们一般如下配置。

推荐key使用StringRedisSerializer,保持的key简明易读;value可以使用Jackson2JsonRedisSerializer,这也可以综合考虑效率和可读性,但牺牲部分空间,

@Configuration
public class RedisConfig {

	@Bean
	public RedisTemplate<String,Object> redisTemplate(final RedisConnectionFactory factory) {
		RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
		template.setConnectionFactory(factory);// 配置连接工厂
		Jackson2JsonRedisSerializer<Object> jacksonSeial = new Jackson2JsonRedisSerializer<Object>(Object.class);
		ObjectMapper om = new ObjectMapper();
		// 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
		om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
		// 指定序列化输入的类型,类必须是非final的,final修饰的类,比如String,Integer等会抛出异常
		om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
		jacksonSeial.setObjectMapper(om);
		template.setValueSerializer(jacksonSeial);
		template.setKeySerializer(new StringRedisSerializer());
		return template;
	}
}

当然也可以采用其他的序列化方式,spring-data-redis提供如下几种选择:

GenericToStringSerializer: 可以将任何对象泛化为字符串并序列化
Jackson2JsonRedisSerializer: 跟JacksonJsonRedisSerializer实际上是一样的
JacksonJsonRedisSerializer: 序列化object对象为json字符串
JdkSerializationRedisSerializer: 序列化java对象
StringRedisSerializer: 简单的字符串序列化

具体的区别看这篇文章

连接redis

配置好了RedisTemplate,我们还需要让RedisTemplate连接到redis服务器呀,RedisTemplate默认使用JedisConnectionFactory来连接redis服务器。具体可以搜一下RedisAutoConfiguration这个是核心配置类。
在这里插入图片描述

spring.redis.host=localhost
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=

到此RedisTemplate就配置好了.

方法使用

下面就直接在程序中注入就可以使用了。

@Service
public class RedisService {

	@Autowired
	RedisTemplate<String, Object> redisTemplate;

	public void setKeyValue(final String key, final Object value) {

		redisTemplate.opsForValue().set(key, value);
	}

	public Object getKeyValue(final String key) {
		return redisTemplate.opsForValue().get(key);
	}

}

redisTemplate.opsForValue()相对于redis的string类型,当然其他数据类型都是相对应的,如下:

redisTemplate方法redis数据类型
opsForValue()string
opsForHash()hash
opsForList()list
opsForSet()set
opsForZSet()zset

| list |
| opsForSet() | set |
| opsForZSet() | zset |

<think>嗯,我需要帮用户解决在SpringBoot项目中同时使用RedisTemplateRedisson客户端的问题。用户引用了四段资料,其中提到了依赖配置、客户端混用和自动配置相关内容。用户的核心诉求是寻求同时使用两者的最佳实践和冲突解决方案。结合引用内容来看,关键点似乎在于配置隔离和资源优化。引用[2]展示了如何分别配置RedisTemplateRedisson,这点很重要。引用[3]提到redisson-spring-boot-starter会自动注册RedissonClient,这说明用户可能需要干预自动配置过程。引用[4]则指出SpringBoot2默认使用Lettuce驱动,而Redisson使用Netty框架,这意味着两者可能存在连接冲突。用户可能担心的是连接资源浪费和配置重叠问题。实际开发中常见的情况是:开发者想用Redisson的分布式功能,同时保留SpringDataRedis的便捷操作。这确实需要特殊处理,否则容易造成双重连接池之类的资源浪费。最佳实践应该包括四个层面:首先是依赖管理,必须确认spring-boot-starter-data-redisredisson-spring-boot-starter的版本兼容性;其次是连接工厂共享,让RedisTemplate复用Redisson的连接池很重要;然后是明确的配置隔离,比如分库号或前缀区分;最后还要考虑序列化一致性。比较棘手的可能是连接共享的实现。根据引用[1]和[4],Lettuce本身支持共享连接,但Redisson需要特定配置才能让RedisTemplate使用其底层的Lettuce连接。这需要参考RedissonClient.getConfig().useSingleServer().getConnectionManager()这类方法来获取原始连接工厂。另外线程安全也值得注意。引用[4]提到Lettuce的API是线程安全的,但RedisTemplate默认不是线程安全的,这点在并发场景下需要特别处理。建议用户在@Bean配置里加上@Scope("prototype")。最后应该提醒用户,如果不需要高级功能,其实单独使用Redisson的RBucket等接口也能替代RedisTemplate的部分功能,这样可能更简洁。但考虑到用户明确要求混用,重点还是要放在资源复用和避坑指南上。</think> 在Spring Boot项目中同时使用`RedisTemplate`和`RedissonClient`是可行的,但需注意以下**最佳实践和冲突解决方案**: --- ### 一、核心最佳实践 #### 1. **依赖隔离与配置分离** ```java // RedisTemplate 独立配置(引用[2]扩展) @Bean("myRedisTemplate") public RedisTemplate<String, Object> redisTemplate( RedisConnectionFactory factory) { // 关键点:共享ConnectionFactory RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(factory); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); return template; } // Redisson 独立配置(引用[3][4]) @Bean(destroyMethod = "shutdown") public RedissonClient redisson() { Config config = new Config(); config.useSingleServer().setAddress("redis://127.0.0.1:6379"); return Redisson.create(config); } ``` **关键点**: - 两者**共用同一个`RedisConnectionFactory`**(如Lettuce),避免创建两套连接池(引用[4]) - 为`RedisTemplate`显式配置序列化器,防止与Redisson的序列化冲突 #### 2. **连接工厂复用**(解决资源浪费) ```yaml # application.yml (优化连接) spring: redis: lettuce: pool: max-active: 10 # 控制总连接数 ``` 通过限制Lettuce连接池大小(Redisson底层复用Lettuce),避免双重连接池导致的资源浪费(引用[4])。 --- ### 二、典型冲突与解决方案 #### 1. **序列化冲突** **问题**: Redisson默认使用`org.redisson.codec.JsonJacksonCodec`,而`RedisTemplate`可能用JDK序列化,混用时数据不可读。 **解决方案**: 统一使用Jackson序列化: ```java // Redisson配置 config.setCodec(new JsonJacksonCodec()); // RedisTemplate配置 template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); ``` #### 2. **事务管理冲突** **问题**: Spring事务管理器可能同时接管`RedisTemplate`和Redisson操作,导致事务边界混乱。 **解决方案**: - **方案1**:禁用Redisson事务 ```java config.setTransactionMode(TransactionMode.OFF); ``` - **方案2**:分离使用场景 - `RedisTemplate`用于简单K-V操作 - Redisson用于分布式锁、集合等高级功能 #### 3. **自动配置冲突**(引用[3]) **问题**: `redisson-spring-boot-starter`会**自动注册**`RedissonClient`和`RedisConnectionFactory`,可能覆盖自定义配置。 **解决方案**: 排除默认Bean: ```java @SpringBootApplication(exclude = { RedissonAutoConfiguration.class // 手动接管配置 }) ``` --- ### 三、性能优化建议 1. **连接复用** ```java // 通过Redisson获取底层连接工厂 @Autowired RedissonClient redissonClient; @Bean public RedisConnectionFactory connectionFactory() { return ((RedissonSpringDataConnectionFactory) redissonClient.getConfig().getConnectionManager()).getConnectionFactory(); } ``` 直接使用Redisson的`ConnectionManager`,彻底避免双重连接池(需redisson-spring-data依赖)。 2. **线程模型隔离** - `RedisTemplate`:同步阻塞操作 - `RedissonClient`:异步/响应式操作(如`RFuture`) --- ### 四、使用场景建议 | **组件** | **推荐场景** | **慎用场景** | |------------------|----------------------------------|---------------------| | `RedisTemplate` | 简单CRUD、Spring Cache集成 | 分布式锁、流处理 | | `RedissonClient`| 分布式锁、BloomFilter、消息队列 | 简单字符串操作 | > **最佳实践总结**:配置共享连接池 → 统一序列化 → 按需隔离事务 → 差异化使用场景。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值