Redis(三) 与Spring集成、读写交互操作

Redis() Spring集成、读写交互操作

 集成方式各异,直接上代码。

    一、jar准备

    :不同版本的可能会引起冲突报错,开始我用的jedis版本为1.2.1的与spring-data-redis 1.6.0的集成就报错了,后改为jedis版本为2.4.2的进行使用。

   4个易冲突的maven依赖附上

                 <dependency>
			<groupId>redis.clients</groupId>
			<artifactId>jedis</artifactId>
			<version>2.4.2</version>
		</dependency>
               <dependency>
                  <groupId>org.springframework.data</groupId>  
	          <artifactId>spring-data-redis</artifactId>  
	          <version>1.6.0.RELEASE</version>  
  	       </dependency>
               <dependency>
			<groupId>commons-pool</groupId>
			<artifactId>commons-pool</artifactId>
			<version>1.6</version>
		</dependency>
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-pool2</artifactId>
			<version>2.2</version>
		</dependency>

、配置文件

 

1.properties 文件

  # Redis settings

   redis.maxIdle = 5  

扫描二维码关注公众号,回复: 467764 查看本文章

   redis.maxActive = 50

   redis.maxWait = 300000

   redis.testOnBorrow = true

   redis.hostName = 192.168.1.118

   redis.port = 6379


2.redis连接池配置、连接配置、及暴露封装好了的redisTemplate

<?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"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context.xsd">
	
	<context:property-placeholder location="classpath:applicationContext.properties" />
	<context:component-scan base-package="com.tablemiao.redis.dao"></context:component-scan>
	<!-- 连接池配置 最大空闲数、最大连接数、最长等待时间、连接是否可用 -->
	<bean id="poolConfig" 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}" />
	</bean>
	
	<!-- 连接配置 地址、端口 -->
	<bean id="connectionFactory"
		class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" >
		<property name="hostName" value="${redis.hostName}" />
		<property name="port" value="${redis.port}" />
		<property name="poolConfig" ref="poolConfig" />
	</bean>	
	
	<!-- 暴露一个redisTemplate 用作redis一系列操作 -->
	<bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
		<property name="connectionFactory" ref="connectionFactory" />
	</bean>
</beans>

 

三、redisTemplate的使用

 1.BaseDao 得到可用的redis连接,直接获取redisTemplate进行对redis数据库的操作,redisTemplate本身就做了对redis命令的封装,只是个人感觉不是特别友好。

public class BaseDao {
    
	protected RedisTemplate<String, Object> redisTemplate;
	
	protected Logger logger = LoggerFactory.getLogger(this.getClass());
	
	@Autowired
	@Qualifier("redisTemplate")
	public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {
		this.redisTemplate = redisTemplate;
	}
	
}

2.调用redisTemplate中的方法进行对数据的操作,按个人喜好简单封装(只列举了几个,其实方法底层也是操作redis命令)

依次是 Stringlisthash、根据key值拿数据、删除数据

package com.tablemiao.redis.dao;

import java.util.List;

import org.springframework.data.redis.connection.DataType;
import org.springframework.stereotype.Repository;

import com.tablemiao.redis.BaseDao;

@Repository
public class CustomDao extends BaseDao{
	
	public boolean insertString(String key, String value) {
		try {
			 super.redisTemplate.opsForValue().set(key, value);
			return true;
		} catch (Exception e) {
			logger.info("新增错误:{}", e.getMessage());
			return false;
		}

	}
	
	public boolean insertList(String key, Object value) {
		try {
			super.redisTemplate.opsForList().leftPushAll(key, value);	
			return true;
		} catch (Exception e) {
			logger.info("新增错误:{}", e.getMessage());
			return false;
		}

	}
	
	public boolean insertHash(String key, String sonKey ,Object value) {
		try {
			super.redisTemplate.opsForHash().put(key, sonKey, value);	
			return true;
		} catch (Exception e) {
			logger.info("新增错误:{}", e.getMessage());
			return false;
		}

	}
	
	public Object select(String key){
		try {
			 DataType type = redisTemplate.type(key);
			 if(DataType.NONE == type){
				 logger.info("key不存在");
				 return null;
			 }else if(DataType.STRING == type){
				 return super.redisTemplate.opsForValue().get(key);
			 }else if(DataType.LIST == type){
				 return super.redisTemplate.opsForList().range(key, 0, -1);
			 }else if(DataType.HASH == type){
				 return super.redisTemplate.opsForHash().entries(key);
			 }else
				 return null;
		} catch (Exception e) {
			logger.info("查询错误:{}", e.getMessage());
			return null;
		}
	}
	
	public boolean delete(List<String> keys){
		try{
			redisTemplate.delete(keys);
			return true;
		}catch(Exception e){
			logger.info("删除失败:{}", e.getMessage());
			return false;
		}
	}
}

 

3.测试类及结果

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;

import com.tablemiao.redis.dao.CustomDao;

@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class Test extends AbstractJUnit4SpringContextTests{
	
	protected Logger logger = LoggerFactory.getLogger(this.getClass());
	
	@Autowired
	private CustomDao c;
	
	@org.junit.Test
	public void test(){
		
		logger.info("=========start===========");
		/*
		      String的操作
		c.insertString("java:string:english", "java_insert_string");
		logger.info("查询redis中的值:{}",c.select("java:string:english"));
		c.insertString("java:string:cn", "redis学习");
		logger.info("查询redis中的值:{}",c.select("java:string:cn"));	
		*/
		
		/*
            	列表操作
		List<Object> list = new ArrayList<Object>();
		list.add("redis学习");
		list.add("123456789");
		c.insertList("java:list", list);
		logger.info("查询redis中的值:{}",c.select("java:list"));
		//创建一个列表之后 再次添加一个Map到列表里面
		Map<String,String> map = new HashMap<String,String>();
		map.put("A", "sss");
		map.put("AB", "sssdf");
		c.insertList("java:list", map.toString());
		logger.info("查询redis中的值:{}",c.select("java:list"));
		*/
		
		/*
              	哈希表操作
		c.insertHash("java:map", "key1", "123");
		//得到这个Hash类型  再次放入一个对象
		CustomEntity bean = new CustomEntity();
		bean.setA(123);
		bean.setB(new Date());
		bean.setC("ABC");
		logger.info("查询redis中的值:{}",c.select("java:map"));
		c.insertHash("java:map", "key2", bean.toString());
		logger.info("查询redis中的值:{}",c.select("java:map"));
		*/
		
		/*
		       读取redis中的数据
	    logger.info("查询redis中的值:{}",c.select("java:map"));
	    Object map = c.select("java:map");
	    if(map instanceof Map){
	    	Map<String,Object> resultMap = (Map<String,Object>)map;
	    	
	    	Iterator<Object> it = resultMap.values().iterator();
	    	while(it.hasNext())
	    		logger.info("遍历Map:{}",it.next());
	    }
	    */
		
		/*
             	删除数据
		logger.info("查询redis中的值:{}",c.select("java:map"));
		List<String> keys = new ArrayList<String>();
		keys.add("java:map");
		c.delete(keys);
		logger.info("查询redis中的值:{}",c.select("java:map"));
		*/
		logger.info("=========end===========");
	}
}

 

列表操作的结果:

哈希表操作的结果:

查询操作的结果:

删除操作的结果:

 

注:代码在整体maven项目中的cc-redis-two,测试类在src/test/java

 

参考:

http://blog.csdn.net/dyllove98/article/details/9632407  spring-data-redis简单操作

http://docs.spring.io/spring-data/redis/docs/1.0.x/api/org/springframework/data/redis/core/RedisTemplate.html#delete%28java.util.Collection%29      RedisTemplate API

http://stackoverflow.com/questions/22704518/jedispoolconfig-is-not-assignable-to-genericobjectpoolconfig    jar冲突报错版本解决

猜你喜欢

转载自tablemiao.iteye.com/blog/2266185