From c3b7673c16d026e57f8759b4cee99a42bf3c57f2 Mon Sep 17 00:00:00 2001 From: Pu Zhibing <393733352@qq.com> Date: 星期三, 24 九月 2025 09:15:44 +0800 Subject: [PATCH] 修改bug --- UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RedisUtil.java | 218 +++++++++++++++++++++++++++++++++++------------------- 1 files changed, 141 insertions(+), 77 deletions(-) diff --git a/UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RedisUtil.java b/UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RedisUtil.java index 22f75e6..3f1b4ef 100644 --- a/UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RedisUtil.java +++ b/UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RedisUtil.java @@ -1,18 +1,23 @@ package com.stylefeng.guns.modular.system.util; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.stylefeng.guns.core.util.ToolUtil; +import org.apache.tomcat.util.threads.ThreadPoolExecutor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; +import org.springframework.data.geo.Circle; +import org.springframework.data.geo.GeoResult; +import org.springframework.data.geo.GeoResults; +import org.springframework.data.geo.Point; +import org.springframework.data.redis.connection.RedisGeoCommands; +import org.springframework.data.redis.core.HashOperations; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MultiValueMap; -import org.springframework.web.client.RestTemplate; -import redis.clients.jedis.Jedis; -import redis.clients.jedis.JedisPool; + +import javax.annotation.PostConstruct; +import java.util.*; +import java.util.concurrent.Executors; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; /** @@ -20,10 +25,11 @@ */ @Component public class RedisUtil { - + @Autowired - private RestTemplate internalRestTemplate; + private RedisTemplate redisTemplate; + private final Map<String, ScheduledExecutorService> LOCK_TASK_MAP = new HashMap<>(); /** * 向redis中存储字符串没有过期时间 @@ -31,26 +37,12 @@ * @param value */ public void setStrValue(String key, String value){ - if(ToolUtil.isNotEmpty(key)){ - //发送验证码短信 - HttpHeaders headers = new HttpHeaders(); - // 以表单的方式提交 - headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); - //将请求头部和参数合成一个请求 - MultiValueMap<String, Object> params = new LinkedMultiValueMap<>(); - params.add("key", key); - params.add("value", value); - HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers); - String s = internalRestTemplate.postForObject("http://zuul-gateway/redis/setValue_", requestEntity, String.class); - JSONObject jsonObject = JSON.parseObject(s, JSONObject.class); - if(jsonObject.getIntValue("code") != 200){ - System.err.println("调用redis出错了"); - } + if(ToolUtil.isNotEmpty(key) && ToolUtil.isNotEmpty(value)){ + redisTemplate.opsForValue().set(key, value); } - } - - + + /** * 以分钟为单位设置存储值(设置过期时间) * @param key @@ -58,26 +50,12 @@ * @param time 秒 */ public void setStrValue(String key, String value, int time){ - if(ToolUtil.isNotEmpty(key)){ - //发送验证码短信 - HttpHeaders headers = new HttpHeaders(); - // 以表单的方式提交 - headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); - //将请求头部和参数合成一个请求 - MultiValueMap<String, String> params = new LinkedMultiValueMap<>(); - params.add("key", key); - params.add("value", value); - params.add("time", String.valueOf(time)); - HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(params, headers); - String s = internalRestTemplate.postForObject("http://zuul-gateway/redis/setValue", requestEntity, String.class); - JSONObject jsonObject = JSON.parseObject(s, JSONObject.class); - if(jsonObject.getIntValue("code") != 200){ - System.err.println("调用redis出错了"); - } + if(ToolUtil.isNotEmpty(key) && ToolUtil.isNotEmpty(value)){ + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); } } - - + + /** * 从redis中获取值 * @param key @@ -85,44 +63,130 @@ */ public String getValue(String key){ if(ToolUtil.isNotEmpty(key)){ - HttpHeaders headers = new HttpHeaders(); - // 以表单的方式提交 - headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); - //将请求头部和参数合成一个请求 - MultiValueMap<String, Object> params = new LinkedMultiValueMap<>(); - params.add("key", key); - HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers); - String s = internalRestTemplate.postForObject("http://zuul-gateway/redis/getValue",requestEntity , String.class); - JSONObject jsonObject = JSON.parseObject(s, JSONObject.class); - if(jsonObject.getIntValue("code") != 200){ - System.err.println("调用redis出错了"); - } - return jsonObject.getString("data"); + System.err.println("查询缓存:" + key); + Object o = redisTemplate.opsForValue().get(key); + System.err.println(o); + return (String) o; } return null; } + - + + /** * 删除key * @param key */ - public String remove(String key){ + public void remove(String key){ if(ToolUtil.isNotEmpty(key)){ - HttpHeaders headers = new HttpHeaders(); - // 以表单的方式提交 - headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); - //将请求头部和参数合成一个请求 - MultiValueMap<String, Object> params = new LinkedMultiValueMap<>(); - params.add("key", key); - HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers); - String s = internalRestTemplate.postForObject("http://zuul-gateway/redis/remove",requestEntity , String.class); - JSONObject jsonObject = JSON.parseObject(s, JSONObject.class); - if(jsonObject.getIntValue("code") != 200){ - System.err.println("调用redis出错了"); - } - return jsonObject.getString("data"); + redisTemplate.delete(key); } - return null; + } + + + /** + * 加锁 + * @param key + * @param time + * @return + */ + public boolean lock(String key, long keepTime, long time){ + ScheduledExecutorService scheduledExecutorService = LOCK_TASK_MAP.get(key); + if(null == scheduledExecutorService || scheduledExecutorService.isTerminated()){ + unlock(key); + } + keepTime *= 1000; + Boolean ifAbsent = redisTemplate.opsForValue().setIfAbsent(key, UUIDUtil.getRandomCode()); + if(ifAbsent){ + return addLockMap(key, time); + } + long timeMillis = System.currentTimeMillis(); + while (timeMillis + keepTime > System.currentTimeMillis()){ + ifAbsent = redisTemplate.opsForValue().setIfAbsent(key, UUIDUtil.getRandomCode()); + if(ifAbsent){ + return addLockMap(key, time); + } + try { + Thread.sleep(100); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + return false; + } + + + private boolean addLockMap(String key, long time){ + ScheduledExecutorService scheduledExecutorService = LOCK_TASK_MAP.get(key); + if(null == scheduledExecutorService){ + scheduledExecutorService = Executors.newScheduledThreadPool(1); + } + LOCK_TASK_MAP.put(key, scheduledExecutorService); + scheduledExecutorService.schedule(()->{ + redisTemplate.delete(key); + LOCK_TASK_MAP.remove(key); + }, time, TimeUnit.SECONDS); + return true; + } + + + /** + * redis释放锁 + * @return + */ + public boolean unlock(String key){ + redisTemplate.delete(key); + ScheduledExecutorService scheduledExecutorService = LOCK_TASK_MAP.get(key); + if(null != scheduledExecutorService){ + scheduledExecutorService.shutdownNow(); + } + LOCK_TASK_MAP.remove(key); + return true; + } + + + /** + * 检索坐标为中心直径范围内的数据,单位米 + * @param k + * @param lon + * @param lat + * @param radius + * @return + */ + public List<GeoResult<RedisGeoCommands.GeoLocation<String>>> getNearGeo(String k, Double lon, Double lat, Double radius){ + Circle within = new Circle(lon, lat, radius); + GeoResults<RedisGeoCommands.GeoLocation<String>> geoResults = redisTemplate.opsForGeo().radius(k, within); + return geoResults.getContent(); + } + + + /** + * 检索坐标为中心直径范围内的数据,单位米,由近到远排序 + * @param k + * @param lon + * @param lat + * @param radius + * @return + */ + public List<GeoResult<RedisGeoCommands.GeoLocation<String>>> getNearGeoSortAscending(String k, Double lon, Double lat, Double radius){ + Circle within = new Circle(lon, lat, radius); + RedisGeoCommands.GeoRadiusCommandArgs geoRadiusCommandArgs = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs(); + geoRadiusCommandArgs.sortAscending(); + GeoResults<RedisGeoCommands.GeoLocation<String>> geoResults = redisTemplate.opsForGeo().radius(k, within, geoRadiusCommandArgs); + return geoResults.getContent(); + } + + + /** + * 添加地理空间索引坐标 + * @param k + * @param lon + * @param lat + * @param object + */ + public void addGeo(String k, Double lon, Double lat, String object){ + Point point = new Point(lon, lat); + redisTemplate.opsForGeo().add(k, point, object); } } -- Gitblit v1.7.1