利用redis处理平均算法

来源:互联网 发布:android模拟器for mac 编辑:程序博客网 时间:2024/06/05 23:39
package com;import java.util.ArrayList;import java.util.Arrays;import java.util.Collections;import java.util.HashMap;import java.util.HashSet;import java.util.List;import java.util.Map;import java.util.Set;import org.apache.commons.collections.CollectionUtils;import com.wef.jedis.service.RedisCacheService;import redis.clients.jedis.Jedis;import redis.clients.jedis.Transaction;public class Test {private final String CACHE_KEY_PREFIX="KEY";private final long EXCEPT_ID=-1L;private final int DEFAULT_TIME=60*30;    private RedisCacheService redisCacheService;public void test() {List<String> codes=Arrays.asList("1","2","3");Map<String,List<MyObject>> objectMap=getObjectMapFromSql(codes);for(String code:codes){testByCode(code,objectMap);}}/** * Title: getObjectMapFromSql <br> * Description: 模拟取值  <br> * @param codes * @return    设定文件  <br> * Map<String,List<Object>>    返回类型  <br> * @throws */private Map<String,List<MyObject>> getObjectMapFromSql(List<String> codes){Map<String,List<MyObject>> objectMap = new HashMap<String, List<MyObject>>();if(CollectionUtils.isNotEmpty(codes)){//取值,一个code对应一组值,其中每组值都有可能有不同优先级的数据,每个优先级又有可能有不同数据//造数过程略}return objectMap;} /** * Title: testByCode <br> * Description: 轮询  <br> * @param code * @param objectMap    设定文件  <br> * void    返回类型  <br> * @throws */private void testByCode(String code,Map<String,List<MyObject>> objectMap){if(objectMap==null||!objectMap.containsKey(code)){return;}List<MyObject> objectList=objectMap.get(code);if(CollectionUtils.isEmpty(objectList)){return;}List<Integer> priorityList=getPrioritys(objectList);if(CollectionUtils.isEmpty(priorityList)){return;}MyObject matchObject=null;Long firstId=null;for(Integer priority:priorityList){firstId=null;List<MyObject> priorityObjectList=getListByPriority(objectList,priority);int max=priorityObjectList.size();while(true){//设定最大次数,最大次数为本区域本优先级设备总数,防止缓存异常造成死循环if(max<=0){break;}Long objectId=getOneFromCache(code,priority,priorityObjectList); if(objectId==null){break;}//double check,防止缓存异常造成死循环if(firstId!=null&&firstId.longValue()==objectId.longValue()){break;}MyObject object= getValueFromList(priorityObjectList,objectId); if(object!=null){boolean check=checkObject(object);if(check){matchObject=object;break;}}if(firstId==null){firstId=objectId;}max--;}if(matchObject!=null){break;}}if(matchObject==null&&firstId!=null){matchObject=getValueFromList(objectList,firstId);}if(matchObject==null){return;}doMyWork(code,matchObject);}/** * Title: doMyWork <br> * Description: 实现业务代码  <br>    设定文件  <br> * void    返回类型  <br> * @throws */private void doMyWork(String code,MyObject matchObject){    }/** * Title: getOneFromCache <br> * Description: 通过redis实现平均算法  <br> * @param code * @param priority * @param objectList * @return    设定文件  <br> * Long    返回类型  <br> * @throws */private Long getOneFromCache(String code,Integer priority,List<MyObject> list){    String key=getCacheKey(code,priority);        Jedis jedis = null;        Long value = null;    try {        jedis = this.getJedisResource();        Long length=jedis.llen(key);        if(length!=null&&length.longValue()>0){        String ret = jedis.rpoplpush(key,key);            value=Long.parseLong(ret);        }else{            if(CollectionUtils.isEmpty(list)){            //没数据则插入一条特殊记录,避免重复写缓存            jedis.watch(key);            Transaction transaction=jedis.multi();            transaction.lpush(key,String.valueOf(EXCEPT_ID));               transaction.expire(key,DEFAULT_TIME);            List<Object> result=transaction.exec();            String ret=CollectionUtils.isEmpty(result)?"失败":"成功";            //ret打log            }else{            jedis.watch(key);            Transaction transaction=jedis.multi();            for(MyObject object:list){    if(object!=null){    value=object.getId();                transaction.lpush(key,String.valueOf(value));    }            }               transaction.expire(key,DEFAULT_TIME);            List<Object> result=transaction.exec();            String ret=CollectionUtils.isEmpty(result)?"失败":"成功";            //ret打log            }        }       } catch (Exception e) {                  } finally {           this.returnJedisResource(jedis);       }return value;}  /**  * Title: getCacheKey <br>  * Description: 拼装缓存key值  <br>  * @param areaCode  * @param priority  * @return    设定文件  <br>  * String    返回类型  <br>  * @throws  */private String getCacheKey(String code,Integer priority){return CACHE_KEY_PREFIX+"_"+code+"_"+String.valueOf(priority);}/** * Title: getPrioritys <br> * Description: 根据优先级筛选数据  <br> * @param objectList * @return    设定文件  <br> * List<Integer>    返回类型  <br> * @throws */private List<Integer> getPrioritys(List<MyObject> objectList){List<Integer> priorityList=new ArrayList<Integer>();Set<Integer> prioritys = new HashSet<Integer>();if(CollectionUtils.isNotEmpty(objectList)){for(MyObject object:objectList){if(object.getPriority()!=null){prioritys.add(object.getPriority());}}}if(CollectionUtils.isNotEmpty(prioritys)){priorityList.addAll(prioritys);Collections.sort(priorityList);}return priorityList;}/** * Title: getValueFromList <br> * Description: 根据id从list中获取数据  <br> * @param objectList * @param objectId * @return    设定文件  <br> * MyObject    返回类型  <br> * @throws */private MyObject getValueFromList(List<MyObject> objectList,Long objectId){if(objectId==null||EXCEPT_ID==objectId.longValue()){return null;}MyObject result=null;if(CollectionUtils.isNotEmpty(objectList)){for(MyObject object:objectList){if(object!=null&&object.getId()!=null){if(object.getId().longValue()==objectId.longValue()){result=object;break;}}}}return result;}/** * Title: getListByPriority <br> * Description: 筛选本优先级数据  <br> * @param objectList * @param priority * @return    设定文件  <br> * List<MyObject>    返回类型  <br> * @throws */private List<MyObject> getListByPriority(List<MyObject> objectList,Integer priority){if(priority==null){return null;}List<MyObject> resultList=new ArrayList<MyObject>();if(CollectionUtils.isNotEmpty(objectList)){for(MyObject object:objectList){if(object!=null&&object.getPriority()!=null){if(object.getPriority().intValue()==priority.intValue()){resultList.add(object);}}}}return resultList;}/** * Title: checkObject <br> * Description: 业务代码:check数据  <br> * @param object * @return    设定文件  <br> * boolean    返回类型  <br> * @throws */private boolean checkObject(MyObject object){return false;}  /**  * Title: getJedisResource <br>  * Description: redis线程池  <br>  * @return    设定文件  <br>  * Jedis    返回类型  <br>  * @throws  */private Jedis getJedisResource() {    return redisCacheService.getRedisPoolService().getJedisPoolProxy().getResource();}     /**     * Title: returnJedisResource <br>     * Description: redis线程池  <br>     * @param jedis    设定文件  <br>     * void    返回类型  <br>     * @throws     */       private void returnJedisResource(Jedis jedis) {       this.redisCacheService.getRedisPoolService().getJedisPoolProxy().returnResource(jedis);   }}class MyObject{private Long id;private Integer priority;    private String code;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public Integer getPriority() {return priority;}public void setPriority(Integer priority) {this.priority = priority;}public String getCode() {return code;}public void setCode(String code) {this.code = code;}}

原创粉丝点击