StringRedisTemplate多個數據庫時RedisDao
阿新 • • 發佈:2018-11-11
最近開發專案中使用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
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"));
}