diff --git a/.github/workflows/mirror.yml b/.github/workflows/mirror.yml index 47028f88..35d6cb69 100644 --- a/.github/workflows/mirror.yml +++ b/.github/workflows/mirror.yml @@ -3,8 +3,6 @@ name: 同步代码 on: push: branches: [ master,dev ] - pull_request: - branches: [ master,dev ] jobs: sync: diff --git a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/R.java b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/R.java index 7b79afa2..e33f1491 100755 --- a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/R.java +++ b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/R.java @@ -76,6 +76,10 @@ public class R implements Serializable { return restResult(data, CommonConstants.FAIL, msg); } + public static R result(T data, int code, String msg) { + return restResult(data, code, msg); + } + public static R restResult(T data, int code, String msg) { R apiResult = new R<>(); apiResult.setCode(code); @@ -84,4 +88,8 @@ public class R implements Serializable { return apiResult; } + public Boolean isSuccess() { + return (this.code == CommonConstants.SUCCESS); + } + } diff --git a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/RedisUtils.java b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/RedisUtils.java new file mode 100644 index 00000000..4172fc54 --- /dev/null +++ b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/RedisUtils.java @@ -0,0 +1,819 @@ +package com.pig4cloud.pig.common.core.util; + +import cn.hutool.core.convert.Convert; +import lombok.experimental.UtilityClass; +import org.springframework.data.redis.connection.RedisConnection; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.*; +import org.springframework.data.redis.core.script.DefaultRedisScript; +import org.springframework.data.redis.core.script.RedisScript; +import org.springframework.util.CollectionUtils; + +import java.util.*; +import java.util.concurrent.TimeUnit; + +/** + * 缓存工具类 + * + * @author XX + * @date 2023/05/12 + */ +@UtilityClass +public class RedisUtils { + + private static final Long SUCCESS = 1L; + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + */ + public boolean expire(String key, long time) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + if (time > 0) { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + } + } catch (Exception e) { + e.printStackTrace(); + return false; + } + return true; + } + + /** + * 根据 key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(Object key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 查找匹配key + * + * @param pattern key + * @return / + */ + public List scan(String pattern) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + ScanOptions options = ScanOptions.scanOptions().match(pattern).build(); + RedisConnectionFactory factory = redisTemplate.getConnectionFactory(); + RedisConnection rc = Objects.requireNonNull(factory).getConnection(); + Cursor cursor = rc.scan(options); + List result = new ArrayList<>(); + while (cursor.hasNext()) { + result.add(new String(cursor.next())); + } + try { + RedisConnectionUtils.releaseConnection(rc, factory); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * 分页查询 key + * + * @param patternKey key + * @param page 页码 + * @param size 每页数目 + * @return / + */ + public List findKeysForPage(String patternKey, int page, int size) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + ScanOptions options = ScanOptions.scanOptions().match(patternKey).build(); + RedisConnectionFactory factory = redisTemplate.getConnectionFactory(); + RedisConnection rc = Objects.requireNonNull(factory).getConnection(); + Cursor cursor = rc.scan(options); + List result = new ArrayList<>(size); + int tmpIndex = 0; + int fromIndex = page * size; + int toIndex = page * size + size; + while (cursor.hasNext()) { + if (tmpIndex >= fromIndex && tmpIndex < toIndex) { + result.add(new String(cursor.next())); + tmpIndex++; + continue; + } + // 获取到满足条件的数据后,就可以退出了 + if (tmpIndex >= toIndex) { + break; + } + tmpIndex++; + cursor.next(); + } + try { + RedisConnectionUtils.releaseConnection(rc, factory); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + public void del(String... key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete(CollectionUtils.arrayToList(key)); + } + } + } + + /** + * 获取锁 + * + * @param lockKey 锁key + * @param value value + * @param expireTime:单位-秒 + * @return boolean + */ + public boolean getLock(String lockKey, String value, int expireTime) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + Boolean result = false; + try { + result = redisTemplate.opsForValue().setIfAbsent(lockKey, value, expireTime, TimeUnit.SECONDS); + if (null == result) { + result = false; + } + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * 释放锁 + * + * @param lockKey 锁key + * @param value value + * @return boolean + */ + public boolean releaseLock(String lockKey, String value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end"; + RedisScript redisScript = new DefaultRedisScript<>(script, Long.class); + Object result = redisTemplate.execute(redisScript, Collections.singletonList(lockKey), value); + if (SUCCESS.equals(Convert.toLong(result))) { + return true; + } + } catch (Exception e) { + e.printStackTrace(); + } + return false; + } + + // ============================String============================= + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 批量获取 + * + * @param keys + * @return + */ + public List multiGet(List keys) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + Object obj = redisTemplate.opsForValue().multiGet(Collections.singleton(keys)); + return null; + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间 + * @param timeUnit 类型 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time, TimeUnit timeUnit) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, timeUnit); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + // ================================Map================================= + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForHash().entries(key); + + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * hash递增 如果不存在,就会创建一个 并把新增后的值返回 + * + * @param key 键 + * @param item 项 + * @param by 要增加几(大于0) + * @return + */ + public double hincr(String key, String item, double by) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForHash().increment(key, item, by); + } + + /** + * hash递减 + * + * @param key 键 + * @param item 项 + * @param by 要减少记(小于0) + * @return + */ + public double hdecr(String key, String item, double by) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + return redisTemplate.opsForHash().increment(key, item, -by); + } + + // ============================set============================= + + /** + * 根据key获取Set中的所有值 + * + * @param key 键 + * @return + */ + public Set sGet(String key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + return redisTemplate.opsForSet().members(key); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 根据value从一个set中查询,是否存在 + * + * @param key 键 + * @param value 值 + * @return true 存在 false不存在 + */ + public boolean sHasKey(String key, Object value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + return redisTemplate.opsForSet().isMember(key, value); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将数据放入set缓存 + * + * @param key 键 + * @param values 值 可以是多个 + * @return 成功个数 + */ + public long sSet(String key, Object... values) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + return redisTemplate.opsForSet().add(key, values); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * 将set数据放入缓存 + * + * @param key 键 + * @param time 时间(秒) + * @param values 值 可以是多个 + * @return 成功个数 + */ + public long sSetAndTime(String key, long time, Object... values) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + Long count = redisTemplate.opsForSet().add(key, values); + if (time > 0) { + expire(key, time); + } + return count; + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * 获取set缓存的长度 + * + * @param key 键 + * @return + */ + public long sGetSetSize(String key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + return redisTemplate.opsForSet().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * 移除值为value的 + * + * @param key 键 + * @param values 值 可以是多个 + * @return 移除的个数 + */ + public long setRemove(String key, Object... values) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + Long count = redisTemplate.opsForSet().remove(key, values); + return count; + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * 获集合key1和集合key2的差集元素 + * + * @param key 键 + * @return + */ + public Set sDifference(String key, String otherKey) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + return redisTemplate.opsForSet().difference(key, otherKey); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + // ===============================list================================= + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * 通过索引 获取list中的值 + * + * @param key 键 + * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推 + * @return + */ + public Object lGetIndex(String key, long index) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + return redisTemplate.opsForList().index(key, index); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, Object value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + redisTemplate.opsForList().rightPush(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, Object value, long time) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + redisTemplate.opsForList().rightPush(key, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据索引修改list中的某条数据 + * + * @param key 键 + * @param index 索引 + * @param value 值 + * @return / + */ + public boolean lUpdateIndex(String key, long index, Object value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + redisTemplate.opsForList().set(key, index, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 移除N个值为value + * + * @param key 键 + * @param count 移除多少个 + * @param value 值 + * @return 移除的个数 + */ + public long lRemove(String key, long count, Object value) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + return redisTemplate.opsForList().remove(key, count, value); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * 将zSet数据放入缓存 + * + * @param key + * @param time + * @param tuples + * @return + */ + public long zSetAndTime(String key, long time, Set> tuples) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + Long count = redisTemplate.opsForZSet().add(key, tuples); + if (time > 0) { + expire(key, time); + } + return count; + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * Sorted set:有序集合获取 + * + * @param key + * @param min + * @param max + * @return + */ + public Set zRangeByScore(String key, double min, double max) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + ZSetOperations zset = redisTemplate.opsForZSet(); + return zset.rangeByScore(key, min, max); + + } + + /** + * Sorted set:有序集合获取 正序 + * + * @param key + * @param start + * @param end + * @return + */ + public Set zRange(String key, long start, long end) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + ZSetOperations zset = redisTemplate.opsForZSet(); + return zset.range(key, start, end); + + } + + /** + * Sorted set:有序集合获取 倒叙 + * + * @param key + * @param start + * @param end + * @return + */ + public Set zReverseRange(String key, long start, long end) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + ZSetOperations zset = redisTemplate.opsForZSet(); + return zset.reverseRange(key, start, end); + + } + + /** + * 获取zSet缓存的长度 + * + * @param key 键 + * @return + */ + public long zGetSetSize(String key) { + RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class); + try { + return redisTemplate.opsForZSet().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + +} diff --git a/pig-common/pig-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/pig-common/pig-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 6fe4f1ad..81cc2017 100644 --- a/pig-common/pig-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/pig-common/pig-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -4,3 +4,4 @@ com.pig4cloud.pig.common.core.config.RedisTemplateConfiguration com.pig4cloud.pig.common.core.config.RestTemplateConfiguration com.pig4cloud.pig.common.core.util.SpringContextHolder com.pig4cloud.pig.common.core.config.WebMvcConfiguration +com.pig4cloud.pig.common.core.util.RedisUtils \ No newline at end of file