首页 > 编程 > Java > 正文

Spring集成Redis详解代码示例

2019-11-26 10:55:32
字体:
来源:转载
供稿:网友

本文章从头开始介绍Spring集成Redis的示例。

Eclipse工程结构

如下图为我的示例工程的结构图,采用Maven构建。其中需要集成Spring,因此需要beans.xml文件配置spring的依赖注入,redis.properties配置连接服务器的配置信息。

其中工程中beans.xml和redis.properties文件直接放在了根目录,有需要的读者可以放到resource目录中。

POM依赖

如下为示例POM依赖,Spring集成redis需要依赖的包为:jedis包,spring-context模块及依赖的包,spring-data-redis模块包,spring-test包用于JUnit测试,pom.xml文件内容如下:

<project xmlns="https://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">  <modelversion>4.0.0</modelversion>   <groupid>com.test</groupid>  JavaTest</artifactid>  <version>0.0.1-SNAPSHOT</version>  <packaging>jar</packaging>   <name>JavaTest</name>  <url>https://maven.apache.org</url>   <properties>    <project.build.sourceencoding>UTF-8</project.build.sourceencoding>  </properties>   <dependencies>    <dependency>      <groupid>junit</groupid>      junit</artifactid>      <version>4.12</version>      <scope>test</scope>    </dependency>    <dependency>      <groupid>redis.clients</groupid>      jedis</artifactid>      <version>2.5.1</version>    </dependency>    <dependency>      <groupid>org.springframework</groupid>      spring-context</artifactid>      <version>4.2.6.RELEASE</version>      <scope>runtime</scope>    </dependency>    <dependency>      <groupid>org.springframework</groupid>      spring-test</artifactid>      <version>4.2.6.RELEASE</version>      <scope>runtime</scope>    </dependency>    <dependency>      <groupid>org.springframework.data</groupid>      spring-data-redis</artifactid>      <version>1.7.2.RELEASE</version>    </dependency>  </dependencies></project>

Spring配置

Spring配置文件beans.xml的配置如下:

<!--?xml version="1.0" encoding="UTF-8"?--> <beans xmlns="https://www.springframework.org/schema/beans" xmlns:aop="https://www.springframework.org/schema/aop" xmlns:context="https://www.springframework.org/schema/context" xmlns:jee="https://www.springframework.org/schema/jee" xmlns:p="https://www.springframework.org/schema/p" xmlns:tx="https://www.springframework.org/schema/tx" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="       https://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd       https://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">   <!-- 加载classpath下的Redis配置文件 -->  <context:property-placeholder location="classpath:redis.properties">   <bean class="redis.clients.jedis.JedisPoolConfig" id="poolConfig">     <property name="maxIdle" value="${redis.maxIdle}">    <property name="testOnBorrow" value="${redis.testOnBorrow}">  </property></property></bean>    <bean class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" id="connectionFactory" p:host-name="${redis.host}" p:password="${redis.pass}" p:pool-config-ref="poolConfig" p:port="${redis.port}">    <!-- spring提供的模板类 -->  <bean class="org.springframework.data.redis.core.StringRedisTemplate" id="redisTemplate">     <property name="connectionFactory" ref="connectionFactory">  </property></bean>   <bean class="com.redis.test.UserDao" id="userDao">    <property name="redisTemplate" ref="redisTemplate">   </property></bean> </bean></context:property-placeholder></beans>

在beans.xml配置文件中,需要先加载redis.properties文件。

Redis配置信息

Redis的配置信息在redis.properties文件中配置:

# Redis地址和端口和连接密码redis.host=localhostredis.port=6379redis.pass= redis.maxIdle=300redis.testOnBorrow=true

此示例,连接Redis服务器时没有设置连接密码,因此不用填值。

Java代码

User.java

package com.redis.test;import java.io.Serializable;public class User implements Serializable {	private static final long serialVersionUID = 3409768855488864675L;	private String id;	private String name;	private String password;	public User() {	}	public User(String id, String name, String password) {		this.id = id;		this.name = name;		this.password = password;	}	public String getId() {		return id;	}	public void setId(String id) {		this.id = id;	}	public String getName() {		return name;	}	public void setName(String name) {		this.name = name;	}	public String getPassword() {		return password;	}	public void setPassword(String password) {		this.password = password;	}	public String toString() {		return "User [id=" + id + ", name=" + name + ", password=" + password + "]";	}}

AbstractRedisBaseDao.java

package com.redis.test;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.serializer.RedisSerializer;public abstract class AbstractRedisBaseDao<k, v=""> {  protected RedisTemplate<k, v=""> redisTemplate;public RedisTemplate<k, v=""> getRedisTemplate() {	return redisTemplate;}public void setRedisTemplate(RedisTemplate<k, v=""> redisTemplate) {	this.redisTemplate = redisTemplate;}/**   * 获取 RedisSerializer   */protected RedisSerializer<string> getRedisSerializer() {	return redisTemplate.getStringSerializer();}}

IUserDao.java

package com.redis.test;import java.util.List;public interface IUserDao {	/** 新增 */	Boolean add(User user);	/** 批量新增,pipeline方式 */	Boolean add(List<user> list);	/** 删除 */	void delete(String key);	/** 批量删除 */	void delete(List<string> keys);	/** 更新 */	Boolean update(User user);	/** 读取 */	User get(String keyId);}

UserDao.java

package com.redis.test;import java.util.List;import org.springframework.dao.DataAccessException;import org.springframework.data.redis.connection.RedisConnection;import org.springframework.data.redis.core.RedisCallback;import org.springframework.data.redis.serializer.RedisSerializer;import org.springframework.util.Assert;public class UserDao extends AbstractRedisBaseDao<string, user=""> implements IUserDao {  public Boolean add(final User user) {	Boolean result = redisTemplate.execute(new RedisCallback<Boolean>() {		public Boolean doInRedis(RedisConnection connection) throws DataAccessException {			RedisSerializer<string> serializer = getRedisSerializer();			byte[] key = serializer.serialize(user.getId());			// 将ID序列化成key			byte[] value = serializer.serialize(user.getName());			return connection.setNX(key, value);		}	}	);	return result;}public Boolean add(final List<user> list) {	Assert.notEmpty(list);	Boolean result = redisTemplate.execute(new RedisCallback<Boolean>() {		public Boolean doInRedis(RedisConnection connection) throws DataAccessException {			RedisSerializer<string> serializer = getRedisSerializer();			for (int i = 0; i < list.size(); i++) {				User user = list.get(i);				byte[] key = serializer.serialize(user.getId());				// 将ID序列化成key				byte[] value = serializer.serialize(user.getName());				connection.setNX(key, value);			}			return true;		}	}	, false, true);	return result;}public void delete(String key) {	redisTemplate.delete(key);}public void delete(List<string> keys) {	redisTemplate.delete(keys);}public Boolean update(final User user) {	String key = user.getId();	if(get(key) == null) {		throw new NullPointerException("数据行不存在,key = " + key);	}	Boolean result = redisTemplate.execute(new RedisCallback<Boolean>() {		public Boolean doInRedis(RedisConnection connection) throws DataAccessException {			RedisSerializer<string> serializer = getRedisSerializer();			byte[] key = serializer.serialize(user.getId());			// 将ID序列化成key			byte[] value = serializer.serialize(user.getName());			connection.set(key, value);			return true;		}	}	);	return result;}public User get(final String keyId) {	User user = redisTemplate.execute(new RedisCallback<user>() {		public User doInRedis(RedisConnection connection) throws DataAccessException {			RedisSerializer<string> serializer = getRedisSerializer();			byte[] key = serializer.serialize(keyId);			byte[] value = connection.get(key);			if(value == null) {				return null;			}			String name = serializer.deserialize(value);			return new User(keyId, name, null);		}	}	);	return user;}}

RedisTest.java(JUnit测试类)

package com.redis.test;import java.util.ArrayList;import java.util.List;import org.junit.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;import org.springframework.util.Assert;/** * junit在Spring context环境下测试 */@ContextConfiguration(locations={"classpath*:beans.xml"})public class RedisTest extends AbstractJUnit4SpringContextTests {	@Autowired	  private IUserDao userDao;	/** 增加单个用户 */	@Test	  public void testAddUser() {		User user = new User("user1", "password1", null);		Boolean result = userDao.add(user);		Assert.isTrue(result);		System.out.println("添加结果:" + result);	}	/** 批量新增普通方式,5286ms */	@Test	  public void testAddUsers1() {		List<user> list = new ArrayList<user>();		for (int i = 10; i < 50000; i++) {			User user = new User();			user.setId("user" + i);			user.setName("password" + i);			list.add(user);		}		long begin = System.currentTimeMillis();		for (User user : list) {			userDao.add(user);		}		System.out.println(System.currentTimeMillis() - begin);	}	/** 批量新增pipeline方式,484ms */	@Test	  public void testAddUsers2() {		List<user> list = new ArrayList<user>();		for (int i = 50000; i < 100000; i++) {			User user = new User();			user.setId("user" + i);			user.setName("password" + i);			list.add(user);		}		long begin = System.currentTimeMillis();		Boolean result = userDao.add(list);		Assert.isTrue(result);		System.out.println(System.currentTimeMillis() - begin);	}	/** 更新 */	@Test	  public void testUpdate() {		User user = new User();		user.setId("user1");		user.setName("new_password");		Boolean result = userDao.update(user);		Assert.isTrue(result);	}	/** 删除 */	@Test	  public void testDelete() {		String key = "user1";		userDao.delete(key);	}	/** 批量删除 */	@Test	  public void testDeletes() {		List<string> list = new ArrayList<string>();		for (int i = 0; i < 10; i++) {			list.add("user" + i);		}		userDao.delete(list);	}	/** 读取 */	@Test	  public void testGetUser() {		String id = "user1";		User user = userDao.get(id);		Assert.notNull(user);		System.out.println(user);	}}

总结

以上就是本文关于Spring集成Redis详解代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

浅谈spring 常用注解

spring中的FactoryBean代码示例

浅谈Spring的两种配置容器

如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表