• Spring Boot 2.X(六):Spring Boot 集成 Redis


    Redis 简介

    什么是 Redis

    Redis 是目前使用的非常广泛的免费开源内存数据库,是一个高性能的 key-value 数据库。

    Redis 与其他 key-value 缓存(如 Memcached )相比有以下三个特点:

    1.Redis 支持数据的持久化,它可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
    2.Redis 不仅仅支持简单的 key-value 类型的数据,同时还提供 list,set,zset,hash 等数据结构的存储。
    3.Redis 支持数据的备份,即 master-slave 模式的数据备份。

    Redis 优势如下:

    1.性能极高。Redis 能读的速度是 110000 次/s,写的速度是 81000 次/s。
    2.丰富的数据类型。Redis 支持二进制案例的 Strings,Lists,Sets 及 Ordered Sets 数据类型操作。
    3.原子性。Redis 所有的操作都是原子性的,意思是要么成功执行要么失败完全不执行。单个操作是原子性的,多个操作也是,通过 MULTI 和 EXEC 指令抱起来。
    4.丰富的特性。Redis 还支持 publish/subscribe,通知,key 过期等特性。

    Spring Boot 集成 Redis

    1.在项目中添加依赖

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    	<modelVersion>4.0.0</modelVersion>
    	<parent>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-parent</artifactId>
    		<version>2.1.9.RELEASE</version>
    		<relativePath /> <!-- lookup parent from repository -->
    	</parent>
    	<groupId>cn.zwqh</groupId>
    	<artifactId>spring-boot-redis</artifactId>
    	<version>0.0.1-SNAPSHOT</version>
    	<name>spring-boot-redis</name>
    	<description>spring-boot-redis</description>
    
    	<properties>
    		<java.version>1.8</java.version>
    	</properties>
    
    	<dependencies>
    
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-web</artifactId>
    		</dependency>
    
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-test</artifactId>
    			<scope>test</scope>
    		</dependency>
    
    		<!-- Redis -->
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-data-redis</artifactId>
    		</dependency>
    	
    	</dependencies>
    
    	<build>
    		<plugins>
    			<plugin>
    				<groupId>org.springframework.boot</groupId>
    				<artifactId>spring-boot-maven-plugin</artifactId>
    			</plugin>
    		</plugins>
    	</build>
    
    </project>
    
    

    查看 jar 包时发现,Spring Data Redis 下 org.springframework.data.redis.connection 包路径下面默认有两个包 jedis 和 lettuce,这说明 Spring Boot 已经默认包装适配了这两个 Redis 客户端。

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

    Lettuce 与 Jedis 比较

    LettuceJedis 的都是连接 Redis Server的客户端。

    Jedis 在实现上是直连 redis server,多线程环境下非线程安全,除非使用连接池,为每个 redis实例增加物理连接。


    Lettuce 是 一种可伸缩,线程安全,完全非阻塞的Redis客户端,多个线程可以共享一个RedisConnection,它利用Netty NIO 框架来高效地管理多个连接,从而提供了异步和同步数据访问方式,用于构建非阻塞的反应性应用程序。


    下面我们分别使用 Lettuce 和 Jedis 来集成 Redis 服务

    2. Lettuce 集成 Redis 服务

    导入依赖

    由于 Spring Boot 2.X 默认集成了 Lettuce ,所以无需导入。

    application.properties配置文件

    ################ Redis 基础配置 ##############
    # Redis数据库索引(默认为0)
    spring.redis.database=0  
    # Redis服务器地址
    spring.redis.host=127.0.0.1
    # Redis服务器连接端口
    spring.redis.port=6379  
    # Redis服务器连接密码(默认为空)
    spring.redis.password=zwqh
    # 链接超时时间 单位 ms(毫秒)
    spring.redis.timeout=3000
    ################ Redis 线程池设置 ##############
    # 连接池最大连接数(使用负值表示没有限制) 默认 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
    
    

    自定义 RedisTemplate

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

    @Configuration
    public class LettuceRedisConfig {
    
    	@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 UserEntity implements Serializable {
    
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = 5237730257103305078L;
    	
    	private Long id;
    	private String userName;
    	private String userSex;
    	public Long getId() {
    		return id;
    	}
    	public void setId(Long id) {
    		this.id = id;
    	}
    	public String getUserName() {
    		return userName;
    	}
    	public void setUserName(String userName) {
    		this.userName = userName;
    	}
    	public String getUserSex() {
    		return userSex;
    	}
    	public void setUserSex(String userSex) {
    		this.userSex = userSex;
    	}
    	
    }
    

    单元测试

    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class SpringBootRedisApplicationTests {
    
    	@Autowired
    	private RedisTemplate<String, String> strRedisTemplate;
    	@Autowired
    	private RedisTemplate<String, Serializable> serializableRedisTemplate;
    	
    	@Test
    	public void testString() {
    		strRedisTemplate.opsForValue().set("strKey", "zwqh");
    		System.out.println(strRedisTemplate.opsForValue().get("strKey"));
    	}
    	
    	@Test
    	public void testSerializable() {
    		UserEntity user=new UserEntity();
    		user.setId(1L);
    		user.setUserName("朝雾轻寒");
    		user.setUserSex("男");		
    		serializableRedisTemplate.opsForValue().set("user", user);		
    		UserEntity user2 = (UserEntity) serializableRedisTemplate.opsForValue().get("user");
    		System.out.println("user:"+user2.getId()+","+user2.getUserName()+","+user2.getUserSex());
    	}
    
    }
    

    执行结果如下:

    得到我们预期的结果。

    3.Jedis 集成 Redis 服务

    pom 文件

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    	<modelVersion>4.0.0</modelVersion>
    	<parent>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-parent</artifactId>
    		<version>2.1.9.RELEASE</version>
    		<relativePath /> <!-- lookup parent from repository -->
    	</parent>
    	<groupId>cn.zwqh</groupId>
    	<artifactId>spring-boot-redis</artifactId>
    	<version>0.0.1-SNAPSHOT</version>
    	<name>spring-boot-redis</name>
    	<description>spring-boot-redis</description>
    
    	<properties>
    		<java.version>1.8</java.version>
    	</properties>
    
    	<dependencies>
    
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-web</artifactId>
    		</dependency>
    
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-test</artifactId>
    			<scope>test</scope>
    		</dependency>
    
    		<!-- Redis -->
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-data-redis</artifactId>
    			<exclusions>
    				<!-- 排除lettuce包 -->
    				<exclusion>
    					<groupId>io.lettuce</groupId>
    					<artifactId>lettuce-core</artifactId>
    				</exclusion>
    			</exclusions>
    		</dependency>
    		<!-- 添加jedis客户端 -->
    		<dependency>
    			<groupId>redis.clients</groupId>
    			<artifactId>jedis</artifactId>
    		</dependency>
    	
    	</dependencies>
    
    	<build>
    		<plugins>
    			<plugin>
    				<groupId>org.springframework.boot</groupId>
    				<artifactId>spring-boot-maven-plugin</artifactId>
    			</plugin>
    		</plugins>
    	</build>
    
    </project>
    
    

    application.properties配置文件

    ################ Redis 基础配置 ##############
    # Redis数据库索引(默认为0)
    spring.redis.database=0  
    # Redis服务器地址
    spring.redis.host=127.0.0.1
    # Redis服务器连接端口
    spring.redis.port=6379  
    # Redis服务器连接密码(默认为空)
    spring.redis.password=zwqh
    # 链接超时时间 单位 ms(毫秒)
    spring.redis.timeout=3000
    ################ Redis 线程池设置 ##############
    # 连接池最大连接数(使用负值表示没有限制) 默认 8
    spring.redis.jedis.pool.max-active=8
    # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
    spring.redis.jedis.pool.max-wait=-1
    # 连接池中的最大空闲连接 默认 8
    spring.redis.jedis.pool.max-idle=8
    # 连接池中的最小空闲连接 默认 0
    spring.redis.jedis.pool.min-idle=0
    

    JedisRedisConfig

    @Configuration
    public class JedisRedisConfig {
    
    	@Value("${spring.redis.database}")
    	private int database;
    	@Value("${spring.redis.host}")
    	private String host;
    	@Value("${spring.redis.port}")
    	private int port;
    	@Value("${spring.redis.password}")
    	private String password;
    	@Value("${spring.redis.timeout}")
    	private int timeout;
    	@Value("${spring.redis.jedis.pool.max-active}")
    	private int maxActive;
    	@Value("${spring.redis.jedis.pool.max-wait}")
    	private long maxWaitMillis;
    	@Value("${spring.redis.jedis.pool.max-idle}")
    	private int maxIdle;
    	@Value("${spring.redis.jedis.pool.min-idle}")
    	private int minIdle;
    
    	/**
    	 * 连接池配置信息
    	 */
    
    	@Bean
    	public JedisPoolConfig jedisPoolConfig() {
    		JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
    		// 最大连接数
    		jedisPoolConfig.setMaxTotal(maxActive);
    		// 当池内没有可用连接时,最大等待时间
    		jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
    		// 最大空闲连接数
    		jedisPoolConfig.setMinIdle(maxIdle);
    		// 最小空闲连接数
    		jedisPoolConfig.setMinIdle(minIdle);
    		// 其他属性可以自行添加
    		return jedisPoolConfig;
    	}
    
    	/**
    	 * Jedis 连接
    	 * 
    	 * @param jedisPoolConfig
    	 * @return
    	 */
    	@Bean
    	public JedisConnectionFactory jedisConnectionFactory(JedisPoolConfig jedisPoolConfig) {
    		JedisClientConfiguration jedisClientConfiguration = JedisClientConfiguration.builder().usePooling()
    				.poolConfig(jedisPoolConfig).and().readTimeout(Duration.ofMillis(timeout)).build();
    		RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
    		redisStandaloneConfiguration.setHostName(host);
    		redisStandaloneConfiguration.setPort(port);
    		redisStandaloneConfiguration.setPassword(RedisPassword.of(password));
    		return new JedisConnectionFactory(redisStandaloneConfiguration, jedisClientConfiguration);
    	}
    
    	/**
    	 * 缓存管理器
    	 * 
    	 * @param connectionFactory
    	 * @return
    	 */
    	@Bean
    	public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
    		return RedisCacheManager.create(connectionFactory);
    	}
    
    	@Bean
    	public RedisTemplate<String, Serializable> redisTemplate(JedisConnectionFactory connectionFactory) {
    		RedisTemplate<String, Serializable> redisTemplate = new RedisTemplate<>();
    		redisTemplate.setKeySerializer(new StringRedisSerializer());
    		redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
    		redisTemplate.setConnectionFactory(jedisConnectionFactory(jedisPoolConfig()));
    		return redisTemplate;
    	}
    
    }
    

    单元测试同上

    出现预期结果。

    总结

    上面介绍了 Spring Boot 2.X 如何通过 Lettuce 和 Jedis 来集成 Redis 服务,按项目需求,我们也可以自定义操作类来实现数据操作。

    示例代码

    github

    码云

    非特殊说明,本文版权归 朝雾轻寒 所有,转载请注明出处.

    原文标题:Spring Boot 2.X(六):Spring Boot 集成Redis

    原文地址: https://www.zwqh.top/article/info/11

    如果文章对您有帮助,请扫码关注下我的公众号,文章持续更新中...

  • 相关阅读:
    Node 命令行工具 commander.js 快速上手
    使用 express 极简处理前端路由的 history 模式问题
    在博客中插入希沃白板课件
    休息一下(屏幕提醒)
    vue htmlWebpackPlugin.options.title 标题设置
    使用 docker 部署 elasticsearch 并安装 ik 中文分词器
    .NET 中的计时 tick 是多长?
    剑指offer队列的最大值(主队列+辅助队列)
    Golang垃圾回收原理解析
    Golangchannel底层实现精要
  • 原文地址:https://www.cnblogs.com/zwqh/p/11664782.html
Copyright © 2020-2023  润新知