文档章节

Redis(三) Spring+redis整合

bebep
 bebep
发布于 2017/02/06 12:30
字数 1224
阅读 66
收藏 2

Spring+redis整合

1、spring和redis的maven dependency

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <spring.version>3.2.4.RELEASE</spring.version>
    <ehcache.version>2.6.9</ehcache.version>
    <aspectjrt.version>1.7.2</aspectjrt.version>
    <aspectjweaver.version>1.7.4</aspectjweaver.version>
    <spring.data.redis.version>1.6.0.RELEASE</spring.data.redis.version>
    <redis.client.version>2.7.2</redis.client.version>
    <log4j.version>1.2.15</log4j.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.10</version>
      <scope>test</scope>
    </dependency>
    
    <!-- spring -->
    <dependency>
    	<groupId>org.springframework</groupId>
    	<artifactId>spring-core</artifactId>
    	<version>${spring.version}</version>
    </dependency>
    <dependency>
    	<groupId>org.springframework</groupId>
    	<artifactId>spring-webmvc</artifactId>
    	<version>${spring.version}</version>
    </dependency>
    <dependency>
    	<groupId>org.springframework</groupId>
    	<artifactId>spring-context</artifactId>
    	<version>${spring.version}</version>
    </dependency>
    <dependency>
    	<groupId>org.springframework</groupId>
    	<artifactId>spring-context-support</artifactId>
    	<version>${spring.version}</version>
    </dependency>
    <dependency>
    	<groupId>org.springframework</groupId>
    	<artifactId>spring-tx</artifactId>
    	<version>${spring.version}</version>
    </dependency>
    <dependency>
    	<groupId>org.springframework</groupId>
    	<artifactId>spring-jdbc</artifactId>
    	<version>${spring.version}</version>
    </dependency>
    <dependency>
    	<groupId>org.springframework</groupId>
    	<artifactId>spring-web</artifactId>
    	<version>${spring.version}</version>
    </dependency>
    <dependency>
    	<groupId>org.springframework</groupId>
    	<artifactId>spring-test</artifactId>
    	<version>${spring.version}</version>
    </dependency>
    <!-- spring-aop -->
    <dependency>
    	<groupId>org.springframework</groupId>
    	<artifactId>spring-aop</artifactId>
    	<version>${spring.version}</version>
    </dependency>
    <dependency>
    	<groupId>org.springframework</groupId>
    	<artifactId>spring-aspects</artifactId>
    	<version>${spring.version}</version>
    </dependency>
    <dependency>
		<groupId>org.aspectj</groupId>
		<artifactId>aspectjrt</artifactId>
		<version>${aspectjrt.version}</version>
    </dependency>
    <dependency>
    	<groupId>org.aspectj</groupId>
    	<artifactId>aspectjweaver</artifactId>
    	<version>${aspectjweaver.version}</version>
    </dependency>
    <dependency>
    	<groupId>org.aspectj</groupId>
    	<artifactId>aspectjtools</artifactId>
    	<version>${aspectjweaver.version}</version>
    </dependency>

    <!-- redis -->
    <dependency>
    	<groupId>org.springframework.data</groupId>
    	<artifactId>spring-data-redis</artifactId>
    	<version>${spring.data.redis.version}</version>
    </dependency>
    <dependency>
    	<groupId>redis.clients</groupId>
    	<artifactId>jedis</artifactId>
    	<version>${redis.client.version}</version>
    </dependency>
    <dependency>
    	<groupId>org.apache.commons</groupId>
    	<artifactId>commons-pool2</artifactId>
    	<version>2.0</version>
    </dependency>
    <!-- redis end-->

    <!-- log4j 1.2.15及其以上版本更改了协议,故与jms冲突-->
    <dependency>
    	<groupId>log4j</groupId>
    	<artifactId>log4j</artifactId>
    	<version>1.2.16</version>
    	<exclusions>
    		<exclusion>
    			<groupId>javax.jms</groupId>
    			<artifactId>jms</artifactId>
    		</exclusion>
    		<exclusion>
    			<groupId>com.sun.jdmk</groupId>
    			<artifactId>jmxtools</artifactId>
    		</exclusion>
    		<exclusion>
    			<groupId>com.sun.jmx</groupId>
    			<artifactId>jmxri</artifactId>
    		</exclusion>
    	</exclusions>
    </dependency>
    <dependency>
    	<groupId>org.slf4j</groupId>
    	<artifactId>slf4j-api</artifactId>
    	<version>1.6.6</version>
    </dependency>
    <dependency>
    	<groupId>org.slf4j</groupId>
    	<artifactId>slf4j-log4j12</artifactId>
    	<version>1.6.6</version>
    </dependency>
  </dependencies>

2、redis.properties

#redis服务所在的ip地址
redis.host=192.168.36.131
#指定Redis监听端口,默认端口为6379
redis.port=6379
#授权密码
redis.password=myredis
#最大空闲数:空闲链接数大于maxIdle时,将进行回收
redis.maxIdle=100
#最大连接数:能够同时建立的“最大链接个数”
redis.maxActive=300
#最大等待时间:单位ms
redis.maxWait=1000
#使用连接时,检测连接是否成功 
redis.testOnBorrow=true
#当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
redis.timeout=1000

3、applicationcontext.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:c="http://www.springframework.org/schema/c" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:cache="http://www.springframework.org/schema/cache" xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="  
           http://www.springframework.org/schema/beans  
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
           http://www.springframework.org/schema/aop  
           http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 
           http://www.springframework.org/schema/context  
           http://www.springframework.org/schema/context/spring-context-3.0.xsd 
           http://www.springframework.org/schema/cache 
           http://www.springframework.org/schema/cache/spring-cache-4.2.xsd">

	<context:annotation-config />
	<context:component-scan base-package="com.demo.redis" />

	<!-- list里面添加多个value标签 <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" 
		> <property name="locations"> <list> <value>classpath:properties/*.properties</value> 
		</list> </property> </bean> -->

	<!-- ignore-resource-not-found="true"的作用是如果有多个properties文件,可以忽略某个配置文件中没有的值 -->
	<context:property-placeholder location="classpath:properties/*.properties"
		ignore-resource-not-found="true" />

	<!-- jedis 配置 -->
	<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
		<property name="maxIdle" value="${redis.maxIdle}" />
		<property name="minIdle" value="0" />
		<property name="maxTotal" value="400" />
		<property name="maxWaitMillis" value="${redis.maxWait}" />
		<property name="testOnBorrow" value="${redis.testOnBorrow}" />
		<property name="testWhileIdle" value="true" />
		<property name="minEvictableIdleTimeMillis" value="60000" />
		<property name="timeBetweenEvictionRunsMillis" value="30000" />
		<property name="numTestsPerEvictionRun" value="-1" />
	</bean>

	<!-- redis服务器中心 :使用JedisConnectionFactory -->
	<bean id="connectionFactory"
		class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
		<property name="poolConfig" ref="poolConfig" />
		<property name="hostName" value="${redis.host}" />
		<property name="port" value="${redis.port}" />
		<!-- <property name="password" value="${redis.password}" /> -->
		<property name="timeout" value="${redis.timeout}" />
	</bean>
	<!-- redis服务器中心 :使用ShardedJedisPool -->
	<bean id="sharedJedisPool" class="redis.clients.jedis.ShardedJedisPool">
		<constructor-arg index="0" ref="poolConfig" />
		<constructor-arg index="1">
			<list>
				<bean class="redis.clients.jedis.JedisShardInfo">
					<constructor-arg index="0" value="${redis.host}" />
					<constructor-arg index="1" value="${redis.port}" />
					<constructor-arg index="2" value="${redis.timeout}" />
				</bean>
			</list>
		</constructor-arg>
	</bean>

	<!-- spring提供的操作redis的模版函数 -->
	<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
		<property name="connectionFactory" ref="connectionFactory" />
		<property name="keySerializer">
			<bean
				class="org.springframework.data.redis.serializer.StringRedisSerializer" />
		</property>
		<property name="valueSerializer">
			<bean
				class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
		</property>
	</bean>
</beans>

4、Service:在UserServiceImpl中写了两种保存方法,一种是利用redisTemplate,另一种是用ShardedJedisPool

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;

import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;

import com.demo.redis.entity.User;

@Service("redisTestService")
public class RedisTestServiceImpl<T> implements RedisTestService<T> {

	@Autowired
	private RedisTemplate<String, String> redisTemplate;
	
	@Autowired
	private ShardedJedisPool shardedJedisPool;

	public User addUserByConnectionFactory(final User user) {

		// 1、通过RedisCall回调函数
		redisTemplate.execute(new RedisCallback<T>() {
			@Override
			public T doInRedis(RedisConnection connection)
					throws DataAccessException {
				byte[] key = redisTemplate.getStringSerializer().serialize(user.getUsername());
				byte[] value = redisTemplate.getStringSerializer().serialize(user.getEmail());
				connection.set(key, value);
				return null;
			}
		});

		// 2、通过ValueOperations,
		ValueOperations<String, String> opsForValue = redisTemplate
				.opsForValue();
		opsForValue.set(user.getUsername(), user.getPassword());
		String value = opsForValue.get(user.getUsername());
		System.out.println("addUser :" + value);

		return null;
	}

	@Override
	public User addUserByShardedJedisPool(User user) {
		ShardedJedis jedis = shardedJedisPool.getResource();
		byte[] key = redisTemplate.getStringSerializer().serialize(user.getUsername());
		byte[] value = redisTemplate.getStringSerializer().serialize(user.getEmail());
		jedis.set(key, value);
		
		byte[] valuebyte = jedis.get(key);
		System.out.println("1111" + new String(valuebyte));
		user.setEmail(new String(valuebyte));
		return user;
	}
}

5、测试:使用Spring提供的整合Junit方式

import java.io.Serializable;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.util.Assert;
import com.demo.redis.entity.User;
import com.demo.redis.service.RedisTestServiceImpl;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationcontext.xml")
public class TestRedis {

	@Autowired
	private RedisTemplate<String, Serializable> redisTemplate;
	@Autowired
	private RedisTestServiceImpl<User> redisTestService;
	
	@Test
	public void redisTemplateNotNull(){
		Assert.notNull(redisTemplate, "redisTemplate is null");
	}
	
	@Test
	public void test1(){
		User u = new User();
		u.setUsername("tom1");
		u.setPassword("1231");
		u.setEmail("tom@example.com");
		redisTestService.addUserByConnectionFactory(u);
	}
	
	@Test
	public void test2(){
		User u = new User();
		u.setUsername("tom");
		u.setEmail("tom@ex.com");
		User user = redisTestService.addUserByShardedJedisPool(u);
		System.out.println(user.getEmail());
	}
	
}

【注】:

1、在使用redisTemplate的方式中,可以调用redisTemplate.execute(new RedisCallback(){....doInRedis......})回调函数,在回调函数内部,通过connection操作Redis,connection只能操作数据类型为byte[]的数据,并且提供了很多方法,如mset、mget、lpush、rpush等等,具体请自己尝试。

2、在使用redisTemplate的方式中,还可以使用redisTemplate.opsForValues()函数,可以不用将key、value转换为byte[]。opsForValues是操作String数据类型,还有opsForHash、opsForList、opsForSet、opsForList 分别对应操作 哈希、List、Set、和Sort SET。

3、使用ShardedJedisPool方式中,通过注入

@Autowired
private ShardedJedisPool shardedJedisPool;

调用:

ShardedJedis jedis = shardedJedisPool.getResource();

得到ShardedJedis 对象,从而通过ShardedJedis 操作Redis。

 

© 著作权归作者所有

bebep
粉丝 0
博文 12
码字总数 17916
作品 0
朝阳
程序员
私信 提问
spring+redis 实现 session 共享

使用Nginx+Tomcat进行负载均衡时,希望使用轮询方式进行负载。但是如果使用轮询方式的话,可能会访问不同的Tomcat,此时如果不进行Session共享,则相当于是一个新的Session。就比如现有系统都...

嘴角轻扬30
07/16
75
0
Spring+Redis Cluster3.0.x

Redis 3.0集群搭建方法: http://hot66hot.iteye.com/blog/2050676 Redis 3.0.x使用方法 1.Maven依赖 2.Spring配置 3.增加connect-redis.properties 配置文件 这里配置了6个节点 4.增加实现的...

满小茂
2016/04/28
211
0
sso单点登录遇到问题

使用spring+redis 实现 单点登录,sso服务部署在c 服务器 ,本地启动项目时可以实现单点登录(本地登录时 SESSION 值不会变),将项目部署到 a 服务器,访问 a 服务器上项目地址,跳到 c 服务...

只做你的小飞哥
2018/04/09
370
0
spring+redis自主实现分布式session(非spring-session方式)

背景:最近对一个老项目进行改造,使其支持多机部署,其中最关键的一点就是实现多机session共享。项目有多老呢,jdk版本是1.6,spring版本是3.2,jedis版本是2.2。 1.方案的确定 接到这项目任...

Funcy1122
2018/12/01
188
0
redis(三)与spring整合

一、 JAVA操作redis通常使用的是Jedis,通过java代码来操作redis的数据存储读取等操作,用过的人应该知道,Jedis客户端已经足够简单和轻量级了,但是呢,在此同时,Spring也为Redis提供了支持...

废柴
2018/07/11
308
0

没有更多内容

加载失败,请刷新页面

加载更多

如何递归计算目录中的所有代码行?

我们有一个PHP应用程序,并希望计算特定目录及其子目录下的所有代码行。 我们不需要忽略评论,因为我们只是想弄清楚。 wc -l *.php 该命令在给定目录中运行良好,但忽略子目录。 我当时认为...

技术盛宴
34分钟前
3
0
使用 try-with-resources 优雅关闭资源

我们知道,在 Java 编程过程中,如果打开了外部资源(文件、数据库连接、网络连接等、redis),我们必须在这些外部资源使用完毕后,手动关闭它们。 因为外部资源不由 JVM 管理,无法享用 JVM ...

七弦桐
41分钟前
4
0
04.深入浅出索引(上)

简单来说,索引的出现就是为了提高数据查询效率,就像书的目录一样。 索引的常见模型 索引实现的方式有很多种,所以这里就引入了索引模型的概念,可以用于提高读写效率的数据结构很多,比较常...

scgaopan
44分钟前
5
0
Redis哨兵、复制、集群的设计原理,以及区别

谈到Redis服务器的高可用,如何保证备份的机器是原始服务器的完整备份呢?这时候就需要哨兵和复制。 **哨兵(Sentinel):**可以管理多个Redis服务器,它提供了监控,提醒以及自动的故障转移的...

Java阿七
54分钟前
5
0
浅析laravel路由执行原理

目前很多文章已经对Laravel的执行原理做了详细介绍,这里只是为了个人做一下简单记录 首先看入口 index.php 关键的执行函数就是 handle方法 ,但是前面的几个预处理函数,包括了整合框架的大...

冻结not
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部