SpringBoot 2.X整合Redis(Lettuce)
阿新 • • 發佈:2019-01-26
請先安裝叢集或者單臺。
參考:https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-redis;
https://blog.csdn.net/qq_24076549/article/details/79536447
application.yml配置
spring: redis: database: 1 password: guest cluster: max-redirects: 3 nodes: - 192.168.131.139:6379 - 192.168.131.140:6379 - 192.168.131.141:6379 - 192.168.131.142:6379 - 192.168.131.143:6379 - 192.168.131.144:6379 lettuce: pool: max-active: 100 # 連線池最大連線數(使用負值表示沒有限制) max-idle: 100 # 連線池中的最大空閒連線 min-idle: 50 # 連線池中的最小空閒連線 max-wait: 6000 # 連線池最大阻塞等待時間(使用負值表示沒有限制) timeout: 1000
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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>favorites</groupId> <artifactId>redis</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>redis</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.2.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- Json --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-yaml</artifactId> </dependency> <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</artifactId> <version>2.4</version> <classifier>jdk15</classifier> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
RedisConfig配置
package com.redis.config; import java.lang.reflect.Method; import java.util.HashSet; import java.util.Set; import javax.annotation.Resource; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.interceptor.KeyGenerator; 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.lettuce.LettuceConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper.DefaultTyping; @Configuration @EnableCaching // 開啟快取支援 public class RedisConfig extends CachingConfigurerSupport { @Resource private LettuceConnectionFactory lettuceConnectionFactory; @Bean public KeyGenerator keyGenerator() { return new KeyGenerator() { @Override public Object generate(Object target, Method method, Object... params) { StringBuffer sb = new StringBuffer(); sb.append(target.getClass().getName()); sb.append(method.getName()); for (Object obj : params) { sb.append(obj.toString()); } return sb.toString(); } }; } // 快取管理器 @Bean public CacheManager cacheManager() { RedisCacheManager.RedisCacheManagerBuilder builder = RedisCacheManager.RedisCacheManagerBuilder .fromConnectionFactory(lettuceConnectionFactory); @SuppressWarnings("serial") Set<String> cacheNames = new HashSet<String>() { { add("codeNameCache"); } }; builder.initialCacheNames(cacheNames); return builder.build(); } /** * RedisTemplate配置 */ @Bean public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) { // 設定序列化 Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>( Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, Visibility.ANY); om.enableDefaultTyping(DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); // 配置redisTemplate RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>(); redisTemplate.setConnectionFactory(lettuceConnectionFactory); RedisSerializer<?> stringSerializer = new StringRedisSerializer(); redisTemplate.setKeySerializer(stringSerializer);// key序列化 redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);// value序列化 redisTemplate.setHashKeySerializer(stringSerializer);// Hash key序列化 redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);// Hash value序列化 redisTemplate.afterPropertiesSet(); return redisTemplate; } }
model:User
package com.redis.model;
import java.io.Serializable;
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String id;
private String name;
private int age;
public User() {
super();
}
public User(String id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
UserService
package com.redis.service;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import com.redis.model.User;
public interface UserService {
@Cacheable(key="'user_'+#id",value="'user'+#id")
User getUser(String id);
@CacheEvict(key="'user_'+#id", value="users", condition="#id!=1")
void deleteUser(String id);
}
UserServiceImpl
package com.redis.service.impl;
import org.springframework.stereotype.Service;
import com.redis.model.User;
import com.redis.service.UserService;
@Service
public class UserServiceImpl implements UserService {
@Override
public User getUser(String id) {
System.out.println(id+"進入實現類獲取資料!");
User user = new User();
user.setId(id);
user.setName("香菇,難受");
user.setAge(18);
return user;
}
@Override
public void deleteUser(String id) {
System.out.println(id+"進入實現類刪除資料!");
}
}
RedisApplicationTests
package com.redis;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import com.redis.model.User;
import com.redis.service.UserService;
@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisApplicationTests {
@Autowired
private StringRedisTemplate template;
@Autowired
private UserService userService;
@Test
public void get() {
//template.opsForValue().set("test", "我是地瓜");
System.out.println(template.opsForValue().get("test"));
}
@Test
public void contextLoads() {
User user = new User();
user.setId("1");
user.setAge(12);
user.setName("張三");
template.opsForValue().append("date", user.toString());
System.out.println(template.opsForValue().get("date"));
}
@Test
public void getUser() {
for (int i = 0; i < 10; i++) {
User user = userService.getUser(String.valueOf(i));
System.out.println(user);
}
}
}
我的目錄結構:
由於這篇是之前寫的,後面我又進行了更新,可以參考我的GitHubdemo