一、环境
- Idea 2020.1
- JDK 1.8
- maven
二、目的
spring boot 通过lettuce整合redis
三、步骤
3.1、点击File -> New Project -> Spring Initializer,点击next
3.2、在对应地方修改自己的项目信息
3.3、选择Web依赖,选中Spring Web、Spring Boot Redis。可以选择Spring Boot版本,本次默认为2.2.7,点击Next
3.4、项目结构
四、添加文件
pom.xml文件
<?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.2.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>org.ouyushan</groupId>
<artifactId>spring-boot-data-redis-jedis</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-boot-data-redis-jedis</name>
<description>Jedis project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.3.0</version>
</dependency>
<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>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</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=
# 连接超时时间(毫秒)
spring.redis.timeout=3000
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.lettuce.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.lettuce.pool.max-wait=-1
# 连接池中的最大空闲连接
spring.redis.lettuce.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.lettuce.pool.min-idle=0
LettuceRedisConfig.java
package org.ouyushan.springboot.data.redis.lettuce.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import javax.annotation.Resource;
import java.util.Set;
/**
* @Description:
* @Author: ouyushan
* @Email: ouyushan@hotmail.com
* @Date: 2020/5/11 9:55
*/
@Configuration
@EnableCaching
public class LettuceRedisConfig {
@Resource
private LettuceConnectionFactory lettuceConnectionFactory;
// 缓存管理器
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory lettuceConnectionFactory) {
RedisCacheManager redisCacheManager = RedisCacheManager.builder(lettuceConnectionFactory).build();
return redisCacheManager;
}
@Bean
public RedisTemplate<Object, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(lettuceConnectionFactory);
// key序列化
redisTemplate.setKeySerializer(new StringRedisSerializer());
// 使用Jackson ,将对象序列化为JSON
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
//json 转对象类,不设置默认的会将json转成hashmap 报错:java.util.LinkedHashMap cannot be cast to XX
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
package org.ouyushan.springboot.data.redis.jedis.entity;
import java.io.Serializable;
/**
* @Description:
* @Author: ouyushan
* @Email: ouyushan@hotmail.com
* @Date: 2020/5/9 14:03
*/
public class UserInfo implements Serializable {
private static final long serialVersionUID = -6264728881593912971L;
private Long id;
private String userName;
private String password;
private int age;
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 getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "UserInfo{" +
"id=" + id +
", userName='" + userName + '\'' +
", password='" + password + '\'' +
", age=" + age +
'}';
}
}
五、测试
运行以下测试用例验证String、Object、List以及Map在redis中的使用
SpringBootDataRedisJedisApplicationTests .java
package org.ouyushan.springboot.data.redis.lettuce;
import org.junit.jupiter.api.Test;
import org.ouyushan.springboot.data.redis.lettuce.entity.UserInfo;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest
class SpringBootDataRedisLettuceApplicationTests {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Autowired
private RedisTemplate redisTemplate;
@Test
public void testStringRedisTemplateForObject() {
stringRedisTemplate.opsForValue().set("keyString", "valueString");
String value = stringRedisTemplate.opsForValue().get("keyString");
System.out.println(value);
assertThat(value).isEqualTo("valueString");
}
@Test
public void testRedisTemplateForObject() {
UserInfo userInfo = new UserInfo();
userInfo.setAge(24);
userInfo.setId(1L);
userInfo.setUserName("username");
userInfo.setPassword("password");
redisTemplate.opsForValue().set("object", userInfo);
UserInfo userInfoFromRedis = (UserInfo) redisTemplate.opsForValue().get("object");
System.out.println(userInfoFromRedis);
}
@Test
public void testRedisTemplateForList() {
UserInfo userInfo1 = new UserInfo();
userInfo1.setAge(11);
userInfo1.setId(1L);
userInfo1.setUserName("username");
userInfo1.setPassword("password");
UserInfo userInfo2 = new UserInfo();
userInfo2.setAge(21);
userInfo2.setId(2L);
userInfo2.setUserName("username");
userInfo2.setPassword("password");
List<UserInfo> list = new ArrayList<>();
list.add(userInfo1);
list.add(userInfo2);
redisTemplate.opsForValue().set("list", list);
List<UserInfo> userInfoFromRedis = (List) redisTemplate.opsForValue().get("list");
System.out.println(userInfoFromRedis);
}
@Test
public void testRedisTemplateForMap() {
UserInfo userInfo1 = new UserInfo();
userInfo1.setAge(11);
userInfo1.setId(1L);
userInfo1.setUserName("username");
userInfo1.setPassword("password");
UserInfo userInfo2 = new UserInfo();
userInfo2.setAge(22);
userInfo2.setId(2L);
userInfo2.setUserName("username");
userInfo2.setPassword("password");
Map<String, UserInfo> map = new HashMap<>();
map.put("userInfo1", userInfo1);
map.put("userInfo2", userInfo2);
redisTemplate.opsForValue().set("map", map);
Map<String, UserInfo> userInfoFromRedis = (Map<String, UserInfo>) redisTemplate.opsForValue().get("map");
System.out.println(userInfoFromRedis);
}
}
来源:oschina
链接:https://my.oschina.net/ouyushan/blog/4303931