SpringMVC项目通过Maven进行集成Redis过程中,使用配置文件进行设置时遇到的坑。
1.添加Redis依赖
通常,在集成Redis时,通过Maven是比较简单进行整合的,只需要导入相应的redis依赖即可,如下图,现导入Redis所需的依赖(注:因本文所介绍的是改redis序列化方式由GenericJackson2RedisSerializer改为Jackson2JsonRedisSerializer)
,在文件中添加如下内容:
/**版本信息*/
</properties>
<>1.8.</>
<>2.9.0</>
<>2.9.7</>
<>0.8.16</>
</properties>
<dependencies>
<!--redis依赖-->
<dependency>
<groupId></groupId>
<artifactId>spring-data-redis</artifactId>
<version>${}</version>
</dependency>
<dependency>
<groupId></groupId>
<artifactId>jedis</artifactId>
<version>${}</version>
</dependency>
<dependency>
<groupId></groupId>
<artifactId>jackson-databind</artifactId>
<version>${}</version>
</dependency>
<dependency>
<groupId></groupId>
<artifactId>jackson-dataformat-msgpack</artifactId>
<version>${}</version>
</dependency>
<dependencies>
在网上介绍较多的是GenericJackson2RedisSerializer序列化文件配置方案,但如何改用Jackson2JsonRedisSerializer的方式介绍较少,本人在项目中正好使用到Jackson序列化方式,搜寻由xml文件配置方案未果,才自己尝试摸索,使用注解方式修改成功。
介绍修改方式之前,我们还是通篇按部就班,来个完整的配置过程。
2.添加Redis数据库连接文件
#ip地址
=127.0.0.1
#端口号
=6379
#如果有密码
=
#客户端超时时间单位是毫秒 默认是2000
=10000
#redis 支持16个数据库(相当于不同用户)可以使不同的应用程序数据彼此分开同时又存储在相同的实例上
=0
#最大空闲数
=300
#连接池的最大数据库连接数。设为0表示无限制,如果是jedis 2.4以后用
#=600
#控制一个pool可分配多少个jedis实例,用来替换上面的,如果是jedis 2.4以后用该属性
=1000
#最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
=1000
#连接的最小空闲时间 默认1800000毫秒(30分钟)
=300000
#每次释放连接的最大数目,默认3
=1024
#逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
=30000
#是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个
=true
#在空闲时检查有效性, 默认false
=true
配置文件增加配置文件,使得在项目启动时正常加载。
以下配置文件,设置了Redis入库时,序列化方式为GenericJackson2RedisSerializer,但我实际需要用到的序列化方式为Jackson2RedisSerializer,大家可查询下官方文档的描述,在使用Jackson2RedisSerializer作为序列化方式时需要指定具体的(.class),这在xml配置文件中不太容易操作,如是想到使用注解解决。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="/schema/beans"
xmlns:xsi="http:///2001/XMLSchema-instance"
xmlns:context="/schema/context"
xsi:schemaLocation="/schema/beans /schema/beans/ /schema/context /schema/context/">
<!-- 加载配置文件 -->
<context:property-placeholder location="classpath:" ignore-unresolvable="true"/>
<!-- redis连接池配置-->
<bean class="">
<!--最大空闲数-->
<property name="maxIdle" value="${}"/>
<!--连接池的最大数据库连接数 -->
<property name="maxTotal" value="${}"/>
<!--最大建立连接等待时间-->
<property name="maxWaitMillis" value="${}"/>
<!--逐出连接的最小空闲时间 默认1800000毫秒(30分钟)-->
<property name="minEvictableIdleTimeMillis" value="${}"/>
<!--每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3-->
<property name="numTestsPerEvictionRun" value="${}"/>
<!--逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1-->
<property name="timeBetweenEvictionRunsMillis" value="${}"/>
<!--是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个-->
<property name="testOnBorrow" value="${}"/>
<!--在空闲时检查有效性, 默认false -->
<property name="testWhileIdle" value="${}"/>
</bean>
<!-- redis集群配置 哨兵模式 -->
<!-- <bean class="">
<property name="master">
<bean class="">
这个值要和Sentinel中指定的master的值一致,不然启动时找不到Sentinel会报错的
<property name="name" value="mymaster"></property>
</bean>
</property>
记住了,这里是指定Sentinel的IP和端口,不是Master和Slave的
<property name="sentinels">
<set>
<bean class="">
<constructor-arg name="host" value="${.host1}"></constructor-arg>
<constructor-arg name="port" value="${.port1}"></constructor-arg>
</bean>
<bean class="">
<constructor-arg name="host" value="${.host2}"></constructor-arg>
<constructor-arg name="port" value="${.port2}"></constructor-arg>
</bean>