redisDao封装类-其他dao集成他
package com.ffcs.wlan.dao.common; import javax.annotation.Resource; import org.springframework.data.redis.core.StringRedisTemplate; /** * AbstractBaseRedisDao * @author hugsh * @version <b>1.0</b> */ public abstract class AbstractBaseRedisDao<K, V> { @Resource protected StringRedisTemplate redisTemplate; public void setRedisTemplate(StringRedisTemplate redisTemplate) { this.redisTemplate = redisTemplate; } }
批量插入(不关注返回值)
@Repository public class RedisInitDao extends AbstractBaseRedisDao<String, Object> { Logger logger=Logger.getLogger(RedisInitDao.class); /** * 批量向redis中插入H码:key(tableName:hcode) value(pcode) * 如果键已存在则返回false,不更新,防止覆盖。使用pipeline批处理方式(不关注返回值) * @param list 一个map代表一行记录,2个key:hcode & pcode。 * @param tableName redis中key的值为tableName:hcode 对应value值为pcode。 * @return */ public boolean addHcode(final List<Map<String, Object>> list,final String tableName) { boolean result = redisTemplate.execute(new RedisCallback<Boolean>() { public Boolean doInRedis(RedisConnection connection) throws DataAccessException { RedisSerializer<String> serializer = redisTemplate.getStringSerializer(); for (Map<String, Object> map : list) { byte[] key = serializer.serialize(tableName+":"+map.get("hcode").toString()); byte[] name = serializer.serialize(map.get("pcode").toString()); connection.setNX(key, name); } return true; } }, false, true); return result; }
批量获取(有返回值)
/** * 从redis中获取(获取密码日志) rPop从链表尾部弹出(最早的日志) * 多线程并发读取日志长度的时候,比如都得到结果是1000条。 * 当多线程每个都 循环1000次 pop弹出 日志的时候, * 由于是多线程一起pop,所以每个线程获得的数组中都会包含 null 甚至有的全是null * @return */ public List<String> getLogFromRedis() { final RedisSerializer<String> serializer = redisTemplate.getStringSerializer(); //密码日志的长度 final Long pwdLogSize=redisTemplate.opsForList().size("getpwdList"); List<Object> pwdLogList=redisTemplate.executePipelined(new RedisCallback<String>() { @Override public String doInRedis(RedisConnection conn) throws DataAccessException { for (int i=0 ;i<pwdLogSize ;i++) { byte[] listName = serializer.serialize("getpwdList"); conn.rPop(listName); } return null; } }, serializer); // 去除结果中的null ArrayList<String> newList=new ArrayList<String>(); for (Object o : pwdLogList) { if(o!=null) newList.add(String.valueOf(o)); } return newList; }
基础数据类型工具类(opsForList)
/** * 向redis中插入获取密码日志:leftPush 从链表头部压入 * @param pwdLog 获取密码的日志 * @return */ public void addLogIntoRedis(final String pwdLog) { log.info("insert getpwd log into redis:"+pwdLog); try { redisTemplate.opsForList().leftPush("getpwdList", pwdLog); } catch (Exception e) { log.error(e.getMessage()); } }
配置文件
<?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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" 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"> <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxTotal" value="${redis.maxTotal}"></property> <property name="maxIdle" value="${redis.maxIdle}" /> <property name="maxWaitMillis" value="${redis.maxWait}" /> <property name="testOnBorrow" value="${redis.testOnBorrow}" /> </bean> <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:host-name="${redis.host}" p:port="${redis.port}" p:pool-config-ref="poolConfig"/> <bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate"> <property name="connectionFactory" ref="connectionFactory" /> </bean> </beans>
<!-- 引入项目配置文件 --> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:redis.properties</value><!-- 引入redis配置文件 --> <value>classpath:jdbc.properties</value><!-- 定义spring-jdbc配置信息路径 --> </list> </property> </bean> <!-- 自动扫描model,dao和service包(自动注入) --> <context:component-scan base-package="com.ffcs.wlan.model,com.ffcs.wlan.dao,com.ffcs.wlan.service" />