SpringBoot已经实现了很多实用的缓存组件;但是由于工作中习惯了试用JedisUtils工具类来进行缓存操作, 这里记录一下SpringBoot中对于JedisUtils的封装

操作

新建一个SpringBoot项目

修改pom.xml增加:


<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>

新建JedisConfiguration.java用于配置JedisPool Bean

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

@Configuration
@EnableCaching
public class JedisConfiguration {

@Value("${spring.redis.host}")
private String host;

@Value("${spring.redis.port}")
private int port;

@Value("${spring.redis.timeout}")
private String timeouts;

@Value("${spring.redis.jedis.pool.min-idle}")
private int maxIdle;

@Value("${spring.redis.jedis.pool.max-wait}")
private String maxWaitMilliss;

@Value("${spring.redis.password}")
private String password;

@Bean(name = "jedisPool")
public JedisPool redisPoolFactory() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxIdle(maxIdle);
long maxWaitMillis = Long.parseLong(maxWaitMilliss.replace("ms", ""));
jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
int timeout = Integer.parseInt(timeouts.replace("ms", ""));
return new JedisPool(jedisPoolConfig, host, port, timeout);
}

}

创建JedisUtils.java

import org.apache.log4j.Logger;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import java.util.List;
import java.util.Set;

public class JedisUtils implements ApplicationContextAware {

private static ApplicationContext applicationContext = null;

private static JedisPool jedisPool = null;

private static volatile Jedis jedis = null;

private static Logger logger = Logger.getLogger("JedisUtils");

public JedisUtils() {
}

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if (JedisUtils.applicationContext == null) {
//初始化 spring applicationContext
JedisUtils.applicationContext = applicationContext;
}
}

public static Jedis getJedis() {
if (jedis == null) {
synchronized (Jedis.class) {
if (jedis == null) {
jedis = getJedisPool().getResource();
}
}
}
return jedis;
}

public static JedisPool getJedisPool() {
if (jedisPool == null) {
synchronized (JedisPool.class) {
if (jedisPool == null) {
jedisPool = applicationContext.getBean("jedisPool", JedisPool.class);
}
}
}
return jedisPool;
}

/**
* 根据key查看是否存在
*
* @param key
* @return
*/
public static boolean hasKey(String key) {
return getJedis().exists(key);
}

/**
* 设置key -value 形式数据
*
* @param key
* @param value
* @return
*/
public static boolean set(String key, String value) {
boolean result = false;
Jedis jedis = null;
try {
jedis = getJedis();
result = "OK".equals(jedis.set(key, value));
} catch (Exception e) {
closeBrokenJedis(jedis);
logger.error("JedisCache.set falid", e);
}
return result;
}

/**
* 设置 一个过期时间
*
* @param key key
* @param value value
* @param timeOut 单位秒
* @return
*/
public static boolean set(String key, String value, int timeOut) {
boolean result = false;
Jedis jedis = null;
try {
jedis = getJedis();
result = "OK".equals(jedis.setex(key, timeOut, value));
} catch (Exception e) {
closeBrokenJedis(jedis);
logger.error("JedisCache.set falid", e);
}
return result;
}

/**
* 根据key获取value
*
* @param key
* @return
*/
public static String get(String key) {
String result = null;
Jedis jedis = null;
try {
jedis = getJedis();
result = jedis.get(key);
closeJedis(jedis);
} catch (Exception e) {
closeBrokenJedis(jedis);
logger.error("JedisCache.get falid", e);
}
return result;
}

/**
* 根据key删除
*
* @param key
*/
public static void del(String key) {
getJedis().del(key);
}
}

其中的getJedisPool()可以从bean获取JedisPool对象, 用于后续的操作, 上面给出了部分代码, 完整版在这.

在springboot的主类上添加注解

@SpringBootApplication
@EnableCaching
@Import({JedisUtils.class, JedisPool.class})
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}