SpringMVC项目通过Maven进行集成Redis过程中,使用配置文件进行设置时遇到的坑。
1.添加Redis依赖
通常,在集成Redis时,通过Maven是比较简单进行整合的,只需要导入相应的redis依赖即可,如下图,现导入Redis所需的依赖(注:因本文所介绍的是改redis序列化方式由GenericJackson2RedisSerializer改为Jackson2JsonRedisSerializer)
,在pom.xml文件中添加如下内容:
/**版本信息*/
1.8.15.RELEASE
2.9.0
2.9.7
0.8.16
org.springframework.data
spring-data-redis
${redis.version}
redis.clients
jedis
${jedis.client.version}
com.fasterxml.jackson.core
jackson-databind
${jackson.version}
org.msgpack
jackson-dataformat-msgpack
${jackson.msgpack.version}
在网上介绍较多的是GenericJackson2RedisSerializer序列化文件配置方案,但如何改用Jackson2JsonRedisSerializer的方式介绍较少,本人在项目中正好使用到Jackson序列化方式,搜寻由xml文件配置方案未果,才自己尝试摸索,使用注解方式修改成功。
介绍修改方式之前,我们还是通篇按部就班,来个完整的配置过程。
2.添加Redis数据库连接文件redis.properties
#ip地址
redis.hostName=127.0.0.1
#端口号
redis.port=6379
#如果有密码
redis.password=
#客户端超时时间单位是毫秒 默认是2000
redis.timeout=10000
#redis 支持16个数据库(相当于不同用户)可以使不同的应用程序数据彼此分开同时又存储在相同的实例上
redis.dbIndex=0
#最大空闲数
redis.maxIdle=300
#连接池的最大数据库连接数。设为0表示无限制,如果是jedis 2.4以后用redis.maxTotal
#redis.maxActive=600
#控制一个pool可分配多少个jedis实例,用来替换上面的redis.maxActive,如果是jedis 2.4以后用该属性
redis.maxTotal=1000
#最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
redis.maxWaitMillis=1000
#连接的最小空闲时间 默认1800000毫秒(30分钟)
redis.minEvictableIdleTimeMillis=300000
#每次释放连接的最大数目,默认3
redis.numTestsPerEvictionRun=1024
#逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
redis.timeBetweenEvictionRunsMillis=30000
#是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个
redis.testOnBorrow=true
#在空闲时检查有效性, 默认false
redis.testWhileIdle=true
3.Spring配置文件增加applicationContext-redis.xml配置文件,使得在项目启动时正常加载。
以下配置文件,设置了Redis入库时,序列化方式为GenericJackson2RedisSerializer,但我实际需要用到的序列化方式为Jackson2RedisSerializer,大家可查询下官方文档的描述,在使用Jackson2RedisSerializer作为序列化方式时需要指定具体的(.class),这在xml配置文件中不太容易操作,如是想到使用注解解决。
-->
4.更改入库序列化方式为Jackson2RedisSerializer
这一步,需要将上一步的xml配置文件中的redis操作模板的配置部分注释掉。
新增RedisConfig.java
import com.fasterxml.jackson.databind.ObjectMapper;
import org.msgpack.jackson.dataformat.MessagePackFactory;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
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 java.text.SimpleDateFormat;
/**
* @Author Jesson
* Date 2018/8/24 16 53
* Description:
*/
@Configuration
@EnableCaching
public class RedisConfig {
@Bean(name = "redisTemplate")
public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
RedisTemplate redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
ObjectMapper mapper = new ObjectMapper(new MessagePackFactory());
/**设置存储到redis中的日期格式*/
mapper.setDateFormat(new SimpleDateFormat("yyyyMMddHHmmss"));
Jackson2JsonRedisSerializer Jackson2Serializer = new Jackson2JsonRedisSerializer(Object.class);
Jackson2Serializer.setObjectMapper(mapper);
RedisSerializer redisSerializer = Jackson2Serializer;
redisTemplate.setValueSerializer(redisSerializer);
redisTemplate.setHashValueSerializer(redisSerializer);
redisTemplate.setConnectionFactory(factory);
return redisTemplate;
}
}
如上,即可对Redis的序列化方式进行修改。
5.工具类RedisUtil.java
import com.grgbanking.core.utils.ConvertUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @Author Jesson
* Date 2018/8/27 10 02
* Description: Redis工具类
*/
@Component
public final class RedisUtil {
@Autowired
private RedisTemplate redisTemplate;
// =============================common============================
/**
* 功能描述:指定缓存失效时间
*
* @param key
* @return
* @author Jesson
* @date 2018/8/27 10:04
*/
public boolean expire(String key, long time) {
try {
if (time > 0) {
redisTemplate.expire(key, time, TimeUnit.SECONDS);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 功能描述:根据key 获取过期时间
*
* @param key 键,不能为null
* @return 时间(s) 返回0 代表永久有效
* @author Jesson
* @date 2018/8/27 10:10
*/
public long getExpire(String key) {
return redisTemplate.getExpire(key, TimeUnit.SECONDS);
}
/**
* 功能描述:判断key是否存在
*
* @param key
* @return true 存在 false不存在
* @author Jesson
* @date 2018/8/27 10:12
*/
public boolean hasKey(String key) {
try {
return redisTemplate.hasKey(key);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 功能描述:删除缓存
*
* @param key 可为多个
* @return
* @author Jesson
* @date 2018/8/27 10:13
*/
@SuppressWarnings("unchecked")
public void del(String... key) {
if (key != null && key.length > 0) {
if (key.length == 1) {
redisTemplate.delete(key[0]);
} else {
redisTemplate.delete(CollectionUtils.arrayToList(key));
}
}
}
// ============================String=============================
/**
* 普通缓存获取
*
* @param key 键
* @return 值
*/
public Object get(String key) {
return key == null ? null : redisTemplate.opsForValue().get(key);
}
/**
* 普通缓存放入
*
* @param key 键
* @param value 值
* @return true成功 false失败
*/
public boolean set(String key, Object value) {
try {
redisTemplate.opsForValue().set(key, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 普通缓存放入并设置时间
*
* @param key 键
* @param value 值
* @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期
* @return true成功 false 失败
*/
public boolean set(String key, Object value, long time) {
try {
if (time > 0) {
redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
} else {
set(key, value);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 递增
*
* @param key 键
* @param delta 要增加几(大于0)
* @return
*/
public long incr(String key, long delta) {
if (delta < 0) {
throw new RuntimeException("递增因子必须大于0");
}
return redisTemplate.opsForValue().increment(key, delta);
}
/**
* 递减
*
* @param key 键
* @param delta 要减少几(小于0)
* @return
*/
public long decr(String key, long delta) {
if (delta < 0) {
throw new RuntimeException("递减因子必须大于0");
}
return redisTemplate.opsForValue().increment(key, -delta);
}
// ================================Map=================================
/**
* HashGet
*
* @param key 键 不能为null
* @param item 项 不能为null
* @return 值
*/
public Object hget(String key, String item) {
return redisTemplate.opsForHash().get(key, item);
}
/**
* 获取hashKey对应的所有键值
*
* @param key 键
* @return 对应的多个键值
*/
public Map
以上,如有大神用配置文件方式实现,还请留言指教,感谢!