利用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;}}
阅读全文
0 0
- 利用redis处理平均算法
- 平均算法
- 【数字信号处理】极其精简的平均滤波算法
- 加权平均法 -- 算法
- K平均算法
- k-平均算法
- 算法题 平均年龄
- [李景山php] 利用redis 作为session的处理程序
- 圆形平均分算法(图)
- 算法提高 统计平均成绩
- 统计专用-求平均算法
- 平均周转时间各种算法
- 数据算法-hadoop6 移动平均
- PHP 平均拆分数组算法
- QPS,用户平均等待时间,服务器平均请求处理时间
- QPS,用户平均等待时间,服务器平均请求处理时间
- 算法(3) 移动平均算法 moving average
- 【REDIS】REDIS warning处理
- hdu1735 字数统计
- PLSQL中json使用
- HDU -- 4009 Transfer water 【无定根的最小树形图 + 思维】
- 使用Hyper-v克隆虚拟机出现克隆后虚拟机不能使用eth0,eth0 提示Device does not seem to be present
- 【SqlServer系列】集合运算
- 利用redis处理平均算法
- 51Nod-1693-水群
- vs2010操作excel 需要安装office2010
- JDBC连接
- RuntimeException和Exception
- Struts2配置详解_配置Action
- Centos7配置静态IP
- 关注民生民情
- Spring中ClassPathXmlApplicationContext类的简单使用