Spring Boot与Redis深度整合:实战指南

2024-06-04 5367阅读

Spring Boot 整合 Redis 相当简单,它利用了 Spring Data Redis 项目,使得我们可以在 Spring Boot 应用中轻松地操作 Redis。以下是如何整合 Redis 到 Spring Boot 应用的基本步骤:

1. 添加依赖

首先,在你的 pom.xml 文件中添加 Spring Boot Data Redis 的依赖:

  
      
      
        org.springframework.boot  
        spring-boot-starter-data-redis  
      
      
      
        io.lettuce  
        lettuce-core  
      
      
      
        redis.clients  
        jedis  
      

注意:Lettuce和Jedis是Spring Boot支持的两个主要的Redis客户端,你可以选择其中一个。在Spring Boot 2.x中,默认使用Lettuce。 

2. 配置 Redis

在 application.properties 或 application.yml 文件中添加 Redis 的配置信息:

application.properties 示例

spring.redis.host=localhost  
spring.redis.port=6379  
spring.redis.password= # 如果设置了密码,则填写密码  
spring.redis.database=0 # Redis数据库索引(默认为0)  
spring.redis.jedis.pool.max-active=8 # 连接池最大连接数(使用Jedis时)  
spring.redis.jedis.pool.max-wait=-1ms # 连接池最大阻塞等待时间(使用Jedis时)  
spring.redis.jedis.pool.max-idle=8 # 连接池中的最大空闲连接(使用Jedis时)  
spring.redis.jedis.pool.min-idle=0 # 连接池中的最小空闲连接(使用Jedis时)  
spring.redis.lettuce.pool.max-active=8 # 连接池最大连接数(使用Lettuce时)  
spring.redis.lettuce.pool.max-wait=-1ms # 连接池最大阻塞等待时间(使用Lettuce时)  
spring.redis.lettuce.pool.max-idle=8 # 连接池中的最大空闲连接(使用Lettuce时)  
spring.redis.lettuce.pool.min-idle=0 # 连接池中的最小空闲连接(使用Lettuce时)

application.yml 示例

spring:  
  redis:  
    host: localhost  
    port: 6379  
    password: # 如果设置了密码,则填写密码  
    database: 0 # Redis数据库索引(默认为0)  
    jedis:  
      pool:  
        max-active: 8 # 连接池最大连接数(使用Jedis时)  
        max-wait: -1ms # 连接池最大阻塞等待时间(使用Jedis时)  
        max-idle: 8 # 连接池中的最大空闲连接(使用Jedis时)  
        min-idle: 0 # 连接池中的最小空闲连接(使用Jedis时)  
    lettuce:  
      pool:  
        max-active: 8 # 连接池最大连接数(使用Lettuce时)  
        max-wait: -1ms # 连接池最大阻塞等待时间(使用Lettuce时)  
        max-idle: 8 # 连接池中的最大空闲连接(使用Lettuce时)  
        min-idle: 0 # 连接池中的最小空闲连接(使用Lettuce时)

这里要说的是:

Lettuce和Jedis两者都是Java连接Redis的客户端

选择使用Lettuce而不是Jedis的原因如下:

线程安全性:
  • Lettuce 是基于 Netty 构建的,它使用异步和事件驱动的方式处理连接。因此,它可以在多个线程之间共享一个连接而不需要额外的同步,因此在高并发环境下更高效。
  • Jedis 是基于阻塞 I/O 的,并且不是线程安全的,如果在多个线程中共享同一个 Jedis 实例,需要使用连接池进行同步管理,这可能引入额外的复杂性。
    连接方式:
    • Lettuce 支持基于 Reactive Streams 的响应式编程模型,能够更好地与 Spring Reactor、Project Reactor 等框架集成,提供异步和非阻塞的操作。
    • Jedis 是同步的,并且在执行某些操作时会阻塞线程,这可能会影响应用程序的性能和响应性。
      性能和扩展性:
      • Lettuce 的设计目标是高性能和扩展性,它可以更好地利用 Redis 4.0 中引入的一些新特性(如 Redis Sentinel 和 Redis Cluster)。
      • Jedis 的设计目标更偏向于简单易用,对于一些特殊的 Redis 集群模式可能支持不够完善。
        维护和更新:
        • Lettuce 是一个活跃的项目,并且持续地得到更新和改进。
        • Jedis 在某些方面已经相对稳定,并且在一段时间内没有大的更新。

          3. 创建 Redis 配置类

          如果需要自定义 Redis 的配置(比如序列化器),可以创建一个配置类:

          import org.springframework.context.annotation.Bean;  
          import org.springframework.context.annotation.Configuration;  
          import org.springframework.data.redis.connection.RedisConnectionFactory;  
          import org.springframework.data.redis.core.RedisTemplate;  
          import org.springframework.data.redis.serializer.StringRedisSerializer;  
            
          @Configuration  
          public class RedisConfig {  
            
              @Bean  
              public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {  
                  RedisTemplate template = new RedisTemplate();  
                  template.setConnectionFactory(redisConnectionFactory);  
            
                  // 使用 StringRedisSerializer 来序列化和反序列化 key 值  
                  template.setKeySerializer(new StringRedisSerializer());  
                  // 使用 JdkSerializationRedisSerializer 来序列化和反序列化 value 值  
                  // 你也可以自定义序列化器  
                  template.setValueSerializer(new GenericToStringSerializer(Object.class));  
                    
                  template.afterPropertiesSet();  
                  return template;  
              }  
          }

          4. 使用 RedisTemplate 或 StringRedisTemplate

          在 Spring Boot 应用中,你可以注入 RedisTemplate 或 StringRedisTemplate 来操作 Redis:

          import org.springframework.beans.factory.annotation.Autowired;  
          import org.springframework.data.redis.core.RedisTemplate;  
          import org.springframework.stereotype.Service;  
            
          @Service  
          public class RedisService {  
            
              private final RedisTemplate redisTemplate;  
            
              @Autowired  
              public RedisService(RedisTemplate redisTemplate) {  
                  this.redisTemplate = redisTemplate;  
              }  
            
              public void setValue(String key, Object value) {  
                  redisTemplate.opsForValue().set(key, value);  
              }  
            
              public Object getValue(String key) {  
                  return redisTemplate.opsForValue().get(key);  
              }  
                
              // 其他操作...  
          }

          5. 编写测试

          import org.junit.jupiter.api.Test;
          import org.springframework.beans.factory.annotation.Autowired;
          import org.springframework.boot.test.context.SpringBootTest;
          import org.springframework.data.redis.core.StringRedisTemplate;
           
          import java.util.concurrent.TimeUnit;
           
          @SpringBootTest
          public class RedisTest {
              @Autowired
              private StringRedisTemplate stringRedisTemplate;
           
              @Test
              //测试redis
              void contextLoads2() {
                  //添加缓存键值对name:mijiu并设置过期时间为1小时
                  stringRedisTemplate.opsForValue().set("name","mijiu",10, TimeUnit.SECONDS);
                  System.out.println(stringRedisTemplate.opsForValue().get("name"));
           
              }
          }

    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]