• 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" />
  • 相关阅读:
    ZUCC2129 The Tree of Power(树形DP)
    ZUCC Flower Name(01字典树)
    JDBC 测试01
    CF1355E Restorer Distance(三分)
    CF1352E Special Permutation(桶排序+前缀和)
    CF1350E Orac and Game of Life(BFS)
    CF1350D Orac and Medians(找规律)
    Python机器学习(五十七)SciPy 积分
    Python机器学习(五十六)SciPy fftpack(傅里叶变换)
    Python机器学习(五十五)SciPy 常量
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/5126015.html
Copyright © 2020-2023  润新知