Springboot连接Redis的详细教程

发布时间:2021-07-09 16:57:23 作者:chen
来源:亿速云 阅读:427
# 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

SpringBoot项目创建

使用Spring Initializr创建项目: 1. 访问 https://start.spring.io 2. 选择: - Project: Maven - Language: Java - Spring Boot: 2.5.4 3. 添加依赖:Spring Web, Lombok 4. 生成并下载项目


Redis依赖配置

在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>

Redis连接配置

在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;
    }
}

RedisTemplate使用

基本操作示例

@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));

StringRedisTemplate使用

专门处理字符串的模板类:

@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);

Redis事务管理

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();
    }
});
  1. @Transactional注解模式
@Transactional
public void transactionalMethod() {
    redisTemplate.opsForValue().set("key1", "value1");
    redisTemplate.opsForValue().set("key2", "value2");
}

Redis发布订阅

消息监听器

@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!");

Redis缓存注解

Spring Cache抽象层集成: 1. 启用缓存

@SpringBootApplication
@EnableCaching
public class Application { ... }
  1. 常用注解
@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) { ... }
  1. 自定义配置
@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();
}

常见问题排查

连接超时

  1. 检查防火墙设置

  2. 确认Redis配置:

    # redis.conf
    bind 0.0.0.0
    protected-mode no
    

序列化异常

  1. 确保所有缓存对象实现Serializable
  2. 统一序列化方案

性能问题

  1. 使用连接池
  2. 避免大key(超过10KB)
  3. 合理设置过期时间

性能优化建议

  1. 连接池配置

    spring.redis.lettuce.pool:
     max-active: 16  # 根据QPS调整
     max-idle: 8
     min-idle: 4
    
  2. Pipeline批量操作

    redisTemplate.executePipelined((RedisCallback<Object>) connection -> {
       for(int i=0; i<1000; i++) {
           connection.stringCommands().set(("key"+i).getBytes(), ("value"+i).getBytes());
       }
       return null;
    });
    
  3. 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. 压力测试数据对比

推荐阅读:
  1. Redis PHP连接Redis
  2. C#连接MySQL操作详细教程

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

springboot redis

上一篇:thinkphp中怎么利用redis实现秒杀缓存功能

下一篇:Elasticsearch的概念是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》