1. 程式人生 > >StringRedisTemplate多個數據庫時RedisDao

StringRedisTemplate多個數據庫時RedisDao

最近開發專案中使用Redis資料庫,看了原來人寫的程式碼,覺得挺差的。由於應用訪問Redis中的不同資料庫,原來ReidsDao層竟然使用MapDao,StringDao,HashDao,然後在這些Dao都注入不同資料庫的StringRedisTemplateBean了。雙休時充充電,把那一部分重新寫下, 使用Spring4.2 + spring-data-redis1.4.2.RELEASE。

 

配置檔案

1.web.xml

<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
</context-param>

<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

2. applicationContext.xml

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<!--要是有多個配置檔案,只需在這裡繼續新增即可 --> 
			<list>
				<value>classpath:jdbc.properties</value>
				<value>classpath:redis.properties</value>
			</list>
		</property>  
</bean>
<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>

	<!-- 配置JedisConnectionFactory -->
	<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
		<property name="hostName" value="${redis.host}"/>
		<property name="port" value="${redis.port}"/>
		<property name="password" value="${redis.pass}"/>
		<property name="database" value="${redis.dbIndex}"/>
		<property name="poolConfig" ref="poolConfig"/>
	</bean>

	
	<!-- 配置StringRedisTemplate -->
	<bean id="strredisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
		<property name="connectionFactory" ref="jedisConnectionFactory"/>
	</bean>
	
	<!-- 配置CurJedisConnectionFactory -->
	<bean id="curjedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
		<property name="hostName" value="${redis.host}"/>
		<property name="port" value="${redis.port}"/>
		<property name="password" value="${redis.pass}"/>
		<property name="database" value="${redis.dbIndexcur}"/>
		<property name="poolConfig" ref="poolConfig"/>
	</bean>
	
	<!-- 配置CurStringRedisTemplate -->
	<bean id="curredisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
		<property name="connectionFactory" ref="curjedisConnectionFactory"/>
	</bean>
	
	<!-- 配置hisJedisConnectionFactory -->
	<bean id="hisjedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
		<property name="hostName" value="${redis.host}"/>
		<property name="port" value="${redis.port}"/>
		<property name="password" value="${redis.pass}"/>
		<property name="database" value="${redis.dbIndexhis}"/>
		<property name="poolConfig" ref="poolConfig"/>
	</bean>
	
	<!--配置HisStringRedisTemplate -->
	<bean id="hisredisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
		<property name="connectionFactory" ref="hisjedisConnectionFactory"/>
	</bean>

3.redis.properties

redis.dbIndex=0
redis.dbIndexcur=1
redis.dbIndexhis=2

 

StringRedisTemplate 基礎知識參考

http://357029540.iteye.com/blog/2388965

也可以去看官方的API

https://docs.huihoo.com/javadoc/spring/spring-data/redis/1.0/org/springframework/data/redis/core/StringRedisTemplate.html

 


redisTemplate.opsForValue();//操作字串
redisTemplate.opsForHash();//操作hash
redisTemplate.opsForList();//操作list
redisTemplate.opsForSet();//操作set
redisTemplate.opsForZSet();//操作有序set

RedisDao封裝如下

package com.scd.redis.dao;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Repository;

/**
 * @author chengdu
 * @date 2018/10/20
 */
@Repository(value="redisDao")
public class RedisDao {
	
    /*
	public enum REDISDB {
		DEFAULT(0),		//strredisTemplate database 0
		CUR(1),			//curredisTemplate database 1
		HIS(2);			//hisredisTemplate database 2
		private REDISDB(int dbIndex){
			this.dbIndex = dbIndex;
		}
		private int dbIndex;
		
		public void setDbIndex(int dbIndex){
			this.dbIndex = dbIndex;
		}
		public int getDbIndex(){
			return dbIndex;
		}
	}*/

    public enum REDISDB {
			DEFAULT("strredisTemplate"),		//strredisTemplate database 0
			CUR("curredisTemplate"),			//curredisTemplate database 1
			HIS("hisredisTemplate");			//hisredisTemplate database 2
			private REDISDB(String beanId){
				this.setBeanId(beanId);
			}
			public String getBeanId() {
				return beanId;
			}
			public void setBeanId(String beanId) {
				this.beanId = beanId;
			}
			private String beanId;
	}
	
	@Autowired
	private StringRedisTemplate strredisTemplate;
	
	@Autowired
	private StringRedisTemplate curredisTemplate;
	
	@Autowired
	private StringRedisTemplate hisredisTemplate;
	
	private StringRedisTemplate redisTemplate;
	
	public void initRedisDao(REDISDB redisDBIndex){		
		switch (redisDBIndex) {
		case DEFAULT:
			redisTemplate = strredisTemplate;
			break;
		case CUR:
			redisTemplate = curredisTemplate;
			break;
		case HIS:
			redisTemplate = hisredisTemplate;
		default:
			break;
		}
	}
	
	//String型別值查詢
	public String getString(String key){
		return redisTemplate.opsForValue().get(key);
	}
	
	//Hash型別值查詢
	public Map<Object, Object> getHashAll(String key){
          return redisTemplate.opsForHash().entries(key);
	}
	public Object getHashField(String key, String field){
		return redisTemplate.opsForHash().get(key, field);
	}
	
	//List型別值查詢
	public List<String> getListRange(String key, long start, long end){
		return redisTemplate.opsForList().range(key, start, end);
	}
	
	public long getListSize(String key){
		return redisTemplate.opsForList().size(key);
	}
	
	public List<String> getListAll(String key){
		long size = getListSize(key);
		return redisTemplate.opsForList().range(key, 0, size - 1);
	}
	
	//Set型別值查詢
	public Set<String> getSet(String key){
		return redisTemplate.opsForSet().members(key);
	}
	
	//......其它插入、刪除、更新操作
}

還有些插入、更新操作沒完善,寫的有點不足的是每次切換資料庫時都要init一下,寫了一段測試程式碼如下

    @Autowired
    private RedisDao redisDao;

	@RequestMapping(value="/queryredis.do")
	public void queryRedis(){
		//0號資料庫
		redisDao.initRedisDao(REDISDB.DEFAULT);
		System.out.println(redisDao.getString("name"));
		Map<Object, Object> map0 = redisDao.getHashAll("user");
		System.out.println(redisDao.getSet("urls"));
		System.out.println(redisDao.getListAll("books"));
		//1號資料庫
		redisDao.initRedisDao(REDISDB.CUR);
		System.out.println(redisDao.getString("name"));
		Map<Object, Object> map1 = redisDao.getHashAll("user");
		System.out.println(redisDao.getSet("urls"));
		System.out.println(redisDao.getListAll("books"));
		//2號資料庫
		redisDao.initRedisDao(REDISDB.HIS);
		System.out.println(redisDao.getString("name"));
		Map<Object, Object> map2 = redisDao.getHashAll("user");
		System.out.println(redisDao.getSet("urls"));
		System.out.println(redisDao.getListAll("books"));
	}