zoukankan      html  css  js  c++  java
  • redisTemplate 操作

    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" />
  • 相关阅读:
    hdu 4002 Find the maximum
    hdu 2837 坑题。
    hdu 3123
    zoj Treasure Hunt IV
    hdu 2053 Switch Game 水题一枚,鉴定完毕
    poj 1430 Binary Stirling Numbers
    hdu 3037 Saving Beans
    hdu 3944 dp?
    南阳oj 求N!的二进制表示最低位的1的位置(从右向左数)。
    fzu 2171 防守阵地 II
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/5126015.html
Copyright © 2011-2022 走看看