package com.stylefeng.guns.modular.system.util; import com.stylefeng.guns.core.util.ToolUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.geo.Point; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import java.util.*; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; /** * Redis工具类 */ @Component public class RedisUtil { @Autowired private RedisTemplate redisTemplate; private final Map LOCK_TASK_MAP = new HashMap<>(); /** * 向redis中存储字符串没有过期时间 * @param key * @param value */ public void setStrValue(String key, String value){ if(ToolUtil.isNotEmpty(key) && ToolUtil.isNotEmpty(value)){ redisTemplate.opsForValue().set(key, value); } } /** * 以分钟为单位设置存储值(设置过期时间) * @param key * @param value * @param time 秒 */ public void setStrValue(String key, String value, int time){ if(ToolUtil.isNotEmpty(key) && ToolUtil.isNotEmpty(value)){ redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); } } /** * 从redis中获取值 * @param key * @return */ public String getValue(String key){ if(ToolUtil.isNotEmpty(key)){ String data = (String) redisTemplate.opsForValue().get(key); return data; } return null; } /** * 删除key * @param key */ public void remove(String key){ if(ToolUtil.isNotEmpty(key)){ redisTemplate.delete(key); } } /** * 加锁 * @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 object */ public void addGeo(String k, Double lon, Double lat, String object){ Point point = new Point(lon, lat); redisTemplate.opsForGeo().add(k, point, object); } }