Commit 2ccc6a5480133777fc9cc133fd73c00c31aa220b
1 parent
e547aa8cd5
Exists in
master
and in
6 other branches
添加缓存机制
Showing 3 changed files with 201 additions and 6 deletions
platform-biz-service/src/main/java/com/lyms/platform/permission/model/ServiceListQuery.java
View file @
2ccc6a5
| ... | ... | @@ -106,5 +106,20 @@ |
| 106 | 106 | public void setHospitalId(String hospitalId) { |
| 107 | 107 | this.hospitalId = hospitalId; |
| 108 | 108 | } |
| 109 | + | |
| 110 | + @Override | |
| 111 | + public String toString() { | |
| 112 | + return "ServiceListQuery{" + | |
| 113 | + "startTime=" + startTime + | |
| 114 | + ", provinceId='" + provinceId + '\'' + | |
| 115 | + ", cityId='" + cityId + '\'' + | |
| 116 | + ", areaId='" + areaId + '\'' + | |
| 117 | + ", hospitalId='" + hospitalId.toString() + '\'' + | |
| 118 | + ", userId=" + userId + | |
| 119 | + ", endTime=" + endTime + | |
| 120 | + ", hospitalIds=" + hospitalIds + | |
| 121 | + ", serStatus='" + serStatus + '\'' + | |
| 122 | + '}'; | |
| 123 | + } | |
| 109 | 124 | } |
platform-common/src/main/java/com/lyms/platform/common/utils/ExpiryMap.java
View file @
2ccc6a5
| 1 | +package com.lyms.platform.common.utils; | |
| 2 | + | |
| 3 | +import java.util.*; | |
| 4 | + | |
| 5 | +/** | |
| 6 | + * | |
| 7 | + * @Author dongqin | |
| 8 | + * @Description 继承至HashMap 重写了所有对外的方法,对每个key值都设置了有效期 | |
| 9 | + * @Date 15:49 2019/5/18 | |
| 10 | + **/ | |
| 11 | +public class ExpiryMap<K, V> extends HashMap<K, V>{ | |
| 12 | + | |
| 13 | + private static final long serialVersionUID = 1L; | |
| 14 | + | |
| 15 | + /** | |
| 16 | + * default expiry time 2m | |
| 17 | + */ | |
| 18 | + private long EXPIRY = 1000 * 60 * 2; | |
| 19 | + | |
| 20 | + private HashMap<K, Long> expiryMap = new HashMap<>(); | |
| 21 | + | |
| 22 | + public ExpiryMap(){ | |
| 23 | + super(); | |
| 24 | + } | |
| 25 | + public ExpiryMap(long defaultExpiryTime){ | |
| 26 | + this(1 << 4, defaultExpiryTime); | |
| 27 | + } | |
| 28 | + public ExpiryMap(int initialCapacity, long defaultExpiryTime){ | |
| 29 | + super(initialCapacity); | |
| 30 | + this.EXPIRY = defaultExpiryTime; | |
| 31 | + } | |
| 32 | + public V put(K key, V value) { | |
| 33 | + expiryMap.put(key, System.currentTimeMillis() + EXPIRY); | |
| 34 | + return super.put(key, value); | |
| 35 | + } | |
| 36 | + public boolean containsKey(Object key) { | |
| 37 | + return !checkExpiry(key, true) && super.containsKey(key); | |
| 38 | + } | |
| 39 | + /** | |
| 40 | + * @param key | |
| 41 | + * @param value | |
| 42 | + * @param expiryTime 键值对有效期 毫秒 | |
| 43 | + * @return | |
| 44 | + */ | |
| 45 | + public V put(K key, V value, long expiryTime) { | |
| 46 | + expiryMap.put(key, System.currentTimeMillis() + expiryTime); | |
| 47 | + return super.put(key, value); | |
| 48 | + } | |
| 49 | + public int size() { | |
| 50 | + return entrySet().size(); | |
| 51 | + } | |
| 52 | + public boolean isEmpty() { | |
| 53 | + return entrySet().size() == 0; | |
| 54 | + } | |
| 55 | + public boolean containsValue(Object value) { | |
| 56 | + if (value == null) return Boolean.FALSE; | |
| 57 | + Set<java.util.Map.Entry<K, V>> set = super.entrySet(); | |
| 58 | + Iterator<java.util.Map.Entry<K, V>> iterator = set.iterator(); | |
| 59 | + while (iterator.hasNext()) { | |
| 60 | + java.util.Map.Entry<K, V> entry = iterator.next(); | |
| 61 | + if(value.equals(entry.getValue())){ | |
| 62 | + if(checkExpiry(entry.getKey(), false)) { | |
| 63 | + iterator.remove(); | |
| 64 | + return Boolean.FALSE; | |
| 65 | + }else return Boolean.TRUE; | |
| 66 | + } | |
| 67 | + } | |
| 68 | + return Boolean.FALSE; | |
| 69 | + } | |
| 70 | + public Collection<V> values() { | |
| 71 | + | |
| 72 | + Collection<V> values = super.values(); | |
| 73 | + | |
| 74 | + if(values == null || values.size() < 1) return values; | |
| 75 | + | |
| 76 | + Iterator<V> iterator = values.iterator(); | |
| 77 | + | |
| 78 | + while (iterator.hasNext()) { | |
| 79 | + V next = iterator.next(); | |
| 80 | + if(!containsValue(next)) iterator.remove(); | |
| 81 | + } | |
| 82 | + return values; | |
| 83 | + } | |
| 84 | + public V get(Object key) { | |
| 85 | + if (key == null) | |
| 86 | + return null; | |
| 87 | + if(checkExpiry(key, true)) | |
| 88 | + return null; | |
| 89 | + return super.get(key); | |
| 90 | + } | |
| 91 | + /** | |
| 92 | + * | |
| 93 | + * @Description: 是否过期 | |
| 94 | + * @param key | |
| 95 | + * @return null:不存在或key为null -1:过期 存在且没过期返回value 因为过期的不是实时删除,所以稍微有点作用 | |
| 96 | + */ | |
| 97 | + public Object isInvalid(Object key) { | |
| 98 | + if (key == null) | |
| 99 | + return null; | |
| 100 | + if(!expiryMap.containsKey(key)){ | |
| 101 | + return null; | |
| 102 | + } | |
| 103 | + long expiryTime = expiryMap.get(key); | |
| 104 | + | |
| 105 | + boolean flag = System.currentTimeMillis() > expiryTime; | |
| 106 | + | |
| 107 | + if(flag){ | |
| 108 | + super.remove(key); | |
| 109 | + expiryMap.remove(key); | |
| 110 | + return -1; | |
| 111 | + } | |
| 112 | + return super.get(key); | |
| 113 | + } | |
| 114 | + public void putAll(Map<? extends K, ? extends V> m) { | |
| 115 | + for (Map.Entry<? extends K, ? extends V> e : m.entrySet()) | |
| 116 | + expiryMap.put(e.getKey(), System.currentTimeMillis() + EXPIRY); | |
| 117 | + super.putAll(m); | |
| 118 | + } | |
| 119 | + public Set<Entry<K,V>> entrySet() { | |
| 120 | + Set<java.util.Map.Entry<K, V>> set = super.entrySet(); | |
| 121 | + Iterator<Entry<K, V>> iterator = set.iterator(); | |
| 122 | + while (iterator.hasNext()) { | |
| 123 | + java.util.Map.Entry<K, V> entry = iterator.next(); | |
| 124 | + if(checkExpiry(entry.getKey(), false)) iterator.remove(); | |
| 125 | + } | |
| 126 | + | |
| 127 | + return set; | |
| 128 | + } | |
| 129 | + /** | |
| 130 | + * | |
| 131 | + * @Description: 是否过期 | |
| 132 | + * @param key true 过期 | |
| 133 | + * @param isRemoveSuper true super删除 | |
| 134 | + * @return | |
| 135 | + */ | |
| 136 | + private boolean checkExpiry(Object key, boolean isRemoveSuper){ | |
| 137 | + | |
| 138 | + if(!expiryMap.containsKey(key)){ | |
| 139 | + return Boolean.FALSE; | |
| 140 | + } | |
| 141 | + long expiryTime = expiryMap.get(key); | |
| 142 | + | |
| 143 | + boolean flag = System.currentTimeMillis() > expiryTime; | |
| 144 | + | |
| 145 | + if(flag){ | |
| 146 | + if(isRemoveSuper) | |
| 147 | + super.remove(key); | |
| 148 | + expiryMap.remove(key); | |
| 149 | + } | |
| 150 | + return flag; | |
| 151 | + } | |
| 152 | + public static void main(String[] args) throws InterruptedException { | |
| 153 | + | |
| 154 | + ExpiryMap<String, String> map = new ExpiryMap<>(10); | |
| 155 | + map.put("test", "ankang"); | |
| 156 | + map.put("test1", "ankang"); | |
| 157 | + map.put("test2", "ankang", 3000); | |
| 158 | + System.out.println("test1" + map.get("test")); | |
| 159 | + Thread.sleep(1000); | |
| 160 | + System.out.println("isInvalid:" + map.isInvalid("test")); | |
| 161 | + System.out.println("size:" + map.size()); | |
| 162 | + System.out.println("size:" + ((HashMap<String, String>)map).size()); | |
| 163 | + for (Map.Entry<String, String> m : map.entrySet()) { | |
| 164 | + System.out.println("isInvalid:" + map.isInvalid(m.getKey())); | |
| 165 | + map.containsKey(m.getKey()); | |
| 166 | + System.out.println("key:" + m.getKey() + " value:" + m.getValue()); | |
| 167 | + } | |
| 168 | + System.out.println("test1" + map.get("test")); | |
| 169 | + | |
| 170 | + } | |
| 171 | +} |
platform-operate-api/src/main/java/com/lyms/platform/operate/web/facade/AreaCountFacade.java
View file @
2ccc6a5
| ... | ... | @@ -96,6 +96,8 @@ |
| 96 | 96 | @Autowired |
| 97 | 97 | private BabyBookbuildingService babyBookbuildingService; |
| 98 | 98 | |
| 99 | + public static ExpiryMap<String, BaseResponse> cacheGetServiceList = new ExpiryMap<>(1000 * 60 * 3); | |
| 100 | + | |
| 99 | 101 | /** |
| 100 | 102 | * 获取当前用户拥有的医院权限列表并和查询条件取交集 |
| 101 | 103 | * |
| ... | ... | @@ -1037,6 +1039,11 @@ |
| 1037 | 1039 | */ |
| 1038 | 1040 | public BaseResponse getServiceList(ServiceListQuery param) throws InterruptedException { |
| 1039 | 1041 | BaseResponse baseResponse = new BaseResponse(); |
| 1042 | + String string = param.toString(); | |
| 1043 | + BaseResponse baseResponseVal = cacheGetServiceList.get(string); | |
| 1044 | + if (baseResponseVal != null){ | |
| 1045 | + return baseResponseVal; | |
| 1046 | + } | |
| 1040 | 1047 | setDefaultTime(param); |
| 1041 | 1048 | |
| 1042 | 1049 | HashMap<String, Object> objectHashMap = new HashMap<>(16); |
| ... | ... | @@ -1080,9 +1087,9 @@ |
| 1080 | 1087 | |
| 1081 | 1088 | CopyOnWriteArrayList statusValList = new CopyOnWriteArrayList(); |
| 1082 | 1089 | param.setHospitalIds(hospitalIds); |
| 1083 | - CountDownLatch cdl = new CountDownLatch(4); | |
| 1084 | - ExecutorService service = new ThreadPoolExecutor(5, 10, 3000, TimeUnit.MILLISECONDS, | |
| 1085 | - new ArrayBlockingQueue<Runnable>(10), | |
| 1090 | + | |
| 1091 | + ExecutorService service = new ThreadPoolExecutor(4, 4, 9000, TimeUnit.MILLISECONDS, | |
| 1092 | + new ArrayBlockingQueue<Runnable>(1), | |
| 1086 | 1093 | new RejectedExecutionHandler() { |
| 1087 | 1094 | @Override |
| 1088 | 1095 | public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { |
| 1089 | 1096 | |
| 1090 | 1097 | |
| ... | ... | @@ -1091,11 +1098,11 @@ |
| 1091 | 1098 | } |
| 1092 | 1099 | }); |
| 1093 | 1100 | for (int i =1; i < 5; i ++){ |
| 1101 | + CountDownLatch cdl = new CountDownLatch(1); | |
| 1094 | 1102 | String serStatus = i + "" ; |
| 1095 | - service.execute(new ServiceListBySerStatusWorker(cdl, param, statusValList, serStatus, patientServiceService )); | |
| 1096 | - Thread.sleep(300); | |
| 1103 | + service.execute(new ServiceListBySerStatusWorker(cdl, param, statusValList, serStatus, patientServiceService)); | |
| 1104 | + cdl.await(); | |
| 1097 | 1105 | } |
| 1098 | - cdl.await(); | |
| 1099 | 1106 | service.shutdown(); |
| 1100 | 1107 | |
| 1101 | 1108 | objectHashMap.put("statusNameList",statusNameList); |
| ... | ... | @@ -1103,6 +1110,8 @@ |
| 1103 | 1110 | objectHashMap.put("serviceList", copyOnWriteArrayList); |
| 1104 | 1111 | baseResponse.setObject(objectHashMap); |
| 1105 | 1112 | |
| 1113 | + | |
| 1114 | + cacheGetServiceList.put(string, baseResponse); | |
| 1106 | 1115 | return baseResponse; |
| 1107 | 1116 | } |
| 1108 | 1117 |