前言:最近刚刚换了一下公司(唱吧)做O2O线上线下KTV产品。公司之前有一个ERP1.0,但是因为各种原因吧,公司要换一个技术重做这个系统。选择了使用C#做winfrom前端,然后JAVA做服务器的后端。所有的项目架构以及代码全部重新设计。所以就有了让我去做redis缓存以及后期的读写分离的架构。好了,闲话少说,开始说正题了。第一次写博客,还望大家多多包涵,写的读不懂的地方留言,然后我会改进。
在项目中我使用的是spring内部整合的redis。不得不服,spring几乎整合了当下所有流行的框架。http://projects.spring.io/spring-data/ 从这上面看,当下流行的redis、solr、hadoop、mongoDB、couchBase... 全都收入囊中。对于redis整合而言,主要用到的是spring-data-redis
使用步骤
- 添加pom依赖
<span style="font-weight: normal;"> <!-- spring data redis -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.4.2.RELEASE</version>
</dependency>
<!-- spring data redis end --></span>
其他的spring所需要的包,请大家自行添加就好。 - 配置spring-redis.xml文件。
<span style="font-weight: normal;"><!-- 关于添加 ignore-unresolvable="true" 的解释,因为A配置器在执行的时候,只加载了A的properties,但是此时会扫描整个容器中的bean,发现有moduleb的占位符,无法解析。 所以加上配置,忽略无法解析的占位符就行 property name="ignoreUnresolvablePlaceholders" value="true",这样A配置器忽略掉的占位符等到B配置器执行的时候就解析成功了。-->
<context:property-placeholder location="classpath:redis.properties" ignore-unresolvable="true"/>
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="${redis.maxIdle}" />
<property name="maxTotal" value="${redis.maxActive}" />
<property name="maxWaitMillis" value="${redis.maxWait}" />
<property name="testOnBorrow" value="${redis.testOnBorrow}" />
<property name="testOnReturn" value="true" />
</bean>
<bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.pass}"
p:pool-config-ref="jedisPoolConfig" />
<!-- redis 序列化策略 ,手动指定 key 采用String序列化策略 -->
<bean id="stringSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer" />
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="connectionFactory" />
<property name="keySerializer" ref="stringSerializer" />
<!-- 开启事务,可以通过transcational注解控制 -->
<property name="enableTransactionSupport" value="true" />
</bean>
<bean class="com.changba.idc.dao.Login"/></span>
redis.properties
<span style="font-weight: normal;">redis.host= 192.168.1.1
redis.port= 6379
redis.timeout= 1000
redis.pass= admin
#连接池中最大空闲连接数
redis.maxIdle=300
#连接池中最大连接数
redis.maxActive=600
#当连接池资源耗尽时,调用者最大阻塞时间,超时将异常。单位 毫秒 默认为-1 永不超时
redis.maxWait=1000
#向调用者输出“链接”资源时,是否检测是有有效,如果无效则从连接池中移除,并尝试获取继续获取。默认为false。
redis.testOnBorrow=true
#向连接池“归还”链接时,是否检测“链接”对象的有效性。默认为false
reids.testOnReturn=true</span>
接下来在web.xml中的contextConfigLocation节点下将spring-redis.xml加入进去。在web容器启动时就自动加载spring-redis.xml配置文件就可以了。
使用的时候在代码中使用@Autowired 自动注入,然后定义redisTemplate 就可以使用了 private RedisTemplate<String, Object> redisTemplate;
<span style="font-weight: normal;"> <!-- spring data redis -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.4.2.RELEASE</version>
</dependency>
<!-- spring data redis end --></span>
其他的spring所需要的包,请大家自行添加就好。<span style="font-weight: normal;"><!-- 关于添加 ignore-unresolvable="true" 的解释,因为A配置器在执行的时候,只加载了A的properties,但是此时会扫描整个容器中的bean,发现有moduleb的占位符,无法解析。 所以加上配置,忽略无法解析的占位符就行 property name="ignoreUnresolvablePlaceholders" value="true",这样A配置器忽略掉的占位符等到B配置器执行的时候就解析成功了。-->
<context:property-placeholder location="classpath:redis.properties" ignore-unresolvable="true"/>
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="${redis.maxIdle}" />
<property name="maxTotal" value="${redis.maxActive}" />
<property name="maxWaitMillis" value="${redis.maxWait}" />
<property name="testOnBorrow" value="${redis.testOnBorrow}" />
<property name="testOnReturn" value="true" />
</bean>
<bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.pass}"
p:pool-config-ref="jedisPoolConfig" />
<!-- redis 序列化策略 ,手动指定 key 采用String序列化策略 -->
<bean id="stringSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer" />
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="connectionFactory" />
<property name="keySerializer" ref="stringSerializer" />
<!-- 开启事务,可以通过transcational注解控制 -->
<property name="enableTransactionSupport" value="true" />
</bean>
<bean class="com.changba.idc.dao.Login"/></span>
<span style="font-weight: normal;">redis.host= 192.168.1.1
redis.port= 6379
redis.timeout= 1000
redis.pass= admin
#连接池中最大空闲连接数
redis.maxIdle=300
#连接池中最大连接数
redis.maxActive=600
#当连接池资源耗尽时,调用者最大阻塞时间,超时将异常。单位 毫秒 默认为-1 永不超时
redis.maxWait=1000
#向调用者输出“链接”资源时,是否检测是有有效,如果无效则从连接池中移除,并尝试获取继续获取。默认为false。
redis.testOnBorrow=true
#向连接池“归还”链接时,是否检测“链接”对象的有效性。默认为false
reids.testOnReturn=true</span>
接下来在web.xml中的contextConfigLocation节点下将spring-redis.xml加入进去。在web容器启动时就自动加载spring-redis.xml配置文件就可以了。
使用的时候在代码中使用@Autowired 自动注入,然后定义redisTemplate 就可以使用了 private RedisTemplate<String, Object> redisTemplate;