redis分布式锁封装 redis分布式锁实现 封装Spring工具Redis工具类 redis操作类封装 redis锁封装 redis分布式锁封装
import java.io.Serializable;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
import org.checkerframework.checker.units.qual.K;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.annotation.Configuration;
import org.springframework.dao.DataAccessException;
import org.springframework.data.domain.Range;
import org.springframework.data.redis.connection.RedisConnection;
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.ZSetOperations.TypedTuple;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.data.redis.serializer.RedisSerializer;
@Slf4j
@Configuration
@ConditionalOnBean(RedisConfig.class)
public class RedisUtils {private static final String LOCK_PREFIX = "PROJECT_NAME_";private static final Long LOCK_EXPIRE = 1000L;public static final String UNLOCK_LUA_SCRIPT = "if redis.call('get',KEYS[1]) == ARGV[1] then return redis.call('del',KEYS[1]) else return 0 end";@Autowiredprivate RedisTemplate redisTemplate;@Resource(name = "redisTemplateOutTenant")private RedisTemplate redisTemplateOutTenant;public boolean lock(String key) {String lock = LOCK_PREFIX + key;return (Boolean) redisTemplate.execute(new RedisCallback() {@Overridepublic Object doInRedis(RedisConnection connection) throws DataAccessException {long expireAt = System.currentTimeMillis() + LOCK_EXPIRE + 1;Boolean acquire = connection.setNX(lock.getBytes(), String.valueOf(expireAt).getBytes());if (acquire) {return true;} else {byte[] value = connection.get(lock.getBytes());if (Objects.nonNull(value) && value.length > 0) {long expireTime = Long.parseLong(new String(value));if (expireTime < System.currentTimeMillis()) {byte[] oldValue = connection.getSet(lock.getBytes(),String.valueOf(System.currentTimeMillis() + LOCK_EXPIRE + 1).getBytes());return Long.parseLong(new String(oldValue)) < System.currentTimeMillis();}}}return false;}});}@Deprecatedpublic boolean lock(String key, Long lockExpire) {return (Boolean) redisTemplate.execute(new RedisCallback() {@Overridepublic Object doInRedis(RedisConnection connection) throws DataAccessException {long expireAt = System.currentTimeMillis() + LOCK_EXPIRE + 1;Boolean acquire = connection.setNX(key.getBytes(), String.valueOf(expireAt).getBytes());connection.expire(key.getBytes(), lockExpire);if (acquire) {return true;} else {byte[] value = connection.get(key.getBytes());if (Objects.nonNull(value) && value.length > 0) {long expireTime = Long.parseLong(new String(value));if (expireTime < System.currentTimeMillis()) {byte[] oldValue = connection.getSet(key.getBytes(),String.valueOf(System.currentTimeMillis() + LOCK_EXPIRE + 1).getBytes());connection.expire(key.getBytes(), lockExpire);return Long.parseLong(new String(oldValue)) < System.currentTimeMillis();}}}return false;}});}public boolean lockOutTenant(String key, long lockExpire) {String lock = key;return (Boolean) redisTemplateOutTenant.execute(new RedisCallback() {@Overridepublic Object doInRedis(RedisConnection connection) throws DataAccessException {long expireAt = System.currentTimeMillis() + lockExpire + 1;Boolean acquire = connection.setNX(lock.getBytes(), String.valueOf(expireAt).getBytes());if (acquire) {return true;} else {byte[] value = connection.get(lock.getBytes());if (Objects.nonNull(value) && value.length > 0) {long expireTime = Long.parseLong(new String(value));if (expireTime < System.currentTimeMillis()) {byte[] oldValue = connection.getSet(lock.getBytes(),String.valueOf(System.currentTimeMillis() + lockExpire + 1).getBytes());return Long.parseLong(new String(oldValue)) < System.currentTimeMillis();}}}return false;}});}public boolean tryLock(String key, long waitTime, long expireTime, TimeUnit unit) {return tryLock(key, waitTime, expireTime, unit, String.valueOf(Thread.currentThread().getId()));}public boolean tryLock(String key, long waitTime, long expireTime, TimeUnit unit,long sleepTime) {return tryLock(key, waitTime, expireTime, unit, String.valueOf(Thread.currentThread().getId()),sleepTime);}public boolean tryLock(String key, long waitTime, long expireTime, TimeUnit unit, String lockNo) {return tryLock(key, waitTime, expireTime, unit, lockNo, 100);}public boolean tryLock(String key, long waitTime, long expireTime, TimeUnit unit, String lockNo,long sleepTime) {long MAX_WAIT_TIME = 1000 * 60 * 3;long time = Math.min(unit.toMillis(waitTime), MAX_WAIT_TIME);long start = System.currentTimeMillis();try {while (true) {Boolean lock = redisTemplateOutTenant.opsForValue().setIfAbsent(key, lockNo, expireTime, unit);if (Boolean.TRUE.equals(lock)) {return true;}if (time <= System.currentTimeMillis() - start) {log.debug(">> Arrival waiting time.");return false;}Thread.sleep(sleepTime);}} catch (InterruptedException e) {log.error("tryLock Error", e);}return false;}public boolean unlock(String key) {return unlock(key, String.valueOf(Thread.currentThread().getId()));}public boolean unlock(String key, String lockNo) {return (Long) redisTemplateOutTenant.execute(new DefaultRedisScript<>(UNLOCK_LUA_SCRIPT, Long.class), Collections.singletonList(key),lockNo) == 1;}public void delete(String key) {redisTemplate.delete(key);}public void deleteOutTenant(String key) {redisTemplateOutTenant.delete(key);}public void deleteOutTenant(Collection<String> keys) {redisTemplateOutTenant.delete(keys);}public void del(String... key) {if (key != null && key.length > 0) {redisTemplate.delete(key);}}public boolean expireOutTenant(String key, long time) {try {if (time > 0) {redisTemplateOutTenant.expire(key, time, TimeUnit.SECONDS);}return true;} catch (Exception e) {log.error("failed in expire, e: {}", e.getMessage(), e);return false;}}public long getExpireTime(String key) {return redisTemplate.getExpire(key, TimeUnit.SECONDS);}public boolean hasKey(String key) {try {return redisTemplate.hasKey(key);} catch (Exception e) {log.error("failed in hasKey, e: {}", e.getMessage(), e);return false;}}public boolean hasKeyOutTenant(String key) {try {return redisTemplateOutTenant.hasKey(key);} catch (Exception e) {log.error("failed in hasKey, e: {}", e.getMessage(), e);return false;}}public long bitMapCount(String key) {try {RedisSerializer<Serializable> keySerializer =(RedisSerializer<Serializable>) redisTemplate.getKeySerializer();return (long) redisTemplate.execute((RedisCallback<Long>) con -> con.bitCount(Objects.requireNonNull(keySerializer.serialize(key))));} catch (Exception e) {log.error("failed in bitMapCount, e: {},key:{}", e, key);return 0;}}public long bitMapCount(String key, long start, long end) {try {RedisSerializer<Serializable> keySerializer =(RedisSerializer<Serializable>) redisTemplate.getKeySerializer();return (long) redisTemplate.execute((RedisCallback<Long>) con -> con.bitCount(Objects.requireNonNull(keySerializer.serialize(key)), start, end));} catch (Exception e) {log.error("failed in bitMapCount, e: {},key:{}", e, key);return 0;}}public long bitMapPos(String key, boolean bit) {try {RedisSerializer<Serializable> keySerializer =(RedisSerializer<Serializable>) redisTemplate.getKeySerializer();return (long) redisTemplate.execute((RedisCallback<Long>) con -> con.bitPos(Objects.requireNonNull(keySerializer.serialize(key)), bit));} catch (Exception e) {log.error("failed in bitMapCount, e: {},key:{}", e, key);return 0;}}public long bitMapPos(String key, boolean bit, long start, long end) {try {Range<Long> range = Range.of(Range.Bound.exclusive(start), Range.Bound.exclusive(end));RedisSerializer<Serializable> keySerializer =(RedisSerializer<Serializable>) redisTemplate.getKeySerializer();return (long) redisTemplate.execute((RedisCallback<Long>) con -> con.bitPos(Objects.requireNonNull(keySerializer.serialize(key)), bit, range));} catch (Exception e) {log.error("failed in bitMapCount, e: {},key:{}", e, key);return 0;}}public Object get(String key) {return key == null ? null : redisTemplate.opsForValue().get(key);}public Object getOutTenant(String key) {return key == null ? null : redisTemplateOutTenant.opsForValue().get(key);}public boolean set(String key, Object value, long time) {try {redisTemplate.opsForValue().set(key, value, time);return true;} catch (Exception e) {log.error("failed in set, e: {}", e.getMessage(), e);return false;}}public boolean setOutTenant(String key, Object value, long time) {try {redisTemplateOutTenant.opsForValue().set(key, value, time, TimeUnit.SECONDS);return true;} catch (Exception e) {log.error("failed in set, e: {}", e.getMessage(), e);return false;}}public boolean setOutTenant(String key, Object value) {try {redisTemplateOutTenant.opsForValue().set(key, value);return true;} catch (Exception e) {log.error("failed in set, e: {}", e.getMessage(), e);return false;}}public Long initIncrementOutTenant(String key, long value) {try {redisTemplateOutTenant.delete(key);return redisTemplateOutTenant.opsForValue().increment(key, value);} catch (Exception e) {log.error("failed in initIncrementOutTenant, e: {}", e.getMessage(), e);return 0L;}}public long incrOutTenant(String key, long delta) {return redisTemplateOutTenant.opsForValue().increment(key, delta);}public long decrOutTenant(String key) {return redisTemplateOutTenant.opsForValue().decrement(key);}public long decr(String key, long delta) {if (delta < 0) {throw new RuntimeException("递减因子必须大于0");}return redisTemplate.opsForValue().increment(key, -delta);}public Object hget(String key, String item) {return redisTemplate.opsForHash().get(key, item);}public List hMultiGet(String key, Collection<String> items) {return redisTemplate.opsForHash().multiGet(key, items);}public List hMultiGetOutTenant(String key, Collection<String> items) {return redisTemplateOutTenant.opsForHash().multiGet(key, items);}public Map<String, Object> hmgetOutTenant(String cacheKey, List<String> keys) {Map<String, Object> result = new HashMap();List list = hMultiGetOutTenant(cacheKey, keys);for (int i = 0; i < list.size(); i++) {result.put(keys.get(i), list.get(i));}return result;}public Map hgetMap(String key) {return redisTemplate.opsForHash().entries(key);}public Map hgetMapOutTenant(String key) {return redisTemplateOutTenant.opsForHash().entries(key);}public Map<String, Map> hgetMultiHashOutTenant(Set<String> keys) {return (Map<String, Map>) redisTemplateOutTenant.execute((RedisCallback) con -> {Iterator<String> it = keys.iterator();Map<String, Map> mapList = new HashMap<>();while (it.hasNext()) {String key = it.next();Map<byte[], byte[]> result = con.hGetAll(key.getBytes());Map ans;if (MapUtils.isNotEmpty(result)) {ans = new HashMap<>(result.size());for (Map.Entry entry : result.entrySet()) {RedisSerializer hashKeySerializer = redisTemplateOutTenant.getHashKeySerializer();RedisSerializer hashValueSerializer = redisTemplateOutTenant.getHashValueSerializer();ans.put(hashKeySerializer.deserialize((byte[]) entry.getKey()),hashValueSerializer.deserialize((byte[]) entry.getValue()));}mapList.put(key, ans);continue;}mapList.put(key, Collections.emptyMap());}return mapList;});}public Object hgetOutTenant(String key, String item) {return redisTemplateOutTenant.opsForHash().get(key, item);}public Map<Object, Object> hmget(String key) {return redisTemplate.opsForHash().entries(key);}public boolean hmset(String key, Map<String, Object> map) {try {redisTemplate.opsForHash().putAll(key, map);return true;} catch (Exception e) {log.error("failed in hmset, e: {}", e.getMessage(), e);return false;}}public boolean hmset(String key, Map<String, Object> map, long time) {try {redisTemplate.opsForHash().putAll(key, map);if (time > 0) {expire(key, time);}return true;} catch (Exception e) {log.error("failed in hmset, e: {}", e.getMessage(), e);return false;}}public boolean hmsetOutTenant(String key, Map<String, Object> map) {return this.hmsetOutTenant(key, map, 0);}public boolean hmsetOutTenant(String key, Map<String, Object> map, long time) {try {redisTemplateOutTenant.opsForHash().putAll(key, map);if (time > 0) {expireOutTenant(key, time);}return true;} catch (Exception e) {log.error("failed in hmset, e: {}", e.getMessage(), e);return false;}}public boolean expire(String key, long time) {try {if (time > 0) {redisTemplate.expire(key, time, TimeUnit.SECONDS);}return true;} catch (Exception e) {log.error("failed in expire, e: {}", e.getMessage(), e);return false;}}public boolean hset(String key, String item, Object value) {try {redisTemplate.opsForHash().put(key, item, value);return true;} catch (Exception e) {log.error("failed in hset, e: {}", e.getMessage(), e);return false;}}public boolean hsetOutTenant(String key, String item, Object value) {try {redisTemplateOutTenant.opsForHash().put(key, item, value);return true;} catch (Exception e) {log.error("failed in hset, e: {}", e.getMessage(), e);return false;}}public boolean hsetIfAbsentOutTenant(String key, String item, Object value) {try {return redisTemplateOutTenant.opsForHash().putIfAbsent(key, item, value);} catch (Exception e) {log.error("failed in hsetnx, e: {}", e.getMessage(), e);return false;}}public boolean hset(String key, String item, Object value, long time) {try {redisTemplate.opsForHash().put(key, item, value);if (time > 0) {expire(key, time);}return true;} catch (Exception e) {log.error("failed in hset, e: {}", e.getMessage(), e);return false;}}public boolean hsetNoCoverTime(String key, String item, Object value, long time) {try {boolean has = redisTemplate.hasKey(key);redisTemplate.opsForHash().put(key, item, value);if (time > 0 && !has) {expire(key, time);}return true;} catch (Exception e) {log.error("failed in hset, e: {}", e.getMessage(), e);return false;}}public boolean hMultiSetNoCoverTime(String key, Map map, long time) {try {boolean has = redisTemplate.hasKey(key);redisTemplate.opsForHash().putAll(key, map);if (time > 0 && !has) {expire(key, time);}return true;} catch (Exception e) {log.error("failed in hset, e: {}", e.getMessage(), e);return false;}}public boolean hMultiSetNoCoverTimeOutTenant(String key, Map map, long time) {try {boolean has = redisTemplateOutTenant.hasKey(key);redisTemplateOutTenant.opsForHash().putAll(key, map);if (time > 0 && !has) {expireOutTenant(key, time);}return true;} catch (Exception e) {log.error("failed in hset, e: {}", e.getMessage(), e);return false;}}public boolean hMultiSet(String key, Map map) {try {redisTemplate.opsForHash().putAll(key, map);return true;} catch (Exception e) {log.error("failed in hset, e: {}", e.getMessage(), e);return false;}}public boolean hsetNoCoverTimeOutTenant(String key, String item, Object value, long time) {try {boolean has = redisTemplate.hasKey(key);redisTemplateOutTenant.opsForHash().put(key, item, value);if (time > 0 && !has) {expireOutTenant(key, time);}return true;} catch (Exception e) {log.error("failed in hset, e: {}", e.getMessage(), e);return false;}}public boolean hsetOutTenant(String key, String item, Object value, long time) {try {redisTemplateOutTenant.opsForHash().put(key, item, value);if (time > 0) {expireOutTenant(key, time);}return true;} catch (Exception e) {log.error("failed in hset, e: {}", e.getMessage(), e);return false;}}public void hdel(String key, Object... item) {redisTemplate.opsForHash().delete(key, item);}public void hdelOutTenant(String key, Object... item) {redisTemplateOutTenant.opsForHash().delete(key, item);}public boolean hHasKey(String key, String item) {return redisTemplate.opsForHash().hasKey(key, item);}public double hincr(String key, String item, double by) {return redisTemplate.opsForHash().increment(key, item, by);}public double hdecr(String key, String item, double by) {return redisTemplate.opsForHash().increment(key, item, -by);}public Set<Object> sGet(String key) {try {return redisTemplate.opsForSet().members(key);} catch (Exception e) {log.error("failed in sGet, e: {}", e.getMessage(), e);return null;}}public Set<Object> sGetOutTenant(String key) {try {return redisTemplateOutTenant.opsForSet().members(key);} catch (Exception e) {log.error("failed in sGet, e: {}", e.getMessage(), e);return null;}}public Set<Object> sUnion(String... key) {if (key.length == 1) {return sGet(key[0]);}List<String> keys = Arrays.stream(key, 1, key.length).collect(Collectors.toList());try {return redisTemplate.opsForSet().union(key[0], keys);} catch (Exception e) {log.error("failed in sUnion", e);return Collections.emptySet();}}public Set<Object> sUnionOutTenant(String... key) {if (key.length == 1) {return sGetOutTenant(key[0]);}List<String> keys = Arrays.stream(key, 1, key.length).collect(Collectors.toList());try {return redisTemplateOutTenant.opsForSet().union(key[0], keys);} catch (Exception e) {log.error("failed in sUnion", e);return Collections.emptySet();}}public Set<Object> sUnion(List<String> keys) {if (keys.size() == 1) {return sGet(keys.get(0));}try {return redisTemplate.opsForSet().union(keys.get(0), keys.subList(1, keys.size()));} catch (Exception e) {log.error("failed in sUnion", e);return Collections.emptySet();}}public Set<Object> sUnionOutTenant(List<String> keys) {if (keys.size() == 1) {return sGetOutTenant(keys.get(0));}try {return redisTemplateOutTenant.opsForSet().union(keys.get(0), keys.subList(1, keys.size()));} catch (Exception e) {log.error("failed in sUnion", e);return Collections.emptySet();}}public boolean sHasKey(String key, Object value) {try {return redisTemplate.opsForSet().isMember(key, value);} catch (Exception e) {log.error("failed in sHasKey, e: {}", e.getMessage(), e);return false;}}public boolean sHasKeyOutTenant(String key, Object value) {try {return redisTemplateOutTenant.opsForSet().isMember(key, value);} catch (Exception e) {log.error("failed in sHasKey, e: {}", e.getMessage(), e);return false;}}public Set keys(String pattern) {try {return redisTemplate.keys(pattern);} catch (Exception e) {log.error("failed in keys, e: {}", e.getMessage(), e);return null;}}public long sSet(String key, Object... values) {try {return redisTemplate.opsForSet().add(key, values);} catch (Exception e) {log.error("failed in sSet, e: {}", e.getMessage(), e);return 0;}}public long sSetOutTenant(String key, Object... values) {try {return redisTemplateOutTenant.opsForSet().add(key, values);} catch (Exception e) {log.error("failed in sSet, e: {}", e.getMessage(), e);return 0;}}public long sSetOutTenantExpire(String key, long time, Object... values) {try {long count = redisTemplateOutTenant.opsForSet().add(key, values);if (time > 0) {expireOutTenant(key, time);}return count;} catch (Exception e) {log.error("failed in sSet, e: {}", e.getMessage(), e);return 0;}}public long sSetAndTime(String key, long time, Object... values) {try {Long count = redisTemplate.opsForSet().add(key, values);if (time > 0) {expire(key, time);}return count;} catch (Exception e) {log.error("failed in sSetAndTime, e: {}", e.getMessage(), e);return 0;}}public long sSetAndTimeOutTenant(String key, long time, Object... values) {try {Long count = redisTemplateOutTenant.opsForSet().add(key, values);if (time > 0) {expire(key, time);}return count;} catch (Exception e) {log.error("failed in sSetAndTime, e: {}", e.getMessage(), e);return 0;}}public long sGetSetSize(String key) {try {return redisTemplate.opsForSet().size(key);} catch (Exception e) {log.error("failed in sGetSetSize, e: {}", e.getMessage(), e);return 0;}}public long sGetSetSizeOutTenant(String key) {try {return redisTemplateOutTenant.opsForSet().size(key);} catch (Exception e) {log.error("failed in sGetSetSize, e: {}", e.getMessage(), e);return 0;}}public long setRemove(String key, Object... values) {try {Long count = redisTemplate.opsForSet().remove(key, values);return count;} catch (Exception e) {log.error("failed in setRemove, e: {}", e.getMessage(), e);return 0;}}public long setRemoveOutTenant(String key, Object... values) {try {Long count = redisTemplateOutTenant.opsForSet().remove(key, values);return count;} catch (Exception e) {log.error("failed in setRemove, e: {}", e.getMessage(), e);return 0;}}public List<Object> lGet(String key, long start, long end) {try {return redisTemplate.opsForList().range(key, start, end);} catch (Exception e) {log.error("failed in lGet, e: {}", e.getMessage(), e);return null;}}public List<Object> lGetOutTenant(String key, long start, long end) {try {return redisTemplateOutTenant.opsForList().range(key, start, end);} catch (Exception e) {log.error("failed in lGetOutTenant, e: {}", e.getMessage(), e);return null;}}public Set<K> lGetAllKeysOutTenant(String key) {try {return redisTemplateOutTenant.keys(key);} catch (Exception e) {log.error("failed in lGetAllKeysOutTenant, e: {}", e.getMessage(), e);return null;}}public Set<String> lGetAllStringKeysOutTenant(String key) {try {return redisTemplateOutTenant.keys(key);} catch (Exception e) {log.error("failed in lGetAllKeysOutTenant, e: {}", e.getMessage(), e);return null;}}public boolean trimListOutTenant(String key, long start, long end) {try {redisTemplateOutTenant.opsForList().trim(key, start, end);return true;} catch (Exception e) {log.error("trimListOutTenant , e: {}", e.getMessage(), e);return false;}}public long lGetListSize(String key) {try {return redisTemplate.opsForList().size(key);} catch (Exception e) {log.error("failed in lGetListSize, e: {}", e.getMessage(), e);return 0;}}public <T> List<T> listRangeOutTenant(String key, long start, long end) {try {return redisTemplateOutTenant.opsForList().range(key, start, end);} catch (Exception e) {log.error("failed in lGetListSize, e: {}", e.getMessage(), e);return null;}}public long lGetListSizeOutTenat(String key) {try {return redisTemplateOutTenant.opsForList().size(key);} catch (Exception e) {log.error("failed in lGetListSizeOutTenat, e: {}", e.getMessage(), e);return 0;}}public Object lGetIndex(String key, long index) {try {return redisTemplate.opsForList().index(key, index);} catch (Exception e) {log.error("failed in lGetIndex, e: {}", e.getMessage(), e);return null;}}public Object lGetIndexOutTenat(String key, long index) {try {return redisTemplateOutTenant.opsForList().index(key, index);} catch (Exception e) {log.error("failed in lGetIndexOutTenat, e: {}", e.getMessage(), e);return null;}}public boolean lSet(String key, Object value) {try {redisTemplate.opsForList().rightPush(key, value);return true;} catch (Exception e) {log.error("failed in lSet, e: {}", e.getMessage(), e);return false;}}public boolean lSetOutTenant(String key, Object value) {try {redisTemplateOutTenant.opsForList().rightPush(key, value);return true;} catch (Exception e) {log.error("failed in lSetOutTenant, e: {}", e.getMessage(), e);return false;}}public boolean lSet(String key, Object value, long time) {try {redisTemplate.opsForList().rightPush(key, value);if (time > 0) {expire(key, time);}return true;} catch (Exception e) {log.error("failed in lSet, e: {}", e.getMessage(), e);return false;}}public boolean lSetAndExpireOutTenant(String key, Object value, long time) {try {redisTemplateOutTenant.opsForList().rightPush(key, value);if (time > 0) {expireOutTenant(key, time);}return true;} catch (Exception e) {log.error("failed in lSetAndExpireOutTenant, e: {}", e.getMessage(), e);return false;}}public boolean lSet(String key, List<Object> value) {try {redisTemplate.opsForList().rightPushAll(key, value);return true;} catch (Exception e) {log.error("failed in lSet, e: {}", e.getMessage(), e);return false;}}public <T> boolean lSetAllRightOutTenant(String key, List<T> value) {try {redisTemplateOutTenant.opsForList().rightPushAll(key, value);return true;} catch (Exception e) {log.error("failed in lSetAllOutTenant, e: {}", e.getMessage(), e);return false;}}public <T> boolean lSet(String key, List<T> value, long time) {try {redisTemplate.opsForList().rightPushAll(key, value);if (time > 0) {expire(key, time);}return true;} catch (Exception e) {log.error("failed in lSet, e: {}", e.getMessage(), e);return false;}}public <T> boolean lSetAllAndExpireOutTenant(String key, List<T> value, long time) {try {redisTemplateOutTenant.opsForList().rightPushAll(key, value);if (time > 0) {expireOutTenant(key, time);}return true;} catch (Exception e) {log.error("failed in lSetAllAndExpireOutTenant, e: {}", e.getMessage(), e);return false;}}public boolean lUpdateIndex(String key, long index, Object value) {try {redisTemplate.opsForList().set(key, index, value);return true;} catch (Exception e) {log.error("failed in lUpdateIndex, e: {}", e.getMessage(), e);return false;}}public boolean lUpdateIndexOutTenant(String key, long index, Object value) {try {redisTemplateOutTenant.opsForList().set(key, index, value);return true;} catch (Exception e) {log.error("failed in lUpdateIndexOutTenant, e: {}", e.getMessage(), e);return false;}}public long lRemove(String key, long count, Object value) {try {Long remove = redisTemplate.opsForList().remove(key, count, value);return remove;} catch (Exception e) {log.error("failed in lRemove, e: {}", e.getMessage(), e);return 0;}}public long lRemoveOutTenant(String key, long count, Object value) {try {Long remove = redisTemplateOutTenant.opsForList().remove(key, count, value);return remove;} catch (Exception e) {log.error("failed in lRemoveOutTenant, e: {}", e.getMessage(), e);return 0;}}public boolean deleteByKeysOutTenant(Collection<String> keys) {try {redisTemplateOutTenant.delete(keys);return true;} catch (Exception e) {log.error("failed in delete Keys, e: {}", e.getMessage(), e);return false;}}public boolean addZsetOutTenant(String key, Object object, double score) {try {redisTemplateOutTenant.opsForZSet().add(key, object, score);} catch (Exception e) {log.error("failed in addZset , e: {}", e.getMessage(), e);return false;}return true;}public boolean addZsetOutTenant(String key, Set<TypedTuple<Object>> set) {try {redisTemplateOutTenant.opsForZSet().add(key, set);} catch (Exception e) {log.error("failed in addZset , e: {}", e.getMessage(), e);return false;}return true;}public boolean delZsetOutTenant(String key, long startScore, long endScore) {try {redisTemplateOutTenant.opsForZSet().removeRangeByScore(key, startScore, endScore);} catch (Exception e) {log.error("failed in delZset , e: {}", e.getMessage(), e);return false;}return true;}public boolean delZsetByRangeOutTenant(String key, long timeStart, long timeEnd) {try {redisTemplateOutTenant.opsForZSet().removeRange(key, timeStart, timeEnd);} catch (Exception e) {log.error("failed in delZsetByRange , e: {}", e.getMessage(), e);return false;}return true;}public boolean delZsetValuesOutTenant(String key, Object... values) {try {redisTemplateOutTenant.opsForZSet().remove(key, values);} catch (Exception e) {log.error("failed in delZsetValuesOutTenant , e: {}", e.getMessage(), e);return false;}return true;}public boolean delZsetByRangeScoreOutTenant(String key, double startScore, double endScore) {try {redisTemplateOutTenant.opsForZSet().removeRangeByScore(key, startScore, endScore);} catch (Exception e) {log.error("failed in delZsetByRangeScore , e: {}", e.getMessage(), e);return false;}return true;}public long countByScoreOutTenant(String key, double startScore, double endScore) {try {return redisTemplateOutTenant.opsForZSet().count(key, startScore, endScore);} catch (Exception e) {log.error("failed in delZsetByRangeScore , e: {}", e.getMessage(), e);return 0;}}public <V> Set<V> getZsetByRangeOutTenant(String key, long timeStart, long timeEnd) {try {return redisTemplateOutTenant.opsForZSet().range(key, timeStart, timeEnd);} catch (Exception e) {log.error("failed in getZsetByRange , e: {}", e.getMessage(), e);return new HashSet<>();}}public <V> Set<V> getZsetByRangeScoreOutTenant(String key, long scoreStart, long scoreEnd) {try {return redisTemplateOutTenant.opsForZSet().rangeByScore(key, scoreStart, scoreEnd);} catch (Exception e) {log.error("failed in getZsetByRangeScore , e: {}", e.getMessage(), e);return new HashSet<>();}}public boolean setBitOutTenant(String key, long offset, boolean bit) {try {return redisTemplateOutTenant.opsForValue().setBit(key, offset, bit);} catch (Exception e) {log.error("failed in setBitOutTenant , e: {}", e.getMessage(), e);return false;}}public boolean setBitOutTenant(String key, long offset, boolean bit, long time) {try {boolean has = redisTemplateOutTenant.hasKey(key);redisTemplateOutTenant.opsForValue().setBit(key, offset, bit);if (!has && time > 0) {expireOutTenant(key, time);}return true;} catch (Exception e) {log.error("failed in setBitOutTenant , e: {}", e.getMessage(), e);return false;}}public boolean getBitOutTenant(String key, long offset) {try {return redisTemplateOutTenant.opsForValue().getBit(key, offset);} catch (Exception e) {log.error("failed in getBitOutTenant , e: {}", e.getMessage(), e);return false;}}public <V> List<V> getAllValueListOutTenant(Collection<String> key) {try {return redisTemplateOutTenant.opsForValue().multiGet(key);} catch (Exception e) {log.error("failed in getAllBitByKeyOutTenant , e: {}", e.getMessage(), e);return Collections.emptyList();}}public void putAllValueListOutTenant(Map map) {try {redisTemplateOutTenant.opsForValue().multiSet(map);} catch (Exception e) {log.error("failed in putAllValueListOutTenant , e: {}", e.getMessage(), e);}}public void putAllValueListOutTenantAndExpire(Map<String, Object> map, long expireTime) {try {Collection<String> keys = map.keySet();redisTemplateOutTenant.opsForValue().multiSet(map);RedisSerializer<Serializable> keySerializer =(RedisSerializer<Serializable>) redisTemplateOutTenant.getKeySerializer();redisTemplateOutTenant.executePipelined((RedisCallback) connection -> {keys.forEach(o -> connection.expire(keySerializer.serialize(o), expireTime));return null;});} catch (Exception e) {log.error("failed in putAllValueListOutTenant , e: {}", e.getMessage(), e);}}public boolean setBit(String key, long offset, boolean bit) {try {return redisTemplate.opsForValue().setBit(key, offset, bit);} catch (Exception e) {log.error("failed in setBit , e: {}", e.getMessage(), e);return false;}}public boolean setBit(String key, long offset, boolean bit, long time) {try {boolean has = redisTemplate.hasKey(key);redisTemplate.opsForValue().setBit(key, offset, bit);if (!has && time > 0) {expireOutTenant(key, time);}return true;} catch (Exception e) {log.error("failed in setBit , e: {}", e.getMessage(), e);return false;}}public boolean getBit(String key, long offset) {try {return redisTemplate.opsForValue().getBit(key, offset);} catch (Exception e) {log.error("failed in getBit , e: {}", e.getMessage(), e);return false;}}public void sendMessage(String topic, Object message) {try {redisTemplateOutTenant.convertAndSend(topic, message);} catch (Exception e) {log.error("failed in sendMessage , e: {}", e.getMessage(), e);throw new RuntimeException(e.toString());}redisTemplateOutTenant.convertAndSend(topic, message);}public boolean lpush(String key, Object value) {try {redisTemplateOutTenant.opsForList().leftPush(key, value);return true;} catch (Exception e) {e.printStackTrace();return false;}}public Object rpop(String key) {try {return redisTemplateOutTenant.opsForList().rightPop(key);} catch (Exception e) {e.printStackTrace();return null;}}public Object brpop(String key, long timeout, TimeUnit timeUnit) {try {return redisTemplateOutTenant.opsForList().rightPop(key, timeout, TimeUnit.SECONDS);} catch (Exception e) {e.printStackTrace();return null;}}public List<Object> lrange(String key, long start, long end) {try {return redisTemplateOutTenant.opsForList().range(key, start, end);} catch (Exception e) {e.printStackTrace();return null;}}public void delete(Collection<String> keys) {redisTemplate.delete(keys);}public Set<Object> hKeys(String hkey) {try {Set<Object> keySet = redisTemplateOutTenant.opsForHash().keys(hkey);return keySet;} catch (Exception e) {log.error("获取key失败错误,method:{},msg:{}", "hKeys", e.getMessage());}return null;}public void removeCache(String redisKey) {Set<Object> keys = hKeys(redisKey);if (CollectionUtils.isNotEmpty(keys)) {hdelOutTenant(redisKey, keys.stream().collect(Collectors.toList()).toArray());}}
}