分享免费的编程资源和教程

网站首页 > 技术教程 正文

SpringBoot 2.0系列文章之集成redis 服务(Lettuce)

goqiw 2025-01-23 17:07:41 技术教程 30 ℃ 0 评论

SpringBoot 2.0系列文章之集成redis 服务(Lettuce)

在 springboot 1.5.x版本的默认的Redis客户端是 Jedis实现的,springboot 2.x版本中默认客户端是用 lettuce实现的。

Lettuce的连接是基于Netty的,连接实例(StatefulRedisConnection)可以在多个线程间并发访问,应为StatefulRedisConnection是线程安全的,所以一个连接实例(StatefulRedisConnection)就可以满足多线程环境下的并发访问,当然这个也是可伸缩的设计,一个连接实例不够的情况也可以按需增加连接实例

Springboot 2.0 通过 lettuce集成Redis服务

导入依赖

 <dependencies>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter</artifactId>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-redis</artifactId>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-test</artifactId>
             <scope>test</scope>
         </dependency>
     </dependencies>

application.properties配置文件

 spring.redis.host=localhost
 spring.redis.port=6379
 spring.redis.password=root
 # 连接池最大连接数(使用负值表示没有限制) 默认为8
 spring.redis.lettuce.pool.max-active=8
 # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认为-1
 spring.redis.lettuce.pool.max-wait=-1ms
 # 连接池中的最大空闲连接 默认为8
 spring.redis.lettuce.pool.max-idle=8
 # 连接池中的最小空闲连接 默认为 0
 spring.redis.lettuce.pool.min-idle=0

自定义 RedisTemplate

默认情况下的模板只能支持 RedisTemplate<String,String>,只能存入字符串,很多时候,我们需要自定义 RedisTemplate ,设置序列化器,这样我们可以很方便的操作实例对象。如下所示:

 @Configuration
 public class RedisConfig {
     @Bean
     public RedisTemplate<String, Serializable> redisTemplate(LettuceConnectionFactory connectionFactory) {
         RedisTemplate<String, Serializable> redisTemplate = new RedisTemplate<>();
         redisTemplate.setKeySerializer(new StringRedisSerializer());
         redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
         redisTemplate.setConnectionFactory(connectionFactory);
         return redisTemplate;
     }
 }

定义测试实体类

 public class User implements Serializable {
     private static final long serialVersionUID = 4220515347228129741L;
     private Integer id;
     private String username;
     private Integer age;
 
     public User(Integer id, String username, Integer age) {
         this.id = id;
         this.username = username;
         this.age = age;
     }
 
     public User() {
     }
     //getter/setter 省略
 }

测试

 @RunWith(SpringRunner.class)
 @SpringBootTest
 public class RedisTest {
     private Logger logger = LoggerFactory.getLogger(RedisTest.class);
     @Autowired
     private RedisTemplate<String, Serializable> redisTemplate;
 
     @Test
     public void test() {
         String key = "user:1";
         redisTemplate.opsForValue().set(key, new User(1,"pjmike",20));
         User user = (User) redisTemplate.opsForValue().get(key);
         logger.info("uesr: "+user.toString());
     }
 }

这样就可以直接实践项目了,lettuce的优点:

Jedis在实现上是直接连接的redis server,如果在多线程环境下是非线程安全的,这个时候只有使用连接池,为每个Jedis实例增加物理连接

Lettuce的连接是基于Netty的,连接实例(StatefulRedisConnection)可以在多个线程间并发访问,应为StatefulRedisConnection是线程安全的,所以一个连接实例(StatefulRedisConnection)就可以满足多线程环境下的并发访问,当然这个也是可伸缩的设计,一个连接实例不够的情况也可以按需增加连接实例

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表