|
@@ -0,0 +1,930 @@
|
|
|
+//package com.tzld.piaoquan.risk.control.util;
|
|
|
+//
|
|
|
+//import org.apache.ibatis.cache.CacheException;
|
|
|
+//import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+//import org.springframework.beans.factory.annotation.Qualifier;
|
|
|
+//import org.springframework.data.redis.core.Cursor;
|
|
|
+//import org.springframework.data.redis.core.RedisCallback;
|
|
|
+//import org.springframework.data.redis.core.RedisTemplate;
|
|
|
+//import org.springframework.data.redis.core.ScanOptions;
|
|
|
+//import org.springframework.data.redis.core.ZSetOperations.TypedTuple;
|
|
|
+//import org.springframework.data.redis.core.script.DefaultRedisScript;
|
|
|
+//import org.springframework.scripting.support.StaticScriptSource;
|
|
|
+//import org.springframework.stereotype.Component;
|
|
|
+//
|
|
|
+//import java.util.*;
|
|
|
+//import java.util.concurrent.TimeUnit;
|
|
|
+//
|
|
|
+///**
|
|
|
+// * redis 操作
|
|
|
+// *
|
|
|
+// * @author supeng
|
|
|
+// * @date 2020/11/10
|
|
|
+// */
|
|
|
+//@Component
|
|
|
+//public class RedisUtil {
|
|
|
+// /**
|
|
|
+// * 锁前缀
|
|
|
+// */
|
|
|
+// private static final String LOCK_PREFIX = "LOCK_";
|
|
|
+// /**
|
|
|
+// * 默认重试次数
|
|
|
+// */
|
|
|
+// private static final Integer DEFAULT_RETRIES = 1;
|
|
|
+// /**
|
|
|
+// * 默认 10毫秒
|
|
|
+// */
|
|
|
+// private static final Long DEFAULT_INTERVAL = 10L;
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 加锁lua脚本
|
|
|
+// */
|
|
|
+// private static final String LOCK = "if (redis.call('exists', KEYS[1]) == 0) then " +
|
|
|
+// "redis.call('hset', KEYS[1], ARGV[2], 1); " +
|
|
|
+// "redis.call('pexpire', KEYS[1], ARGV[1]); " +
|
|
|
+// "return 1; " +
|
|
|
+// "end; " +
|
|
|
+// "if (redis.call('hexists', KEYS[1], ARGV[2]) == 1) then " +
|
|
|
+// "redis.call('hincrby', KEYS[1], ARGV[2], 1); " +
|
|
|
+// "redis.call('pexpire', KEYS[1], ARGV[1]); " +
|
|
|
+// "return 1; " +
|
|
|
+// "end; " +
|
|
|
+// "return 0;";
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 解锁 lua 脚本
|
|
|
+// */
|
|
|
+// public static final String UNLOCK = "if (redis.call('hexists', KEYS[1], ARGV[1]) == 0) then " +
|
|
|
+// "return nil; " +
|
|
|
+// "end; " +
|
|
|
+// "local counter = redis.call('hincrby', KEYS[1], ARGV[1], -1); " +
|
|
|
+// "if (counter > 0) then " +
|
|
|
+// "return 0; " +
|
|
|
+// "else " +
|
|
|
+// "redis.call('del', KEYS[1]); " +
|
|
|
+// "return 1; " +
|
|
|
+// "end; " +
|
|
|
+// "return nil;";
|
|
|
+//
|
|
|
+// @Qualifier("redisTemplate")
|
|
|
+// @Autowired
|
|
|
+// RedisTemplate<String, String> redisTemplate;
|
|
|
+//
|
|
|
+// /** ================Key相关操作================ */
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 是否存在key
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public Boolean hasKey(String key) {
|
|
|
+// return redisTemplate.hasKey(key);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 删除 key
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public Boolean deleteKey(String key) {
|
|
|
+// return redisTemplate.delete(key);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 删除多个key
|
|
|
+// *
|
|
|
+// * @param keys
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public Long deleteKeys(Collection<String> keys) {
|
|
|
+// return redisTemplate.delete(keys);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 设置key的过期时间
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param timeout
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public Boolean expire(String key, long timeout) {
|
|
|
+// if (timeout < 0) {
|
|
|
+// return false;
|
|
|
+// }
|
|
|
+// return redisTemplate.expire(key, timeout, TimeUnit.SECONDS);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 获取key剩余的过期时间,秒
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @return key不存在,返回-2,key存在并且没有设置过期时间(永久有效),返回 -1
|
|
|
+// */
|
|
|
+// public Long getExpire(String key) {
|
|
|
+// return redisTemplate.getExpire(key, TimeUnit.SECONDS);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /** ================String相关操作================ */
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 获取 值
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public String get(String key) {
|
|
|
+// return redisTemplate.opsForValue().get(key);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 获取多个值
|
|
|
+// *
|
|
|
+// * @param keys
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public List<String> multiGet(Collection<String> keys) {
|
|
|
+// if (keys != null && keys.size() > 200) {
|
|
|
+// throw new CacheException("too many keys, max 200");
|
|
|
+// }
|
|
|
+// return redisTemplate.opsForValue().multiGet(keys);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * set 值
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param value
|
|
|
+// */
|
|
|
+// public void set(String key, String value) {
|
|
|
+// redisTemplate.opsForValue().set(key, value);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * set 值并指定过期时间
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param value
|
|
|
+// * @param timeout
|
|
|
+// */
|
|
|
+// public void set(String key, String value, long timeout) {
|
|
|
+// redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 设置String缓存值,只有key不存在时才能设置成功
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param value
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public Boolean setNx(String key, String value) {
|
|
|
+// return redisTemplate.opsForValue().setIfAbsent(key, value);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 设置String缓存值并指定过期时间,只有key不存在时才能设置成功
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param value
|
|
|
+// * @param timeout
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public Boolean setNx(String key, String value, long timeout) {
|
|
|
+// return redisTemplate.opsForValue().setIfAbsent(key, value, timeout, TimeUnit.SECONDS);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * getAndSet 值
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param value
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public String getAndSet(String key, String value) {
|
|
|
+// return redisTemplate.opsForValue().getAndSet(key, value);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * key的值 +1
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @return
|
|
|
+// * @version 1.0
|
|
|
+// */
|
|
|
+// public Long incr(String key) {
|
|
|
+// return redisTemplate.opsForValue().increment(key);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * key的值 +delta
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param delta
|
|
|
+// * @return
|
|
|
+// * @version 1.0
|
|
|
+// */
|
|
|
+// public Long incrBy(String key, long delta) {
|
|
|
+// return redisTemplate.opsForValue().increment(key, delta);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * key的值 -1
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @return
|
|
|
+// * @version 1.0
|
|
|
+// */
|
|
|
+// public Long decr(String key) {
|
|
|
+// return redisTemplate.opsForValue().decrement(key);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * key的值 -delta
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param delta
|
|
|
+// * @return
|
|
|
+// * @version 1.0
|
|
|
+// */
|
|
|
+// public Long desrBy(String key, long delta) {
|
|
|
+// return redisTemplate.opsForValue().decrement(key, delta);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /** ================Hashes相关操作================ */
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 是否存在 hashkey
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param hashKey
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public boolean hasHashKey(String key, String hashKey) {
|
|
|
+// return redisTemplate.opsForHash().hasKey(key, hashKey);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 获取hash某个字段的值
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param hashKey
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public Object hget(String key, String hashKey) {
|
|
|
+// return redisTemplate.opsForHash().get(key, hashKey);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 获取hash所有键值(hashkey超过200个时禁止使用)
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public Map<Object, Object> hgetAll(String key) {
|
|
|
+// return redisTemplate.opsForHash().entries(key);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 获取hash对应多个字段的值
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param hashKeys
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public List<Object> hmget(String key, List<Object> hashKeys) {
|
|
|
+// return redisTemplate.opsForHash().multiGet(key, hashKeys);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * @param key
|
|
|
+// * @param map
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public boolean hmset(String key, Map<String, Object> map) {
|
|
|
+// try {
|
|
|
+// redisTemplate.opsForHash().putAll(key, map);
|
|
|
+// return true;
|
|
|
+// } catch (Exception e) {
|
|
|
+// e.printStackTrace();
|
|
|
+// return false;
|
|
|
+// }
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 不保证原子性
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param map
|
|
|
+// * @param expire
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public boolean hmset(String key, Map<String, Object> map, long expire) {
|
|
|
+// try {
|
|
|
+// redisTemplate.opsForHash().putAll(key, map);
|
|
|
+// expire(key, expire);
|
|
|
+// return true;
|
|
|
+// } catch (Exception e) {
|
|
|
+// e.printStackTrace();
|
|
|
+// return false;
|
|
|
+// }
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 设置hash中某个字段的值,如果不存在将创建
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param hashKey
|
|
|
+// * @param value
|
|
|
+// */
|
|
|
+// public void hset(String key, String hashKey, String value) {
|
|
|
+// redisTemplate.opsForHash().put(key, hashKey, value);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 设置hash中某个字段的值并指定key的过期时间,如果不存在将创建
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param hashKey
|
|
|
+// * @param value
|
|
|
+// * @param timeout 单位:秒
|
|
|
+// */
|
|
|
+// public void hset(String key, String hashKey, String value, long timeout) {
|
|
|
+// redisTemplate.opsForHash().put(key, hashKey, value);
|
|
|
+// expire(key, timeout);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 设置hash中某个字段的值,只有当这个字段不存在时才能设置成功
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param hashKey
|
|
|
+// * @param value
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public Boolean hsetNx(String key, String hashKey, String value) {
|
|
|
+// return redisTemplate.opsForHash().putIfAbsent(key, hashKey, value);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 删除hash中的多个字段
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param hashKey
|
|
|
+// */
|
|
|
+// public void hdel(String key, Object... hashKey) {
|
|
|
+// redisTemplate.opsForHash().delete(key, hashKey);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 将hash中的某个字段值增加delta
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param hashKey
|
|
|
+// * @param delta
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public Long hincrBy(String key, String hashKey, long delta) {
|
|
|
+// return redisTemplate.opsForHash().increment(key, hashKey, delta);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /** ================Lists相关操作================ */
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 返回list中指定范围的元素,第一个元素为0,最后一个元素为-1,倒数第二个为-2,以此类推。
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param start
|
|
|
+// * @param end
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public List<String> lrange(String key, long start, long end) {
|
|
|
+// return redisTemplate.opsForList().range(key, start, end);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 获取list的长度
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public Long llen(String key) {
|
|
|
+// return redisTemplate.opsForList().size(key);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 获取list中index索引的元素
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public String lindex(String key, long index) {
|
|
|
+// return redisTemplate.opsForList().index(key, index);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 向list的尾部插入指定的元素
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param value
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public Long rpush(String key, String value) {
|
|
|
+// return redisTemplate.opsForList().rightPush(key, value);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 向list的尾部插入多个元素
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param values
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public Long rpushAll(String key, Collection<String> values) {
|
|
|
+// return redisTemplate.opsForList().rightPushAll(key, values);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 移除并返回list尾部的元素
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public String rpop(String key) {
|
|
|
+// return redisTemplate.opsForList().rightPop(key);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 向list的头部插入指定的元素
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param value
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public Long lpush(String key, String value) {
|
|
|
+// return redisTemplate.opsForList().leftPush(key, value);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 向list的头部插入多个元素
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param values
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public Long lpushAll(String key, Collection<String> values) {
|
|
|
+// return redisTemplate.opsForList().leftPushAll(key, values);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 移除并返回list头部的元素
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public String lpop(String key) {
|
|
|
+// return redisTemplate.opsForList().leftPop(key);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 修改list中index索引对应元素的值
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param index
|
|
|
+// * @param value
|
|
|
+// */
|
|
|
+// public void lset(String key, long index, String value) {
|
|
|
+// redisTemplate.opsForList().set(key, index, value);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 从list中移除前count个出现值为value的元素
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param count count > 0: 从头往尾移除值为 value 的元素。</br>
|
|
|
+// * count < 0: 从尾往头移除值为 value 的元素。</br>
|
|
|
+// * count = 0: 移除所有值为 value 的元素。
|
|
|
+// * @param value
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public Long lrem(String key, long count, String value) {
|
|
|
+// return redisTemplate.opsForList().remove(key, count, value);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * lpop多个数据
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param count
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public List<Object> lpopMutil(String key, long count) {
|
|
|
+// List<Object> result = redisTemplate.executePipelined((RedisCallback<Object>) connection -> {
|
|
|
+// connection.lRange(key.getBytes(), 0, count - 1);
|
|
|
+// connection.lTrim(key.getBytes(), count, -1);
|
|
|
+// return null;
|
|
|
+// });
|
|
|
+// return result;
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * rpop多个数据
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param start 起始位置 end=-1
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public List<Object> rpopMutil(String key, long start) {
|
|
|
+// List<Object> result = redisTemplate.executePipelined((RedisCallback<Object>) connection -> {
|
|
|
+// connection.lRange(key.getBytes(), start, -1);
|
|
|
+// connection.lTrim(key.getBytes(), 0, start - 1);
|
|
|
+// return null;
|
|
|
+// });
|
|
|
+// return result;
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 从右取多个值
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param count 个数
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public List<Object> rpopMutil(String key, int count) {
|
|
|
+// List<Object> result = redisTemplate.executePipelined((RedisCallback<Object>) connection -> {
|
|
|
+// connection.lRange(key.getBytes(), 0 - count, -1);
|
|
|
+// connection.lTrim(key.getBytes(), 0, -1 - count);
|
|
|
+// return null;
|
|
|
+// });
|
|
|
+// return result;
|
|
|
+// }
|
|
|
+//
|
|
|
+// /** ================Sets相关操作================ */
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * set集合中是否存在值为value的元素
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param value
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public boolean sIsMember(String key, String value) {
|
|
|
+// return redisTemplate.opsForSet().isMember(key, value);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 返回set集合所有元素,禁止直接使用members,通过scan获取
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public Set<String> sscan(String key) {
|
|
|
+// Set<String> result = new HashSet<>();
|
|
|
+// Cursor<String> cursor = redisTemplate.opsForSet().scan(key, ScanOptions.NONE);
|
|
|
+// while (cursor != null && cursor.hasNext()) {
|
|
|
+// result.add(cursor.next());
|
|
|
+// }
|
|
|
+// return result;
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 向set集合添加多个元素
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param values
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public Long sadd(String key, String... values) {
|
|
|
+// return redisTemplate.opsForSet().add(key, values);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 返回set集合的元素个数
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public Long scard(String key) {
|
|
|
+// return redisTemplate.opsForSet().size(key);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 从set中移除值为value的元素
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param values
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public Long srem(String key, Object... values) {
|
|
|
+// return redisTemplate.opsForSet().remove(key, values);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /** ================Sorted Sets相关操作================ */
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 向zset集合添加一个元素,或者更新已存在元素的分数
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param vaule
|
|
|
+// * @param score
|
|
|
+// */
|
|
|
+// public void zadd(String key, String vaule, double score) {
|
|
|
+// redisTemplate.opsForZSet().add(key, vaule, score);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 向zset集合添加一个元素,或者更新已存在元素的分数,并更新key的过期时间
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param vaule
|
|
|
+// * @param score
|
|
|
+// */
|
|
|
+// public void zadd(String key, String vaule, double score, long timeout) {
|
|
|
+// redisTemplate.opsForZSet().add(key, vaule, score);
|
|
|
+// expire(key, timeout);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 获取某个元素的分数
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param value
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public Double zscore(String key, String value) {
|
|
|
+// return redisTemplate.opsForZSet().score(key, value);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 获取zset集合的元素数量
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public Long zcard(String key) {
|
|
|
+// return redisTemplate.opsForZSet().zCard(key);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * zset 范围内元素个数
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param min
|
|
|
+// * @param max
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public Long zcount(String key, double min, double max) {
|
|
|
+// return redisTemplate.opsForZSet().count(key, min, max);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 通过索引区间返回zset集合成指定区间内的元素,分数从小到大排序
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param start
|
|
|
+// * @param end
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public Set<String> zrange(String key, long start, long end) {
|
|
|
+// return redisTemplate.opsForZSet().range(key, start, end);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 通过索引区间返回zset集合成指定区间内的元素,分数从大到小排序
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param start
|
|
|
+// * @param end
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public Set<String> zreverseRange(String key, long start, long end) {
|
|
|
+// return redisTemplate.opsForZSet().reverseRange(key, start, end);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 通过索引区间返回zset集合成指定区间内的元素及分数
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param start
|
|
|
+// * @param end
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public List<Map<String, Double>> zrangeWithScores(String key, long start, long end) {
|
|
|
+// List<Map<String, Double>> result = new ArrayList<>();
|
|
|
+// Set<TypedTuple<String>> cursor = redisTemplate.opsForZSet().rangeWithScores(key, start, end);
|
|
|
+// for (Iterator<TypedTuple<String>> it = cursor.iterator(); it.hasNext(); ) {
|
|
|
+// TypedTuple<String> item = it.next();
|
|
|
+// Map<String, Double> map = new HashMap<>();
|
|
|
+// map.put(item.getValue(), item.getScore());
|
|
|
+// result.add(map);
|
|
|
+// }
|
|
|
+// return result;
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 通过索引区间返回zset集合成指定区间内的元素及分数
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param start
|
|
|
+// * @param end
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public List<Map<String, Object>> zrangeWithScoresToList(String key, long start, long end) {
|
|
|
+// List<Map<String, Object>> result = new ArrayList<>();
|
|
|
+// Set<TypedTuple<String>> cursor = redisTemplate.opsForZSet().rangeWithScores(key, start, end);
|
|
|
+// for (Iterator<TypedTuple<String>> it = cursor.iterator(); it.hasNext(); ) {
|
|
|
+// TypedTuple<String> item = it.next();
|
|
|
+// Map<String, Object> map = new HashMap<>();
|
|
|
+// map.put("value", item.getValue());
|
|
|
+// map.put("score", item.getScore());
|
|
|
+// result.add(map);
|
|
|
+// }
|
|
|
+// return result;
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 通过索引区间返回zset集合成指定区间内的元素及分数
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param start
|
|
|
+// * @param end
|
|
|
+// * @return map
|
|
|
+// */
|
|
|
+// public Map<String, Double> zrangeWithScoresToMap(String key, long start, long end) {
|
|
|
+// Map<String, Double> result = new HashMap<>();
|
|
|
+// Set<TypedTuple<String>> cursor = redisTemplate.opsForZSet().rangeWithScores(key, start, end);
|
|
|
+// for (Iterator<TypedTuple<String>> it = cursor.iterator(); it.hasNext(); ) {
|
|
|
+// TypedTuple<String> item = it.next();
|
|
|
+// result.put(item.getValue(), item.getScore());
|
|
|
+// }
|
|
|
+// return result;
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 迭代zset集合中的元素(只包括元素成员)
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public Set<String> zscanValues(String key) {
|
|
|
+// Set<String> result = new HashSet<>();
|
|
|
+// Cursor<TypedTuple<String>> cursor = redisTemplate.opsForZSet().scan(key, ScanOptions.NONE);
|
|
|
+// while (cursor.hasNext()) {
|
|
|
+// TypedTuple<String> item = cursor.next();
|
|
|
+// result.add(item.getValue());
|
|
|
+// }
|
|
|
+// return result;
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 迭代zset集合中的元素(包括元素和分数)
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public List<Map<String, Double>> zscan(String key) {
|
|
|
+// List<Map<String, Double>> result = new ArrayList<Map<String, Double>>();
|
|
|
+// Cursor<TypedTuple<String>> cursor = redisTemplate.opsForZSet().scan(key, ScanOptions.NONE);
|
|
|
+// while (cursor.hasNext()) {
|
|
|
+// TypedTuple<String> item = cursor.next();
|
|
|
+// Map<String, Double> map = new HashMap<String, Double>();
|
|
|
+// map.put(item.getValue(), item.getScore());
|
|
|
+// result.add(map);
|
|
|
+// }
|
|
|
+// return result;
|
|
|
+//
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 移除zset集合中的元素
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param values
|
|
|
+// */
|
|
|
+// public void zRemove(String key, Object... values) {
|
|
|
+// redisTemplate.opsForZSet().remove(key, values);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 移除zset集合指定范围数据
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param start
|
|
|
+// * @param end
|
|
|
+// */
|
|
|
+// public void zRemRange(String key, long start, long end) {
|
|
|
+// redisTemplate.opsForZSet().removeRange(key, start, end);
|
|
|
+// }
|
|
|
+//
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 删除
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param min
|
|
|
+// * @param max
|
|
|
+// */
|
|
|
+// public void zRemRangeByScore(String key, double min, double max) {
|
|
|
+// redisTemplate.opsForZSet().removeRangeByScore(key, min, max);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 加锁 不可重入
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @param timeout 毫秒
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public Boolean lock(String key, long timeout) {
|
|
|
+// return redisTemplate.opsForValue().setIfAbsent(LOCK_PREFIX + key, "1", timeout, TimeUnit.MILLISECONDS);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 解锁 不可重入
|
|
|
+// *
|
|
|
+// * @param key
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public Boolean unlock(String key) {
|
|
|
+// return redisTemplate.delete(LOCK_PREFIX + key);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 加锁
|
|
|
+// *
|
|
|
+// * @param key key
|
|
|
+// * @param reentrantId 重入Id
|
|
|
+// * @param timeout 超时时间 毫秒ms
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public Boolean lock(String key, String reentrantId, long timeout) {
|
|
|
+// return lock(key, reentrantId, timeout, DEFAULT_RETRIES);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 加锁
|
|
|
+// *
|
|
|
+// * @param key key
|
|
|
+// * @param reentrantId 重入Id
|
|
|
+// * @param timeout 超时时间 毫秒ms
|
|
|
+// * @param retries 重试次数
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public Boolean lock(String key, String reentrantId, long timeout, int retries) {
|
|
|
+// return lock(key, reentrantId, timeout, retries, DEFAULT_INTERVAL);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 加锁
|
|
|
+// *
|
|
|
+// * @param key key
|
|
|
+// * @param reentrantId 重入Id
|
|
|
+// * @param timeout 超时时间 毫秒ms
|
|
|
+// * @param retries 重试次数
|
|
|
+// * @param interval 每次重试间隔时间 毫秒
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public Boolean lock(String key, String reentrantId, long timeout, int retries, long interval) {
|
|
|
+// String lockKey = LOCK_PREFIX + key;
|
|
|
+// DefaultRedisScript<Long> script = new DefaultRedisScript<>();
|
|
|
+// script.setResultType(Long.class);
|
|
|
+// script.setScriptSource(new StaticScriptSource(LOCK));
|
|
|
+// for (int i = 0; i < retries; i++) {
|
|
|
+// Object result = redisTemplate.execute(script, Arrays.asList(lockKey), String.valueOf(timeout), reentrantId);
|
|
|
+// if (Objects.nonNull(result) && Objects.equals(1L, Long.valueOf(result.toString()))) {
|
|
|
+// return true;
|
|
|
+// }
|
|
|
+// try {
|
|
|
+// TimeUnit.MILLISECONDS.sleep(interval);
|
|
|
+// } catch (InterruptedException e) {
|
|
|
+// e.printStackTrace();
|
|
|
+// return null;
|
|
|
+// }
|
|
|
+// }
|
|
|
+// return false;
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 解锁
|
|
|
+// *
|
|
|
+// * @param key key
|
|
|
+// * @param reentrantId 重入ID
|
|
|
+// */
|
|
|
+// public Boolean unlock(String key, String reentrantId) {
|
|
|
+// String lockKey = LOCK_PREFIX + key;
|
|
|
+// DefaultRedisScript<Long> script = new DefaultRedisScript<>();
|
|
|
+// script.setResultType(Long.class);
|
|
|
+// script.setScriptSource(new StaticScriptSource(UNLOCK));
|
|
|
+// Object result = redisTemplate.execute(script, Arrays.asList(lockKey), reentrantId);
|
|
|
+// if (Objects.isNull(result)) {
|
|
|
+// return null;
|
|
|
+// }
|
|
|
+// if (Objects.equals(1L, Long.valueOf(result.toString()))) {
|
|
|
+// return true;
|
|
|
+// }
|
|
|
+// return false;
|
|
|
+// }
|
|
|
+//
|
|
|
+//}
|