Spring boot開発web api応用実践(五)集積Redisクライアント
詳細
本編では主にspring boot開発においてredis操作を統合する方法を記録する.spring bootの慣例に従って、redis starterモジュールを開発し、spring boot starterモジュールの開発方法を記録します.
Java ideでmavenプロジェクトを新規作成し、spring boot starterが約束したルールに従ってecode-redis-spring-boot-starterと命名し、依存を導入します.
完全なpom.xmlはソースファイルを参照します.工事構造は下図の通り:
このredis-starterモジュールの主なjavaファイルは3つしかありません.
(1)redis接続プール構成クラス:RedisProperties.java
redis接続プールの構成項目は主にあります(次の構成項目は主にアプリケーション.propertiesに構成されています).
対応するjava構成クラスはRedisPropertiesである.JAva、コードクリップ:
@ConfigurationProperties注記このクラスがspring bootの属性構成クラスであることを指定し、prefix属性は構成項目の接頭辞を指定します.
(2)redis接続プール自動初期化クラス:RedisAutoConfiguration.java
(3)redisコマンド操作クラス:RedisClient.java
次に、手順(2)のredis接続プール自動初期化クラス(RedisAutoConfiguration.java)にRedisClientの初期化方法を追加します.
コードが完了すると、プロジェクトを実行するときにredis接続プールの自動初期化クラス(RedisAutoConfiguration.java)が有効になります.つまり、redisのauto configureを実際に行うにはspringが必要です.factoriesファイルに登録する.JAva、このファイルはresources/META-INFパスの下にあります.登録内容は次のとおりです.
多くの道友が初めて自分のspring boot starterモジュールを作成したとき、構成クラスにauto configureがないことに気づいた.springを忘れたからだ.factoriesファイルに独自のAutoConfigurationクラスを登録します.
(4)アプリケーションでredisクライアントを使用するには、アプリケーションのpomのみが必要である.xmlにecode-redis-spring-boot-starterモジュールの依存を導入し、redisを使用する必要があるクラスにRedisClientのインスタンスを注入します.
次にredisClientを呼び出してredisコマンドを操作します.
完全なエンジニアリングソースリファレンスgithub
本編では主にspring boot開発においてredis操作を統合する方法を記録する.spring bootの慣例に従って、redis starterモジュールを開発し、spring boot starterモジュールの開発方法を記録します.
Java ideでmavenプロジェクトを新規作成し、spring boot starterが約束したルールに従ってecode-redis-spring-boot-starterと命名し、依存を導入します.
org.springframework.boot
spring-boot-autoconfigure
org.springframework.boot
spring-boot-configuration-processor
true
redis.clients
jedis
org.slf4j
slf4j-api
org.springframework.boot
spring-boot-dependencies
${spring-boot.version}
pom
import
完全なpom.xmlはソースファイルを参照します.工事構造は下図の通り:
このredis-starterモジュールの主なjavaファイルは3つしかありません.
(1)redis接続プール構成クラス:RedisProperties.java
redis接続プールの構成項目は主にあります(次の構成項目は主にアプリケーション.propertiesに構成されています).
ecode.redis.host=redis ( 192.168.1.110)
ecode.redis.port=redis ( 6379)
ecode.redis.timeout=3000
ecode.redis.password=redis_password
ecode.redis.max-active=50
ecode.redis.max-idle=5
ecode.redis.min-idle=0
ecode.redis.max-waitMillis=5000
ecode.redis.test-on-borrow=false
ecode.redis.test-on-return=false
ecode.redis.dbidx=0
対応するjava構成クラスはRedisPropertiesである.JAva、コードクリップ:
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix = "ecode.redis")
public class RedisProperties {
private String host;
private int port = 6379;
private int timeout = 3000;
private String password;
private int maxActive = 10;
private int maxIdle = 5;
private int minIdle = 0;
private long maxWaitMillis = 5000;
private boolean testOnBorrow = false;
private boolean testOnReturn = false;
private int dbidx;
// set、get
}
@ConfigurationProperties注記このクラスがspring bootの属性構成クラスであることを指定し、prefix属性は構成項目の接頭辞を指定します.
(2)redis接続プール自動初期化クラス:RedisAutoConfiguration.java
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.Assert;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
@Configuration
@EnableConfigurationProperties(RedisProperties.class)
@ConditionalOnClass({ JedisPoolConfig.class, JedisPool.class, Jedis.class })
public class RedisAutoConfiguration {
@Autowired
private RedisProperties properties;
private JedisPool jedisPool;
@PostConstruct
public void initJedisPool() {
System.out.print("------ JedisPool.....host=" + properties.getHost());
boolean hostExist = properties.getHost() != null && properties.getHost().trim().length() > 0;
Assert.isTrue(hostExist, "Redis , [ecode.redis.host]");
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(properties.getMaxActive());
config.setMaxIdle(properties.getMaxIdle());
config.setMinIdle(properties.getMinIdle());
config.setMaxWaitMillis(properties.getMaxWaitMillis());
config.setTestOnBorrow(properties.isTestOnBorrow());
config.setTestOnReturn(properties.isTestOnReturn());
if (properties.getPassword() == null || properties.getPassword().trim().length() <= 0){
jedisPool = new JedisPool(config, properties.getHost(), properties.getPort(),
properties.getTimeout(), null, properties.getDbidx());
}else{
jedisPool = new JedisPool(config, properties.getHost(), properties.getPort(), properties.getTimeout(),
properties.getPassword(), properties.getDbidx());
}
System.out.println(".....ok!");
}
//........ redis spring
}
(3)redisコマンド操作クラス:RedisClient.java
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPubSub;
import redis.clients.jedis.Pipeline;
import redis.clients.jedis.Response;
public class RedisClient {
private JedisPool pool;
public void setPool(JedisPool pool){ this.pool = pool; }
public RedisClient(){}
public RedisClient(JedisPool pool){ this.pool = pool;}
public Jedis getJedis() { return pool.getResource(); }
public void release(Jedis jedis) { if (jedis != null) jedis.close(); }
public Set getAllKeys(String pattern){
Jedis jedis = null;
try {
jedis = getJedis();
return jedis.keys(pattern);
} catch (Exception e) {
String err = " Redis ("+pattern+") KEY ";
//LOG.error(err, e);
throw new RuntimeException(err, e);
}finally{
release(jedis);
}
}
/**
* key 。
* : key , -2 。 key , -1 。 , , key 。
* Redis 2.8 , key , key , -1
* @param key
* @return
*
*/
public Long ttl(String key) {
Jedis jedis = null;
try {
jedis = getJedis();
return jedis.ttl(key);
} catch (Exception e) {
String err = " Redis key="+key+" ";
//LOG.error(err, e);
throw new RuntimeException(err, e);
}finally{
release(jedis);
}
}
public void set(String key, String value) {
if (value == null){
return;
}
Jedis jedis = null;
try {
jedis = getJedis();
jedis.set(key, value);
} catch (Exception e) {
//LOG.error(" Redis set[key={}, value={}] ", key, value, e);
throw new RuntimeException(" Redis key="+key+" ", e);
}finally{
release(jedis);
}
}
//.... redis
}
次に、手順(2)のredis接続プール自動初期化クラス(RedisAutoConfiguration.java)にRedisClientの初期化方法を追加します.
@Bean
@ConditionalOnMissingBean
public RedisClient redisClient(){
Assert.isTrue(jedisPool != null, "JedisPool , RedisClient");
return new RedisClient(jedisPool);
}
コードが完了すると、プロジェクトを実行するときにredis接続プールの自動初期化クラス(RedisAutoConfiguration.java)が有効になります.つまり、redisのauto configureを実際に行うにはspringが必要です.factoriesファイルに登録する.JAva、このファイルはresources/META-INFパスの下にあります.登録内容は次のとおりです.
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.jsecode.springboot.redis.RedisAutoConfiguration
多くの道友が初めて自分のspring boot starterモジュールを作成したとき、構成クラスにauto configureがないことに気づいた.springを忘れたからだ.factoriesファイルに独自のAutoConfigurationクラスを登録します.
(4)アプリケーションでredisクライアントを使用するには、アプリケーションのpomのみが必要である.xmlにecode-redis-spring-boot-starterモジュールの依存を導入し、redisを使用する必要があるクラスにRedisClientのインスタンスを注入します.
@Autowired
RedisClient redisClient;
次にredisClientを呼び出してredisコマンドを操作します.
完全なエンジニアリングソースリファレンスgithub