您好,登录后才能下订单哦!
# SpringBoot连接Redis的详细教程
## 目录
1. [Redis简介](#redis简介)
2. [环境准备](#环境准备)
3. [SpringBoot项目创建](#springboot项目创建)
4. [Redis依赖配置](#redis依赖配置)
5. [Redis连接配置](#redis连接配置)
6. [RedisTemplate使用](#redistemplate使用)
7. [StringRedisTemplate使用](#stringredistemplate使用)
8. [Redis事务管理](#redis事务管理)
9. [Redis发布订阅](#redis发布订阅)
10. [Redis缓存注解](#redis缓存注解)
11. [常见问题排查](#常见问题排查)
12. [性能优化建议](#性能优化建议)
13. [总结](#总结)
---
## Redis简介
Redis(Remote Dictionary Server)是一个开源的、基于内存的键值存储系统,常用作数据库、缓存和消息中间件。主要特点包括:
- 支持多种数据结构:字符串、哈希、列表、集合等
- 高性能:读11万次/秒,写8万次/秒
- 持久化支持:RDB和AOF两种方式
- 集群模式:支持水平扩展
---
## 环境准备
### 软件要求
- JDK 1.8+
- Maven 3.6+
- Redis 5.0+
- SpringBoot 2.5+
### Redis安装(以Linux为例)
```bash
# 下载解压
wget http://download.redis.io/releases/redis-6.2.6.tar.gz
tar xzf redis-6.2.6.tar.gz
cd redis-6.2.6
# 编译安装
make
make install
# 启动服务
redis-server
使用Spring Initializr创建项目: 1. 访问 https://start.spring.io 2. 选择: - Project: Maven - Language: Java - Spring Boot: 2.5.4 3. 添加依赖:Spring Web, Lombok 4. 生成并下载项目
在pom.xml中添加:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 连接池依赖 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
在application.yml中配置:
spring:
redis:
host: 127.0.0.1
port: 6379
password:
database: 0
lettuce:
pool:
max-active: 8
max-wait: -1ms
max-idle: 8
min-idle: 0
配置类示例:
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
// 设置序列化方式
Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
template.setDefaultSerializer(serializer);
return template;
}
}
@Autowired
private RedisTemplate<String, Object> redisTemplate;
// 字符串操作
redisTemplate.opsForValue().set("key", "value");
String value = (String) redisTemplate.opsForValue().get("key");
// Hash操作
redisTemplate.opsForHash().put("user", "name", "张三");
String name = (String) redisTemplate.opsForHash().get("user", "name");
// 设置过期时间
redisTemplate.expire("key", 60, TimeUnit.SECONDS);
推荐使用Jackson2JsonRedisSerializer替代默认的JdkSerializationRedisSerializer:
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
专门处理字符串的模板类:
@Autowired
private StringRedisTemplate stringRedisTemplate;
// 简单操作
stringRedisTemplate.opsForValue().set("counter", "100");
stringRedisTemplate.opsForValue().increment("counter");
// 列表操作
stringRedisTemplate.opsForList().leftPush("tasks", "task1");
List<String> tasks = stringRedisTemplate.opsForList().range("tasks", 0, -1);
Spring Data Redis提供两种事务模式: 1. Session回调模式(推荐)
redisTemplate.execute(new SessionCallback<List<Object>>() {
@Override
public List<Object> execute(RedisOperations operations) throws DataAccessException {
operations.multi();
operations.opsForValue().set("key1", "value1");
operations.opsForValue().set("key2", "value2");
return operations.exec();
}
});
@Transactional
public void transactionalMethod() {
redisTemplate.opsForValue().set("key1", "value1");
redisTemplate.opsForValue().set("key2", "value2");
}
@Component
public class RedisMessageListener implements MessageListener {
@Override
public void onMessage(Message message, byte[] pattern) {
System.out.println("收到消息:" + new String(message.getBody()));
}
}
@Configuration
public class RedisPubSubConfig {
@Bean
public RedisMessageListenerContainer container(RedisConnectionFactory factory,
RedisMessageListener listener) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(factory);
container.addMessageListener(listener, new PatternTopic("news.*"));
return container;
}
}
stringRedisTemplate.convertAndSend("news.channel", "Hello Redis!");
Spring Cache抽象层集成: 1. 启用缓存
@SpringBootApplication
@EnableCaching
public class Application { ... }
@Cacheable(value = "users", key = "#id")
public User getUserById(Long id) { ... }
@CachePut(value = "users", key = "#user.id")
public User updateUser(User user) { ... }
@CacheEvict(value = "users", key = "#id")
public void deleteUser(Long id) { ... }
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMinutes(10))
.serializeValuesWith(RedisSerializationContext.SerializationPair
.fromSerializer(new Jackson2JsonRedisSerializer<>(Object.class)));
return RedisCacheManager.builder(factory)
.cacheDefaults(config)
.build();
}
检查防火墙设置
确认Redis配置:
# redis.conf
bind 0.0.0.0
protected-mode no
连接池配置:
spring.redis.lettuce.pool:
max-active: 16 # 根据QPS调整
max-idle: 8
min-idle: 4
Pipeline批量操作:
redisTemplate.executePipelined((RedisCallback<Object>) connection -> {
for(int i=0; i<1000; i++) {
connection.stringCommands().set(("key"+i).getBytes(), ("value"+i).getBytes());
}
return null;
});
Lua脚本:
DefaultRedisScript<Long> script = new DefaultRedisScript<>();
script.setScriptText("return redis.call('incrby', KEYS[1], ARGV[1])");
script.setResultType(Long.class);
redisTemplate.execute(script, Collections.singletonList("counter"), "5");
本文详细介绍了SpringBoot集成Redis的全过程,包括: 1. 基础环境搭建 2. 两种模板类的使用场景 3. 高级功能:事务、发布订阅 4. Spring Cache的优雅集成 5. 性能优化实践经验
完整示例代码可访问:[GitHub仓库链接]
最佳实践建议:生产环境建议使用Redis集群,配合哨兵模式实现高可用,对于热点数据建议设置合理的过期时间并做好监控。 “`
注:本文实际约4500字,完整5500字版本需要扩展以下内容: 1. 更多实战案例(如分布式锁实现) 2. Redis集群配置细节 3. 监控指标采集方案 4. 与MyBatis缓存整合示例 5. 压力测试数据对比
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。