欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

如何在项目中使用redis来实现一些需要的功能实例?

程序员文章站 2022-07-03 16:58:30
...

使用Redis来实现申请布控和一些跟数据库中的数据对比

一、需要使用Jedis的工具类去写一些通用的工具类方法

package com.ia.lhc.redis;
import org.apache.commons.lang3.StringUtils; 
import org.apache.commons.lang3.tuple.*;
//import org.apache.log4j.Logger;  
import redis.clients.jedis.Jedis;  
import redis.clients.jedis.JedisPool;  
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.Transaction;

import java.util.List;  
import java.util.Map;


/** 
 * Redis 工具类 
 */  
public class JedisUtil {


//    protected static Logger logger = Logger.getLogger(JedisUtil.class);  

    //Redis服务器IP  
    private static String ADDR_ARRAY = "localhost";  

    //Redis的端口号  
    private static int PORT = 6379;  

    //访问密码  
//    private static String AUTH = "";

    //可用连接实例的最大数目,默认值为8;  
    //如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。  
    private static int MAX_ACTIVE = 20;  

    //控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。  
    private static int MAX_IDLE = 20;

    //最小空闲连接数, 默认0
    private static int MIN_IDLE=5;

    //等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException;  
    private static int MAX_WAIT = -1;  

    //超时时间  
    private static int TIMEOUT = 10000;

    //连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true
    private static boolean BLOCK_WHEN_EXHAUSTED = false;

    //设置的逐出策略类名, 默认DefaultEvictionPolicy(当连接超过最大空闲时间,或连接数超过最大空闲连接数)
    private static String EVICTION_POLICY_CLASSNAME="org.apache.commons.pool2.impl.DefaultEvictionPolicy";

    //是否启用pool的jmx管理功能, 默认true
    private static boolean JMX_ENABLED=true;

    private static String JMX_NAME_PREFIX="pool";

    //是否启用后进先出, 默认true
    private static boolean LIFO=true;

    //逐出连接的最小空闲时间 默认1800000毫秒(30分钟)
    private static long MIN_EVICTABLE_IDLE_TIME_MILLIS=1800000L;

    //对象空闲多久后逐出, 当空闲时间>该值 且 空闲连接>最大空闲数 时直接逐出,不再根据MinEvictableIdleTimeMillis判断  (默认逐出策略)
    private static long SOFT_MIN_EVICTABLE_IDLE_TIME_MILLIS=1800000L;

    //每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3
    private static int NUM_TESTS_PER_EVICYION_RUN=5;

    //在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;  
    private static boolean TEST_ON_BORROW = false;

    //在空闲时检查有效性, 默认false
    private static boolean TEST_WHILEIDLE=false;

    //逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
    private static long TIME_BERWEEN_EVICTION_RUNS_MILLIS=-1;

    //连接池管理
    private static JedisPool jedisPool = null;  

    /** 
     * redis过期时间,以秒为单位 
     */  
    public final static int EXRP_HOUR = 60 * 60;            //一小时  
    public final static int EXRP_DAY = 60 * 60 * 24;        //一天  
    public final static int EXRP_MONTH = 60 * 60 * 24 * 30; //一个月  

    /** 
     * 初始化Redis连接池 
     */  
    static {  
        try {  
            JedisPoolConfig config = new JedisPoolConfig();
            config.setBlockWhenExhausted(BLOCK_WHEN_EXHAUSTED);
            config.setEvictionPolicyClassName(EVICTION_POLICY_CLASSNAME); 
            config.setJmxEnabled(JMX_ENABLED);
            config.setJmxNamePrefix(JMX_NAME_PREFIX);
            config.setLifo(LIFO);
            config.setMinEvictableIdleTimeMillis(MIN_EVICTABLE_IDLE_TIME_MILLIS);
            config.setMinIdle(MIN_IDLE);
            config.setNumTestsPerEvictionRun(NUM_TESTS_PER_EVICYION_RUN);
            config.setSoftMinEvictableIdleTimeMillis(SOFT_MIN_EVICTABLE_IDLE_TIME_MILLIS);
            config.setTestOnBorrow(TEST_ON_BORROW);
            config.setTestWhileIdle(TEST_WHILEIDLE);
            config.setTimeBetweenEvictionRunsMillis(TIME_BERWEEN_EVICTION_RUNS_MILLIS);
            config.setMaxTotal(MAX_ACTIVE);  
            config.setMaxIdle(MAX_IDLE);  
            config.setMaxWaitMillis(MAX_WAIT);    
            jedisPool = new JedisPool(config, ADDR_ARRAY, PORT, TIMEOUT);  

            System.out.println("connect to redis ok ");
        } catch (Exception e) {  
//            logger.error("First create JedisPool error : " + e);
            System.out.println("Initialize JedisPool error : " + e);
            e.printStackTrace();
        }  
    }  

    /** 
     * 销毁连接池
     * @return void 
     */ 
    public static void end()
    {
        if(null != jedisPool){

            jedisPool.destroy();

            System.out.println("连接池关闭");
        }
    }

    /** 
     * 同步获取Jedis实例 
     * @return Jedis 
     */  
    public static Jedis getJedis() {
        Jedis jedis = null;  
        try {    
            if (jedisPool != null) {    
                jedis = jedisPool.getResource();   
            }  
        } catch (Exception e) {    
//            logger.error("Get jedis error : "+e);  
            System.out.println("getJedis error : "+e);
            e.printStackTrace();
        }

        return jedis;  
    }    

    /** 
     * 释放jedis资源 
     * 
     * @param jedis 
     */  
    public static void returnResource(final Jedis jedis) {  
        if (jedis != null && jedisPool != null) {  
            jedis.close();
//            System.out.println("返回jedis资源!");
        }  
    }  

    /** 
     * 设置 List 
     * 
     * @param key 
     * @param value 
     */  
    public static void setListItem(String key, String value) {

        Jedis resource = null;

        try {

            value = StringUtils.isEmpty(value) ? "" : value; 

            resource = getJedis();

            resource.lpush(key, value);

        } catch (Exception e) { 

//            logger.error("Set key error : " + e); 
            System.out.println("setListItem error : " + e); 
            e.printStackTrace(); 

        } finally{

            if ( resource != null )
            {
                returnResource(resource);
            }
        }
    }  

    /** 
     * 删除 List中的元素 
     * 
     * @param key 
     * @param value 
     */  
    public static void RemListItem(String key, String value) {

        Jedis resource = null;

        try {

            value = StringUtils.isEmpty(value) ? "" : value; 

            resource = getJedis();

            resource.lrem(key, 1, value);

        } catch (Exception e) { 

//            logger.error("Set key error : " + e); 
            System.out.println("RemListItem error : " + e);
            e.printStackTrace(); 

        } finally{

            if ( resource != null )
            {
                returnResource(resource);
            }
        }
    }  

    /** 
     * 获取List值 
     * 
     * @param key 
     * @return value 
     */  
    public static List<String> getListItems(String key) {  

        Jedis resource = null;

        List<String> value = null; 

        try {

            resource = getJedis();

            //如果列表存在,则取出所有
            if (resource.exists(key))
            {
                long len = resource.llen(key);

                value = resource.lrange(key, 0, len-1);     
            }

        } catch (Exception e) {

//          logger.error("Get string error : " + e);
            System.out.println("getListItems error : " + e);
            e.printStackTrace();

        } finally {

            if ( resource != null )
            {
                returnResource(resource);
            }
        }

        return value;  
    }  

    /** 
     * 设置 单条Hash表值
     * 
     * @param key 
     * @param value 
     */  
    public static void setHashItem(String key, Pair<String, String> value) {

        Jedis resource = null;

        try {

            //String pair_val = value.getValue();

            //value.setValue(StringUtils.isEmpty(pair_val) ? "" : pair_val); 

            resource = getJedis();

            resource.hset(key, value.getKey(), value.getValue());

        } catch (Exception e) { 

//            logger.error("Set key error : " + e); 
            System.out.println("setHashItem error : " + e); 
            e.printStackTrace();

        } finally{

            if ( resource != null )
            {
                returnResource(resource);
            }
        }
    }  

    /** 
     * 检查Key是否存在
     * @param key 
     * @return value 
     */  
    public static Boolean ExsitKey(String key) {  

        Jedis resource = null;

        Boolean value = false; 

        try {

            resource = getJedis();

            if (resource.exists(key) )
            {   
                value = true;           
            }

        } catch (Exception e) {

//          logger.error("Get string error : " + e);
            System.out.println("ExsitKey error : " + e);
            e.printStackTrace();

        } finally {

            if ( resource != null )
            {
                returnResource(resource);
            }
        }

        return value;  
    }  

    /** 
     * 设置Key的有效期
     * 
     * @param key       要设置的key
     * @param timestamp 设置的有效期限(unix时间戳)
     */  
    public static void setKeyExpireTime(String key, long timestamp) {

        Jedis resource = null;

        try {

            resource = getJedis();

            resource.expireAt(key, timestamp);

        } catch (Exception e) { 

//            logger.error("Set key error : " + e); 
            System.out.println("setKeyExpireTime error : " + e); 
            e.printStackTrace();

        } finally{

            if ( resource != null )
            {
                returnResource(resource);
            }
        }
    }  

    /** 
     * 删除Key
     * 
     * @param key       要删除的key
     */  
    public static void removeKey(String key) {

        Jedis resource = null;

        try {

            resource = getJedis();

            resource.del(key);            

        } catch (Exception e) { 

//            logger.error("Set key error : " + e); 
            System.out.println("removeKey error : " + e); 
            e.printStackTrace();

        } finally{

            if ( resource != null )
            {
                returnResource(resource);
            }
        }
    }  
    /** 
     * 检查Hash表中对应的field是否存在
     * 
     * @param key 
     * @return value 
     */  
    public static Boolean ExsitHashItem(String key, String field_name) {  

        Jedis resource = null;

        Boolean value = false; 

        try {

            resource = getJedis();

            if (resource.hexists(key, field_name))
            {   
                value = true;           
            }

        } catch (Exception e) {

//          logger.error("Get string error : " + e);
            System.out.println("ExsitHashItem error : " + e);
            e.printStackTrace();

        } finally {

            if ( resource != null )
            {
                returnResource(resource);
            }
        }

        return value;  
    }  

    /** 
     * 获取指定field的值 
     * 
     * @param key 
     * @return value 
     */  
    public static String getHashItem(String key, String field_name) {  

        Jedis resource = null;

        String value = null; 

        try {

            resource = getJedis();

            value = resource.hget(key, field_name);

        } catch (Exception e) {

//          logger.error("Get string error : " + e);
            System.out.println("getHashItem error : " + e);
            e.printStackTrace();

        } finally {

            if ( resource != null )
            {
                returnResource(resource);
            }
        }

        return value;  
    }  

    /** 
     * 设置 多条Hash表值
     * 
     * @param key 
     * @param value 
     */  
    public static void setHashItems(String key, Map<String, String> value) {

        Jedis resource = null;

        try {

            resource = getJedis();

            resource.hmset(key, value);

        } catch (Exception e) { 

//            logger.error("Set key error : " + e); 
            System.out.println("setHashItems error : " + e); 
            e.printStackTrace();

        } finally{

            if ( resource != null )
            {
                returnResource(resource);
            }
        }
    }  


    /** 
     * 获取所有field的值 
     * 
     * @param key 
     * @return value 
     */  
    public static Map<String, String> getHashItems(String key) {  

        Jedis resource = null;

        Map<String, String> value = null; 

        try {

            resource = getJedis();

            value = resource.hgetAll(key);

        } catch (Exception e) {

//          logger.error("Get string error : " + e);
            System.out.println("getHashItems error : " + e);
            e.printStackTrace();

        } finally {

            if ( resource != null )
            {
                returnResource(resource);
            }
        }

        return value;  
    }  

    /** 
     * 设置布控信息的事务;
     * 
     * @param key 
     * @param value 
     */  
    public static void setEvents(String Listkey, String HashKey, Map<String,String> HashValue, long timestamp) {

        Jedis resource = null;

        try {
            resource = getJedis();

            Transaction transaction = resource.multi();

            transaction.hmset(HashKey, HashValue);

            transaction.expireAt(HashKey, timestamp);

            transaction.lpush(Listkey, HashKey);

            transaction.exec();

        } catch (Exception e) { 

//            logger.error("Set key error : " + e); 
            System.out.println("setEvents error : " + e); 
            e.printStackTrace();

        } finally{

            if ( resource != null )
            {
                returnResource(resource);
            }
        }
    }  

    /** 
     * 删除布控信息的事务;
     * 
     * @param key 
     * @param value 
     */  
    public static void removeEvents(String Listkey, String HashKey) {

        Jedis resource = null;

        try {
            resource = getJedis();

            Transaction transaction = resource.multi();

            transaction.del(HashKey);

            transaction.lrem(Listkey, 1, HashKey);

            transaction.exec();

        } catch (Exception e) { 

//            logger.error("Set key error : " + e); 
            System.out.println("removeEvents error : " + e); 
            e.printStackTrace();

        } finally{

            if ( resource != null )
            {
                returnResource(resource);
            }
        }
    }  
}

二、然后是新建一个Redis包在哪个项目的功能模块中使用的时候就直接用spring给注入,然后调用方法就行了,一般都是在controller中去调用这些封装好的Redis功能接口

package com.ia.lhc.redis;
import java.util.Date;
import java.text.SimpleDateFormat;
import org.apache.commons.lang3.tuple.*;
import java.util.Map;
import java.util.HashMap;
import java.util.List;

public class VehicleInfoCompare {

    //首次入城判定时间区间(30天) 
    private final static int FirstEntryTimeSection = 30; 

    //车辆过车记录Hash表名称
    private final static String vehiclePassRecords = "vehiclePassRecords";

    //车辆过车记录Hash表名称
    private final static String vehicleFirstEntryRecords = "vehicleFirstEntryRecords";

    //维稳布控列表名称
    private final static String StabilityItems = "StabilityItems";

    //精准车牌布控列表名称
    private final static String ExactPlateItems = "ExactPlateItems";

    //模糊车牌布控列表名称
    private final static String BlurPlateItems = "BlurPlateItems";

    //车型布控列表名称
    private final static String VehicleTypeItems = "VehicleTypeItems";

    //车辆类别布控列表名称
    private final static String VehicleKindItems = "VehicleKindItems";

     /** 
     * 得到两个日期时间相差的天数
     * @param   lastUpdateDate  之前的日期时间(YYYY-MM-DD)
     * @param   currentDate     之后的日期时间(YYYY-MM-DD)
     * @return  long    两个日期时间相差的天数
     */
    private static long daysOfTwoDates(String lastUpdateDate, String currentDate) {


         long days = 0;

         try {

            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            //跨年不会出现问题
            //如果时间为:2016-03-18 11:59:59 和 2016-03-19 00:00:01的话差值为 0

            Date fDate=sdf.parse(lastUpdateDate);

            Date oDate=sdf.parse(currentDate);

            days=(oDate.getTime()-fDate.getTime())/(1000*3600*24);

         } catch (Exception e){

             System.out.println("daysOfTwoDates error : " + e);

             e.printStackTrace();
         }

         return days;
    }

    /**
     * 日期格式字符串转换成时间戳
     * @param dateStr 字符串日期
     * @param format   如:yyyy-MM-dd HH:mm:ss
     * @return long Unix时间戳
     */
    private static long Date2TimeStamp(String dateStr) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            return sdf.parse(dateStr).getTime() / 1000;
        } catch (Exception e) {

            System.out.println("Date2TimeStamp error : " + e);

            e.printStackTrace();
        }
        return 0;
    }

    /** 
     * 判断时间是否在时间段内 
     *  
     * @param date 
     *            当前时间 yyyy-MM-dd HH:mm:ss 
     * @param strDateBegin 
     *            开始时间 00:00:00 
     * @param strDateEnd 
     *            结束时间 00:05:00 
     * @return 
     */  
    private static boolean isInTimeSection(String strDate, String strDateBegin,   String strDateEnd) 
    {  
        // 截取当前时间时分秒  
        int strDateH = Integer.parseInt(strDate.substring(11, 13));  
        int strDateM = Integer.parseInt(strDate.substring(14, 16));  
        int strDateS = Integer.parseInt(strDate.substring(17, 19));  
        // 截取开始时间时分秒  
        int strDateBeginH = Integer.parseInt(strDateBegin.substring(0, 2));  
        int strDateBeginM = Integer.parseInt(strDateBegin.substring(3, 5));  
        int strDateBeginS = Integer.parseInt(strDateBegin.substring(6, 8));  
        // 截取结束时间时分秒  
        int strDateEndH = Integer.parseInt(strDateEnd.substring(0, 2));  
        int strDateEndM = Integer.parseInt(strDateEnd.substring(3, 5));  
        int strDateEndS = Integer.parseInt(strDateEnd.substring(6, 8));  
        if ((strDateH >= strDateBeginH && strDateH <= strDateEndH)) {  
            // 当前时间小时数在开始时间和结束时间小时数之间  
            if (strDateH > strDateBeginH && strDateH < strDateEndH) {  
                return true;  
                // 当前时间小时数等于开始时间小时数,分钟数在开始和结束之间  
            } else if (strDateH == strDateBeginH && strDateM >= strDateBeginM  
                    && strDateM <= strDateEndM) {  
                return true;  
                // 当前时间小时数等于开始时间小时数,分钟数等于开始时间分钟数,秒数在开始和结束之间  
            } else if (strDateH == strDateBeginH && strDateM == strDateBeginM  
                    && strDateS >= strDateBeginS && strDateS <= strDateEndS) {  
                return true;  
            }  
            // 当前时间小时数大等于开始时间小时数,等于结束时间小时数,分钟数小等于结束时间分钟数  
            else if (strDateH >= strDateBeginH && strDateH == strDateEndH  
                    && strDateM <= strDateEndM) {  
                return true;  
                // 当前时间小时数大等于开始时间小时数,等于结束时间小时数,分钟数等于结束时间分钟数,秒数小等于结束时间秒数  
            } else if (strDateH >= strDateBeginH && strDateH == strDateEndH  
                    && strDateM == strDateEndM && strDateS <= strDateEndS) {  
                return true;  
            } else {  
                return false;  
            }  
        } else {  
            return false;  
        }  
    }
     /** 
     *判断是否为首次入城车辆
     * @param   key 历史过车记录Hash表
     * @param   vehicleID   本次过车记录中的车辆ID
     * @param   captureTime 本次过车记录中的过车时间
     * @return  Boolean true(判断为首次入城车辆) false(判断为非首次入城车辆)
     */
    private static boolean IsFirstEntryCity(String key, String vehicleID, String captureTime)
    {
        boolean ret = false;

        try {
            //当前传入车牌是否在历史过车记录中,如果存在,则取出该车辆上一次过车时间。
            if ( JedisUtil.ExsitHashItem(key, vehicleID) )
            {
                String lastUpdateTime = JedisUtil.getHashItem(key, vehicleID);

                //判断本次过车时间与上一次过车时间相比相差是否超过一定时间(暂定30天),如果超过,则判定为首次入城
                if (  daysOfTwoDates(lastUpdateTime, captureTime) >= FirstEntryTimeSection )
                {
                    ret = true;
                }
            }
            //如果在过车历史记录中不存在,则也判定为首次入城。
            else
            {
                ret = true;
            }

        } catch ( Exception e) {

            System.out.println("IsFirstEntryCity error : " + e);

            e.printStackTrace();

        } finally {

            Pair<String, String> value = new ImmutablePair<String, String>(vehicleID, captureTime);

            JedisUtil.setHashItem(key, value);
        }
        return ret;
    }

     /** 
     * 更新首次入城车辆记录
     * @param   key 首次入城记录Hash表
     * @param   vehicleID   本次过车记录中的车辆ID
     * @param   captureTime 本次过车记录中的过车时间
     * @return  void
     */
    private static void UpdateFirstEntryCityRecord(String vehicleID, String captureTime)
    {

        try {
            if (IsFirstEntryCity(vehiclePassRecords, vehicleID, captureTime))
            {
                Pair<String, String> value =  new ImmutablePair<String, String>(vehicleID, captureTime);

                JedisUtil.setHashItem(vehicleFirstEntryRecords, value);
            }
        } catch ( Exception e ) {

            System.out.println("UpdateFirstEntryCityRecord error : " + e);

            e.printStackTrace();
        }
    }

     /** 
     * 比对碰撞分析(精准号牌布控、模糊号牌布控)
     * @param   vehicleID   本次过车记录中的车辆ID(格式为:车牌颜色-车牌号码)
     * @param   captureTime 本次过车记录中的过车时间
     * @param   bayonetID   本次过车记录中的过车卡口ID
     * @return  Map<String, String> key:布控编号  value:布控方式
     */
    public static Map<String, String> GetAlarmInfoByLicenseNumber(String vehicleID, String captureTime, String bayonetID)
    {
        long startTime=System.currentTimeMillis();
        Map<String, String> retval = new HashMap<String, String>();

        List<String>    listExactPlateItems = null;     //精确号牌布控列表
        List<String>    listBlurPlateItems = null;      //模糊号牌布控列表

        try {
            //1. 判断比较精准号牌布控信息
            listExactPlateItems = JedisUtil.getListItems(ExactPlateItems);

            if ( listExactPlateItems != null )
            {
                //遍历所有的精准号牌布控信息
                for ( String item : listExactPlateItems )
                {               
                    //如果列表中的精准号牌信息有效,则进行比较判断
                    if ( JedisUtil.ExsitKey(item) )
                    {
                        Map<String, String> ExactPlateItem = JedisUtil.getHashItems(item);

                        //取得精准号牌布控信息中的布控卡口列表信息,然后比较当前卡口是否在该列表中
                        String bayonetIDList = ExactPlateItem.get("bayonetID");
                        if ( bayonetIDList != null && bayonetIDList.indexOf(bayonetID) >= 0)
                        {
                            //取得布控信息中的布控起始日期,然后判断本次过车时间是否是在布控起始日期之后
                            String BeginDate = ExactPlateItem.get("startdate");                     
                            if ( BeginDate != null && daysOfTwoDates(BeginDate, captureTime.substring(0, 10)) >= 0 )
                            {
                                 String BeginTime = ExactPlateItem.get("starttime");
                                 String EndTime = ExactPlateItem.get("endtime");

                                 //如取得布控信息中的布控起始和终止时间,判断过车时间是不是在该时间区间内,若是,则继续判断车牌号码信息
                                 if ( BeginTime != null && EndTime != null && isInTimeSection(captureTime, BeginTime, EndTime))
                                 {
                                     String vlpList = ExactPlateItem.get("platenumbers");

                                     //取得布控信息中的车牌号码列表,判断过车信息中的车牌号码是否在其中,若在,则保存报警信息。
                                     if ( vlpList != null && vlpList.indexOf(vehicleID) >= 0 )
                                     {
                                         //将此条过车警报信息对应的布控信息保存到返回结果之中。
                                         retval.put(item, "0");
                                     }
                                 }
                            }

                        }   
                    }
                    //如果列表中的精准号牌信息无效,则从列表中删除之
                    else
                    {
                        JedisUtil.RemListItem(ExactPlateItems, item);

                    }           
                }
            }

            //2. 判断比较模糊号牌布控信息
            listBlurPlateItems = JedisUtil.getListItems(BlurPlateItems);

            if (listBlurPlateItems != null)
            {
                for ( String item : listBlurPlateItems )
                {   
                    if ( JedisUtil.ExsitKey(item) )
                    {
                        Map<String, String> BlurPlateItem = JedisUtil.getHashItems(item);

                        //取得精准号牌布控信息中的布控卡口列表信息,然后比较当前卡口是否在该列表中
                        String bayonetIDList = BlurPlateItem.get("bayonetID");
                        if ( bayonetIDList != null && bayonetIDList.indexOf(bayonetID) >= 0)
                        {
                            //取得布控信息中的布控起始日期,然后判断本次过车时间是否是在布控起始日期之后
                            String BeginDate = BlurPlateItem.get("startdate");                      
                            if ( BeginDate != null && daysOfTwoDates(BeginDate, captureTime.substring(0, 10)) >= 0 )
                            {
                                 String BeginTime = BlurPlateItem.get("starttime");
                                 String EndTime = BlurPlateItem.get("endtime");

                                 //如取得布控信息中的布控起始和终止时间,判断过车时间是不是在该时间区间内,若是,则继续判断车牌号码信息
                                 if ( BeginTime != null && EndTime != null && isInTimeSection(captureTime, BeginTime, EndTime))
                                 {
                                     String vlpList = BlurPlateItem.get("platenumbers");

                                     if ( vlpList == null )
                                     {
                                         continue;
                                     }

                                     String vlpinfo[] = vlpList.split("\\|");

                                     //遍历所有模糊号牌
                                     for ( String str : vlpinfo )
                                     {
                                         //生成正则表达式
                                         str = str.replaceAll("\\*", "\\.\\*");

                                         //匹配本次过车记录中的车牌号码,若匹配,则将报警信息保存,然后结束本条布控信息的比对。
                                         if ( vehicleID.matches(str) )
                                         {
                                            //将此条过车警报信息对应的布控信息保存到返回结果之中。
                                             retval.put(item, "1");

                                             break;
                                         }

                                     }
                                 }
                            }
                        }
                    }   
                }
            }
        } catch ( Exception e ){

            System.out.println("GetAlarmInfoByLicenseNumber error : " + e);

            e.printStackTrace();
        }

        long endTime=System.currentTimeMillis();

        System.out.println("GetAlarmInfoByLicenseNumber执行时间:"+(endTime-startTime)+"ms");

        return retval;
    }
     /** 
     * 比对碰撞分析(维稳布控、车型布控、车辆类别布控)
     * @param   vehicleID   本次过车记录中的车辆ID(格式为:车牌颜色-车牌号码)
     * @param   captureTime 本次过车记录中的过车时间
     * @param   bayonetID   本次过车记录中的过车卡口ID
     * @param   vBrand      本次过车记录中的车辆品牌
     * @param   vSubBrand   本次过车记录中的车辆子品牌
     * @param   vMode       本次过车记录中的车辆年款
     * @param   vType       本次过车记录中的车辆 类别
     * @return  Map<String, String> key:TrapID(布控编号)  value:布控方式
     */
    public static Map<String, String> GetAlarmInfoByOthers(String vehicleID, String captureTime, String bayonetID, int vBrand, int vSubBrand, int vModel, int vType, int hideFace)
    {
        long startTime=System.currentTimeMillis();
        Map<String, String> retval = new HashMap<String, String>();

        List<String>    listStabilityItems = null;      //维稳布控列表
        List<String>    listVehicleTypeItems = null;    //车辆类型布控列表
        List<String>    listVehicleKindItems = null;    //车辆类别布控列表

        try {
            //1. 根据卡口数据更新首次入城信息
            UpdateFirstEntryCityRecord(vehicleID, captureTime);

            //2. 判断比较维稳布控信息
            listStabilityItems = JedisUtil.getListItems(StabilityItems);

            if (listStabilityItems != null)
            {
                for ( String item : listStabilityItems )
                {   
                    if ( JedisUtil.ExsitKey(item) )
                    {
                        Map<String, String> StabilityItem = JedisUtil.getHashItems(item);

                        //取得精准号牌布控信息中的布控卡口列表信息,然后比较当前卡口是否在该列表中
                        String bayonetIDList = StabilityItem.get("bayonetID");
                        if ( bayonetIDList != null && bayonetIDList.indexOf(bayonetID) >= 0)
                        {
                            //取得布控信息中的布控起始日期,然后判断本次过车时间是否是在布控起始日期之后
                            String BeginDate = StabilityItem.get("startdate");                      
                            if ( BeginDate != null && daysOfTwoDates(BeginDate, captureTime.substring(0, 10)) >= 0 )
                            {
                                 String BeginTime = StabilityItem.get("starttime");
                                 String EndTime = StabilityItem.get("endtime");

                                 //如取得布控信息中的布控起始和终止时间,判断过车时间是不是在该时间区间内,若是,则继续判断车牌号码信息
                                 if ( BeginTime != null && EndTime != null && isInTimeSection(captureTime, BeginTime, EndTime))
                                 {
                                     String vlpstate = StabilityItem.get("platestate");

                                     String vlpinfo = StabilityItem.get("platenumber");

                                     //布控信息存在错误时,则跳过此条布控信息
                                     if ( vlpstate == null || vlpinfo == null )
                                     {
                                         continue;
                                     }

                                     int pstate = Integer.parseInt(vlpstate);
                                    //布控信息中为精确号牌时,比较车牌是否一致,不一致继续处理下一条布控信息
                                     if ( 0 == pstate && !vehicleID.equals(vlpinfo) )
                                     {
                                         continue;
                                     }

                                    //布控信息中为模糊号牌时,比较车牌是否匹配,不匹配继续处理下一条布控信息
                                     if ( 1 == pstate )
                                     {
                                         String vlpregx = vlpinfo.replaceAll("\\*", "\\.\\*");

                                         if ( !vehicleID.matches(vlpregx) )
                                         {
                                             continue;
                                         }
                                     }

                                     String ebstr = StabilityItem.get("exceptionbehavior");
                                    //布控信息存在错误时,则跳过此条布控信息
                                     if ( ebstr == null )
                                     {
                                         continue;
                                     }

                                     int ebint = Integer.parseInt(ebstr);

                                     //布控信息中遮挡面部被设定
                                     if ( ebint % 2 == 1 )
                                     {
                                        //本次过车记录中未遮挡面部的场合,则继续匹配下一条布控信息
                                        if ( hideFace != 1)
                                        {
                                            continue;
                                        }
                                     }

                                     //布控信息中首次入城被设定
                                     if ( ebint/2 == 1 )
                                     {
                                         //取得最新判定为首次入城的时间
                                         String fectime = JedisUtil.getHashItem(vehicleFirstEntryRecords, vehicleID);

                                         //如果没有判定过首次入城,或者被判定为首次入城的时间早于布控开始日期,则中止,然后继续匹配下一条布控信息
                                         if ( (null == fectime) || (daysOfTwoDates(BeginDate, fectime.substring(0, 10)) < 0) )
                                         {
                                             continue;
                                         }
                                     }

                                     String vbstr = StabilityItem.get("vBrand");
                                     String vsbstr = StabilityItem.get("vSubBrand");
                                     String vmstr = StabilityItem.get("vModel");

                                    //布控信息存在错误时,则跳过此条布控信息
                                     if ( vbstr == null || vsbstr == null || vmstr == null )
                                     {
                                         continue;
                                     }

                                     int vbint = Integer.parseInt(vbstr);                                                                            
                                     int vsbint = Integer.parseInt(vsbstr);                              
                                     int vmint = Integer.parseInt(vmstr);

                                     //如果布控条件中未设定品牌(子品牌、年款),或设定的品牌(子品牌、年款)与本次过车记录中的数据不相同,则中止,然后继续匹配下一条布控信息
                                     if ( (vbint != 0 && vbint != vBrand) || (vsbint != 0 && vsbint != vSubBrand) || (vmint != 0 && vmint != vModel))
                                     {
                                         continue;
                                     }

                                    //将此条过车警报信息对应的布控信息保存到返回结果之中。
                                     retval.put(item, "2");
                                 }
                            }
                        }
                    }   
                }
            }

            //3. 判断比较车辆类型布控信息
            listVehicleTypeItems = JedisUtil.getListItems(VehicleTypeItems);

            if (listVehicleTypeItems != null)
            {
                for ( String item : listVehicleTypeItems )
                {   
                    if ( JedisUtil.ExsitKey(item) )
                    {
                        Map<String, String> VehicleTypeItem = JedisUtil.getHashItems(item);

                        //取得精准号牌布控信息中的布控卡口列表信息,然后比较当前卡口是否在该列表中
                        String bayonetIDList = VehicleTypeItem.get("bayonetID");
                        if ( bayonetIDList != null && bayonetIDList.indexOf(bayonetID) >= 0)
                        {
                            //取得布控信息中的布控起始日期,然后判断本次过车时间是否是在布控起始日期之后
                            String BeginDate = VehicleTypeItem.get("startdate");                        
                            if ( BeginDate != null && daysOfTwoDates(BeginDate, captureTime.substring(0, 10)) >= 0 )
                            {
                                 String BeginTime = VehicleTypeItem.get("starttime");
                                 String EndTime = VehicleTypeItem.get("endtime");

                                 //如取得布控信息中的布控起始和终止时间,判断过车时间是不是在该时间区间内,若是,则继续判断车牌号码信息
                                 if ( BeginTime != null && EndTime != null && isInTimeSection(captureTime, BeginTime, EndTime))
                                 {                               
                                     String vbstr = VehicleTypeItem.get("vBrand");                                   
                                     String vsbstr = VehicleTypeItem.get("vSubBrand");                                   
                                     String vmstr = VehicleTypeItem.get("vModel");
                                    //布控信息存在错误时,则跳过此条布控信息
                                     if ( vbstr == null || vsbstr == null || vmstr == null )
                                     {
                                         continue;
                                     }

                                     int vbint = Integer.parseInt(vbstr);                                    
                                     int vsbint = Integer.parseInt(vsbstr);                                  
                                     int vmint = Integer.parseInt(vmstr);

                                     //如果布控条件中未设定品牌(子品牌、年款),或设定的品牌(子品牌、年款)与本次过车记录中的数据不相同,则中止,然后继续匹配下一条布控信息
                                     if ( (vbint != 0 && vbint != vBrand) || (vsbint != 0 && vsbint != vSubBrand) || (vmint != 0 && vmint != vModel))
                                     {
                                         continue;
                                     }

                                     String vlpinfo = VehicleTypeItem.get("platenumber");

                                     //如果设定了模糊车牌信息,则判断本次过车数据中的车牌信息是否匹配布控信息中的模糊车牌
                                     if ( vlpinfo != null && vlpinfo.length() > 0 )
                                     {
                                         String vlpregx = vlpinfo.replaceAll("\\*", "\\.\\*");

                                         if ( ! vehicleID.matches(vlpregx) )
                                         {
                                             continue;
                                         }
                                     }
                                     //将此条过车警报信息对应的布控信息保存到返回结果之中。
                                     retval.put(item, "3");
                                 }
                            }
                        }
                    }   
                }
            }
            //4. 判断比较车辆类别布控信息
            listVehicleKindItems = JedisUtil.getListItems(VehicleKindItems);

            if ( listVehicleKindItems != null )
            {
                for ( String item : listVehicleKindItems )
                {   
                    if ( JedisUtil.ExsitKey(item) )
                    {
                        Map<String, String> VehicleKindItem = JedisUtil.getHashItems(item);

                        //取得精准号牌布控信息中的布控卡口列表信息,然后比较当前卡口是否在该列表中
                        String bayonetIDList = VehicleKindItem.get("bayonetID");
                        if ( bayonetIDList != null && bayonetIDList.indexOf(bayonetID) >= 0)
                        {
                            //取得布控信息中的布控起始日期,然后判断本次过车时间是否是在布控起始日期之后
                            String BeginDate = VehicleKindItem.get("startdate");                        
                            if ( BeginDate != null && daysOfTwoDates(BeginDate, captureTime.substring(0, 10)) >= 0 )
                            {
                                 String BeginTime = VehicleKindItem.get("starttime");
                                 String EndTime = VehicleKindItem.get("endtime");

                                 //如取得布控信息中的布控起始和终止时间,判断过车时间是不是在该时间区间内,若是,则继续判断车牌号码信息
                                 if ( BeginTime != null && EndTime != null && isInTimeSection(captureTime, BeginTime, EndTime))
                                 {                               
                                     String vbstr = VehicleKindItem.get("vBrand");                               
                                     String vtypestr = VehicleKindItem.get("vType");
                                    //布控信息存在错误时,则跳过此条布控信息
                                     if ( vbstr == null || vtypestr == null )
                                     {
                                         continue;
                                     }

                                     int vbint = Integer.parseInt(vbstr);                                    
                                     int vtypeint = Integer.parseInt(vtypestr);

                                     //如果布控条件中未设定品牌或类型,或设定的品牌类型与本次过车记录中的数据不相同,则中止,然后继续匹配下一条布控信息
                                     if ( (vbint != 0 && vbint != vBrand) || (vtypeint != 0 && vtypeint != vType))
                                     {
                                         continue;
                                     }

                                     String vlpinfo = VehicleKindItem.get("platenumber");

                                     //如果设定了模糊车牌信息,则判断本次过车数据中的车牌信息是否匹配布控信息中的模糊车牌
                                     if ( vlpinfo != null && vlpinfo.length() > 0 )
                                     {
                                         String vlpregx = vlpinfo.replaceAll("\\*", "\\.\\*");

                                         if ( ! vehicleID.matches(vlpregx) )
                                         {
                                             continue;
                                         }
                                     }
                                     //将此条过车警报信息对应的布控信息保存到返回结果之中。
                                     retval.put(item, "4");
                                 }
                            }
                        }
                    }   
                }
            }
        } catch ( Exception e ){

            System.out.println("GetAlarmInfoByOthers error : " + e);

            e.printStackTrace();
        }

        long endTime=System.currentTimeMillis();

        System.out.println("GetAlarmInfoByOthers执行时间:"+(endTime-startTime)+"ms");

        return retval;
    }

     /** 
     * 取得布控信息
     * @param   trapID  布控编号
     * @return  Map<String, String> key:布控数据项名称  value:布控数据项值
     */
    public static Map<String, String> GetTrapInfo(String trapID)
    {   
        Map<String, String> retval = new HashMap<String, String>();

        try {

            if ( JedisUtil.ExsitKey(trapID))
            {
                retval = JedisUtil.getHashItems(trapID);
            }

        } catch (Exception e) {

            System.out.println("GetTrapInfo error : " + e);

            e.printStackTrace();
        }

        return retval;
    }

    /** 
     * 添加布控信息
     * @param   trapID      布控编号
     * @param   trapKind    布控方式
     * @param   trapInfo    布控详细信息
     * @return  boolean true:添加成功  false:添加失败
     */
    public static boolean AddTrapInfo(String trapID, String trapKind, Map<String,String> trapInfo)
    {   
        boolean retval = false;
        long startTime=System.currentTimeMillis();

        try {
            //计算出本次布控到期的时间戳信息
            String dateinfo = trapInfo.get("enddate");
            String timeinfo = trapInfo.get("endtime");
            String datetime = dateinfo + " " + timeinfo;
            long timestamp = Date2TimeStamp(datetime);

            String ListKey = null;

            //精准号牌布控的场合,将布控编码追加到精准号牌布控信息列表中
            if ( "0" == trapKind )
            {
                ListKey = ExactPlateItems;

            }
            //模糊号牌布控的场合,将布控编码追加到模糊号牌布控信息列表中
            else if ( "1" == trapKind)
            {
                ListKey = BlurPlateItems;

            }
            //维稳布控的场合,将布控编码追加到维稳布控信息列表中
            else if ( "2" == trapKind)
            {
                ListKey = StabilityItems;

            }
            //车型布控的场合,将布控编码追加到车型布控信息列表中
            else if ( "3" == trapKind)
            {
                ListKey = VehicleTypeItems;

            }
            //车辆类别布控的场合,将布控编码追加到车辆类别布控信息列表中
            else if ( "4" == trapKind)
            {
                ListKey = VehicleKindItems;
            }

            //执行事务处理(1,设定布控详细信息的Hash表;2,设定Hash表的有效期;3,将Hash表的Key追加到对应的List列表中;
            JedisUtil.setEvents(ListKey, trapID, trapInfo, timestamp);

            retval = true;

        } catch (Exception e) {

            System.out.println("AddTrapInfo error : " + e);

            e.printStackTrace();
        }

        long endTime=System.currentTimeMillis();

        System.out.println("AddTrapInfo执行时间:"+(endTime-startTime)+"ms");
        return retval;
    }

    /** 
     * 删除布控信息
     * @param   trapID  布控编号
     * @param   trapKind    布控方式
     * @return  boolean true:删除成功  false:删除失败
     */
    public static boolean RemoveTrapInfo(String trapID, String trapKind)
    {   
        boolean retval = false;

        try {       
            String ListKey = null;

            //精准号牌布控的场合,将布控编码从精准号牌布控信息列表中删除
            if ( "0" == trapKind )
            {
                ListKey = ExactPlateItems;

            }
            //模糊号牌布控的场合,将布控编码从模糊号牌布控信息列表中删除
            else if ( "1" == trapKind)
            {
                ListKey = BlurPlateItems;

            }
            //维稳布控的场合,将布控编码从维稳布控信息列表中删除
            else if ( "2" == trapKind)
            {
                ListKey = StabilityItems;

            }
            //车型布控的场合,将布控编码从车型布控信息列表中删除
            else if ( "3" == trapKind)
            {
                ListKey = VehicleTypeItems;

            }
            //车辆类别布控的场合,将布控编码从车辆类别布控信息列表中删除
            else if ( "4" == trapKind)
            {
                ListKey = VehicleKindItems;
            }

            JedisUtil.removeEvents(ListKey, trapID);

        } catch (Exception e) {

            System.out.println("RemoveTrapInfo error : " + e);

            e.printStackTrace();
        }

        return retval;
    }
}
相关标签: redis