1. 首页
  2. 一起来学springboot2.x

一起来学 SpringBoot 2.x | 第九篇整合Lettuce Redis

作者:唐亚峰 出自: https://blog.battcn.com/


Spring Boot 除了支持常见的ORM框架外,更是对常用的中间件提供了非常好封装,随着 Spring Boot2.x的到来,支持的组件越来越丰富,也越来越成熟,其中对 Redis的支持不仅仅是丰富了它的API,更是替换掉底层 Jedis的依赖,取而代之换成了 Lettuce(生菜)

Redis介绍

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。相比 Memcached它支持存储的类型相对更多 字符哈希集合有序集合列表GEO同时Redis是线程安全的。2010年3月15日起,Redis的开发工作由VMware主持,2013年5月开始,Redis的开发由 Pivotal赞助。

Lettuce

LettuceJedis 的都是连接 Redis Server的客户端程序。 Jedis实现上是直连redis server,多线程环境下非线程安全,除非使用连接池,为每个Jedis实例增加物理连接Lettuce基于Netty的连接实例(StatefulRedisConnection), 可以在多个线程间并发访问,且线程安全,满足多线程环境下的并发访问,同时它是可伸缩的设计,一个连接实例不够的情况也可以按需增加连接实例

导入依赖

pom.xmlspring-boot-starter-data-redis的依赖, Spring Boot2.x 后底层不在是 Jedis如果做版本升级的朋友需要注意下

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

属性配置

application.properties 文件中配置如下内容,由于 Spring Boot2.x 的改动,连接池相关配置需要通过 spring.redis.lettuce.pool或者 spring.redis.jedis.pool 进行配置了

  spring.redis.host=localhost
    spring.redis.password=battcn
    # 连接超时时间(毫秒)
    spring.redis.timeout=10000
    # Redis默认情况下有16个分片,这里配置具体使用的分片,默认是0
    spring.redis.database=0
    # 连接池最大连接数(使用负值表示没有限制) 默认 8
    spring.redis.lettuce.pool.max-active=8
    # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
    spring.redis.lettuce.pool.max-wait=-1
    # 连接池中的最大空闲连接 默认 8
    spring.redis.lettuce.pool.max-idle=8
    # 连接池中的最小空闲连接 默认 0
    spring.redis.lettuce.pool.min-idle=0

具体编码

Spring BootRedis的支持已经非常完善了,良好的序列化以及丰富的API足够应对日常开发

实体类

创建一个 User

  package com.battcn.entity;

    import java.io.Serializable;

    /**
     * @author Levin
     * @since 2018/5/10 0007
     */
    public class User implements Serializable {

     private static final long serialVersionUID = 8655851615465363473L;
     private Long id;
     private String username;
     private String password;
     // TODO  省略get set
    }

自定义Template

默认情况下的模板只能支持 RedisTemplate&lt;String, String>,也就是只能存入字符串,这在开发中是不友好的,所以自定义模板是很有必要的,当自定义了模板又想使用 String存储这时候就可以使用 StringRedisTemplate的方式,它们并不冲突…

  package com.battcn.config;

    import org.springframework.boot.autoconfigure.AutoConfigureAfter;
    import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
    import org.springframework.data.redis.serializer.StringRedisSerializer;

    import java.io.Serializable;

    /**
     * TODO 修改database
     *
     * @author Levin
     * @since 2018/5/10 0022
     */
    @Configuration
    @AutoConfigureAfter(RedisAutoConfiguration.class)
    public class RedisCacheAutoConfiguration {

     @Bean
     public RedisTemplate<String, Serializable> redisCacheTemplate(LettuceConnectionFactory redisConnectionFactory) {
     RedisTemplate<String, Serializable> template = new RedisTemplate<>();
     template.setKeySerializer(new StringRedisSerializer());
     template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
     template.setConnectionFactory(redisConnectionFactory);
     return template;
     }
    }

测试

完成准备事项后,编写一个 junit测试类来检验代码的正确性,有很多人质疑过 Redis线程安全性,故下面也提供了响应的测试案例,如有疑问欢迎指正

  package com.battcn;

    import com.battcn.entity.User;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.test.context.junit4.SpringRunner;

    import java.io.Serializable;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.stream.IntStream;

    /**
     * @author Levin
     * @since 2018/5/10 0010
     */
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class Chapter8ApplicationTest {

     private static final Logger log = LoggerFactory.getLogger(Chapter8ApplicationTest.class);

     @Autowired
     private StringRedisTemplate stringRedisTemplate;

     @Autowired
     private RedisTemplate<String, Serializable> redisCacheTemplate;

     @Test
     public void get() {
     // TODO 测试线程安全
     ExecutorService executorService = Executors.newFixedThreadPool(1000);
     IntStream.range(0, 1000).forEach(i ->
     executorService.execute(() -> stringRedisTemplate.opsForValue().increment("kk", 1))
     );
     stringRedisTemplate.opsForValue().set("k1", "v1");
     final String k1 = stringRedisTemplate.opsForValue().get("k1");
     log.info("[字符缓存结果] - [{}]", k1);
     // TODO 以下只演示整合,具体Redis命令可以参考官方文档,Spring Data Redis 只是改了个名字而已,Redis支持的命令它都支持
     String key = "battcn:user:1";
     redisCacheTemplate.opsForValue().set(key, new User(1L, "u1", "pa"));
     // TODO 对应 String(字符串)
     final User user = (User) redisCacheTemplate.opsForValue().get(key);
     log.info("[对象缓存结果] - [{}]", user);
     }
    }

其它类型

下列的就是 Redis其它类型所对应的操作方式

  • opsForValue: 对应 String(字符串)
  • opsForZSet: 对应 ZSet(有序集合)
  • opsForHash: 对应 Hash(哈希)
  • opsForList: 对应 List(列表)
  • opsForSet: 对应 Set(集合)
  • opsForGeo: 对应 GEO(地理位置)

总结

spring-data-redis文档: https://docs.spring.io/spring-data/redis/docs/2.0.1.RELEASE/reference/html/#new-in-2.0.0 Redis 文档: https://redis.io/documentation Redis 中文文档: http://www.redis.cn/commands.html 目前很多大佬都写过关于 SpringBoot 的教程了,如有雷同,请多多包涵,本教程基于最新的 spring-boot-starter-parent:2.0.1.RELEASE编写,包括新版本的特性都会一起介绍…

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「方志朋」,公众号后台回复「666」 免费领取我精心整理的进阶资源教程
  4. JS中文网,Javascriptc中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,是给开发者用的 Hacker News,技术文章由为你筛选出最优质的干货,其中包括:Android、iOS、前端、后端等方面的内容。目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。

    本文著作权归作者所有,如若转载,请注明出处

    转载请注明:文章转载自「 Java极客技术学习 」https://www.javajike.com

    标题:一起来学 SpringBoot 2.x | 第九篇整合Lettuce Redis

    链接:https://www.javajike.com/article/3372.html

« 一起来学 SpringBoot 2.x | 第十篇使用Spring Cache集成Redis
一起来学 SpringBoot 2.x | 第八篇通用Mapper与分页插件的集成»

相关推荐

QR code