Springbootはlettuceを統合しコードを最適化する
55495 ワード
最適化前
pom依存性の追加
ymlファイルの変更
エンティティークラスの追加
構成クラスの作成(データがredisに保存されているときにシーケンス化するには、デフォルトでJDKを使用してデータシーケンス化)
インタフェースの作成
実装インタフェース
テストコード
コードの問題
pom依存性の追加
<!-- lettuce -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- redis commons-pool-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
ymlファイルの変更
server:
port: 8080
spring:
redis:
port: 6379
# password:
host: 192.168.214.128
lettuce:
pool:
max-active: 8 # ( )
max-idle: 6 #
min-idle: 2 #
max-wait: 1000 # ( )
shutdown-timeout: 100 #
エンティティークラスの追加
package com.yang.pojo;
import java.io.Serializable;
/**
* Description:
* date: 2020/7/4 21:09
*
* @author Crille-g
* @version 1.0
*/
public class User implements Serializable {
private String name;
private String id;
private Integer age;
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", id='" + id + '\'' +
", age=" + age +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
構成クラスの作成(データがredisに保存されているときにシーケンス化するには、デフォルトでJDKを使用してデータシーケンス化)
package com.yang.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
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.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
/**
* Description:
* date: 2020/7/4 21:55
*
* @author Crille-g
* @version 1.0
*/
@Configuration
public class RedisConfig {
/**
* Spring data RedisTemplate
* redis , \ ;
* spring redis Jedis ;
*
*/
@Bean
public RedisTemplate<String,Object> redisTemplate(LettuceConnectionFactory factory){
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// @Bean RedisTemplate , hashkey hashvalue 。
//key String
template.setKeySerializer(stringRedisSerializer);
//value JACKSON
template.setValueSerializer(jackson2JsonRedisSerializer);
//hash key String
template.setHashKeySerializer(stringRedisSerializer);
//hash value JACKSON
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
インタフェースの作成
package com.yang.service;
import com.yang.pojo.User;
/**
* Description:
* date: 2020/7/4 22:28
*
* @author Crille-g
* @version 1.0
*/
public interface UserService {
public String getString(String key);
public User selectById(String id);
public void expireStr(String key,String value);
}
実装インタフェース
package com.yang.service.impl;
import com.yang.pojo.User;
import com.yang.service.UserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.concurrent.TimeUnit;
/**
* Description:
* date: 2020/7/4 22:29
*
* @author Crille-g
* @version 1.0
*/
@Service
public class UserServiceImpl implements UserService {
@Autowired
private RedisTemplate<String,Object> redisTemplate;
private Logger log=LoggerFactory.getLogger(UserServiceImpl.class);
/**
* String
*/
@Override
public String getString(String key) {
// System.out.println(redisTemplate);
// log.info("redistemplate ");
if (redisTemplate.hasKey(key)){// key
log.info("redis ");
return (String) redisTemplate.opsForValue().get(key);
}else{
String val="lettuce";
log.info("mysql ");
redisTemplate.opsForValue().set(key,val);
log.info(" redis ");
return val;
}
}
/**
* String
* , key
*/
public void expireStr(String key,String value){
redisTemplate.opsForValue().set(key,value);
redisTemplate.expire(key,1, TimeUnit.HOURS);
}
/**
* hash
* @param id
* @return
*/
@Override
public User selectById(String id) {
// redisTemplate.hasKey(key) key ;
// user:id user:1 user:2
if (redisTemplate.opsForHash().hasKey("user",id)){
log.info("redis ");
return (User)redisTemplate.opsForHash().get("user", id);
}else{
log.info(" mysql");
User user=new User();
user.setAge(20);
user.setName(" ");
user.setId(id);
/*
@param h
@param hk id
@param h
*/
redisTemplate.opsForHash().put("user",id,user);
return user;
}
}
}
テストコード
package com.yang;
import com.yang.pojo.User;
import com.yang.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import javax.xml.ws.soap.Addressing;
@SpringBootTest
class BootLettuceApplicationTests {
@Autowired
private UserService userService;
@Test
void contextLoads() {
userService.getString("aaaa");
}
@Test
void t1() {
System.out.println(userService.getString("redisTemplate")
);
}
@Test
void t2(){
userService.expireStr("test"," ");
System.out.println(" ");
}
@Test
void t3(){
User user=userService.selectById("1000");
System.out.println(" "+user);
}
}
コードの問題
1: 。//
// : ,
public interface KeyNameUtil {
public static final String USER="user";
}
public User selectById(String id) {
// redisTemplate.hasKey(key) key ;
// user:id user:1 user:2
if (redisTemplate.opsForHash().hasKey(KeyNameUtil.USER,id)){
log.info("redis ");
return (User)redisTemplate.opsForHash().get(KeyNameUtil.USER, id);
}else{
log.info(" mysql");
User user=new User();
user.setAge(20);
user.setName(" ");
user.setId(id);
/*
@param h
@param hk id
@param h
*/
redisTemplate.opsForHash().put(KeyNameUtil.USER,id,user);
return user;
}
}
// : ,
public class User implements Serializable {
private String name;
private String id;
private Integer age;
public static String getKeyName(){
return "user";
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", id='" + id + '\'' +
", age=" + age +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
public User selectById(String id) {
// redisTemplate.hasKey(key) key ;
// user:id user:1 user:2
if (redisTemplate.opsForHash().hasKey(User.getKeyName(),id)){
log.info("redis ");
return (User)redisTemplate.opsForHash().get(User.getKeyName(), id);
}else{
log.info(" mysql");
User user=new User();
user.setAge(20);
user.setName(" ");
user.setId(id);
/*
@param h
@param hk id
@param h
*/
redisTemplate.opsForHash().put(User.getKeyName(),id,user);
return user;
}
}
2:
3:RedisTemplate.opsFor**()
// :
@Resource(name = "redisTemplate")
private ValueOperations<String,String> string ;// RedisTemplate.opsForValue();
@Resource(name = "redisTemplate")
private HashOperations<String,String,User> hash;//k:user; hk:id; hv:Object
//return (String) redisTemplate.opsForValue().get(key);
return string.get(key);
// redisTemplate.opsForValue().set(key,val);
string.set(key,val);
-----------------------------------
//return (User)redisTemplate.opsForHash().get(User.getKeyName(), id);
return hash.get(User.getKeyName(),id);
// redisTemplate.opsForHash().put(User.getKeyName(),id,user);
hash.put(User.getKeyName(),id,user);