PlanScheduleRedisService.java 3.72 KB
package com.bsth.redis;

import com.bsth.entity.SchedulePlanInfo;
import com.bsth.redis.util.RedisUtils;
import com.bsth.repository.SchedulePlanInfoRepository;
import com.bsth.util.ConvertUtil;
import com.google.common.collect.ArrayListMultimap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * 计调的 计划排班redis缓存
 * Created by panzhao on 2017/3/27.
 */
@Service
@Order(6)
public class PlanScheduleRedisService implements CommandLineRunner {

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    SchedulePlanInfoRepository planInfoRepository;

    @Autowired
    RedisUtils redisUtils;

    static Logger logger = LoggerFactory.getLogger(PlanScheduleRedisService.class);

    private final static String REDIS_KEY_PREFIX = "plan:";

    /**
     * 将一批计划写入redis
     *
     * @param list
     */
    public void wirte(List<SchedulePlanInfo> list) {
        ArrayListMultimap<String, SchedulePlanInfo> multimap;
        try {
            if (list.size() == 0)
                return;
            //按日期和线路分组数据
            Class clazz = SchedulePlanInfo.class;
            multimap = new ConvertUtil().groupMultiList(list, ":", clazz.getDeclaredField("xlBm"), clazz.getDeclaredField("scheduleDate"));

            //写入redis
            Iterator<String> iterator = multimap.keySet().iterator();
            String key;
            while (iterator.hasNext()) {
                key = iterator.next();
                replace(key, multimap.get(key));
            }
        } catch (Exception e) {
            logger.error("", e);
        }
    }

    /**
     * 将 list 与redis里的数据合并
     *
     * @param key
     * @param list
     */
    public void mergeData(String key, List<SchedulePlanInfo> list) {
        key = REDIS_KEY_PREFIX + key.replaceAll("-", "");

        ListOperations<String, SchedulePlanInfo> ops = redisTemplate.opsForList();
        List<SchedulePlanInfo> cacheList = ops.range(key, 0, -1);

        for (SchedulePlanInfo plan : cacheList) {
            if (!list.contains(plan))
                list.add(plan);
        }

        //更新
        redisTemplate.execute(redisUtils.getUpdateCallback(key, list));
    }

    /**
     * 覆盖数据
     *
     * @param key
     * @param list
     */
    public void replace(String key, List<SchedulePlanInfo> list) {
        key = REDIS_KEY_PREFIX + key.replaceAll("-", "");
        redisTemplate.execute(redisUtils.getUpdateCallback(key, list));
    }

    /**
     * 根据日期和线路编码从redis获取计划
     *
     * @param dateStr
     * @param lineCode
     * @return
     */
    public List<SchedulePlanInfo> read(String dateStr, String lineCode) {
        return redisTemplate.opsForList().range(REDIS_KEY_PREFIX + lineCode + ":" + dateStr, 0, -1);
    }

    @Override
    public void run(String... strings) throws Exception {

    }

    public List<SchedulePlanInfo> findByMultiLine(List<String> lineArray, String rq) {
        rq = rq.replaceAll("-", "");
        List<SchedulePlanInfo> rs = new ArrayList<>();
        for (String lineCode : lineArray) {
            rs.addAll(read(rq, lineCode));
        }
        return rs;
    }

    private void delete(String lineCode, String rq) {
        String key = REDIS_KEY_PREFIX + (lineCode + ":" + rq).replaceAll("-", "");
        redisTemplate.delete(key);
    }
}