当前位置: 首页 > news >正文

redis分布式锁封装 redis分布式锁实现 封装Spring工具Redis工具类 redis操作类封装 redis锁封装 redis分布式锁封装

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;/*** create by: lizr<wwww.liyangme.top>* @ClassName: RedisUtils* @Description: RedisUtils*/
@Slf4j
@Configuration
@ConditionalOnBean(RedisConfig.class)
public class RedisUtils {private static final String LOCK_PREFIX = "PROJECT_NAME_";private static final Long LOCK_EXPIRE = 1000L;/*** 释放锁的Lua脚本*/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;/*** 最终加强分布式锁* create by: lizr<wwww.liyangme.top>* @param key key值* @return 是否获取到*/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;}});}/*** 最终加强分布式锁* create by: lizr<wwww.liyangme.top>* @param key key值* @param lockExpire lock失效时长* @return 是否获取到*/@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;}});}/*** 最终加强分布式锁* create by: lizr<wwww.liyangme.top>* @param key key值* @param lockExpire 锁过期时间* @return 是否获取到*/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;}});}/*** 尝试获取锁* 如果未获取到锁则一直等待锁的释放* create by: lizr<wwww.liyangme.top>* @param key 锁的key值* @param waitTime 等待锁的时间* @param expireTime key的超时时间* @param unit 时间单位* @return 是否成功获取到锁 (true: 成功, false: 失败)*/public boolean tryLock(String key, long waitTime, long expireTime, TimeUnit unit) {return tryLock(key, waitTime, expireTime, unit, String.valueOf(Thread.currentThread().getId()));}/*** 尝试获取锁* 如果未获取到锁则一直等待锁的释放* create by: lizr<wwww.liyangme.top>* @param key 锁的key值* @param waitTime 等待锁的时间* @param expireTime key的超时时间* @param unit 时间单位* @param sleepTime 轮询间隔* @return 是否成功获取到锁 (true: 成功, false: 失败)*/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);}/*** 尝试获取锁* 如果未获取到锁则一直等待锁的释放** @param key 锁的key值* @param waitTime 等待锁的时间* @param expireTime key的超时时间* @param unit 时间单位* @param lockNo 锁的编号* @return 是否成功获取到锁 (true: 成功, false: 失败)*/public boolean tryLock(String key, long waitTime, long expireTime, TimeUnit unit, String lockNo) {return tryLock(key, waitTime, expireTime, unit, lockNo, 100);}/*** 尝试获取锁* 如果未获取到锁则一直等待锁的释放** @param key 锁的key值* @param waitTime 等待锁的时间* @param expireTime key的超时时间* @param unit 时间单位* @param lockNo 锁的编号* @param sleepTime 轮询间隔* @return 是否成功获取到锁 (true: 成功, false: 失败)*/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;}/*** 释放锁** @param key 锁的key值* @return 是否释放锁成功 (true:成功, false:失败)*/public boolean unlock(String key) {return unlock(key, String.valueOf(Thread.currentThread().getId()));}/*** 释放锁** @param key 锁的key值* @param lockNo 锁的编号* @return 是否释放锁成功 (true:成功, false:失败)*/public boolean unlock(String key, String lockNo) {return (Long) redisTemplateOutTenant.execute(new DefaultRedisScript<>(UNLOCK_LUA_SCRIPT, Long.class), Collections.singletonList(key),lockNo) == 1;}/*** 删除锁** @param key*/public void delete(String key) {redisTemplate.delete(key);}/*** 删除锁** @param key*/public void deleteOutTenant(String key) {redisTemplateOutTenant.delete(key);}/*** 删除锁*/public void deleteOutTenant(Collection<String> keys) {redisTemplateOutTenant.delete(keys);}/*** 删除锁** @param key 可传多个值*/public void del(String... key) {if (key != null && key.length > 0) {redisTemplate.delete(key);}}/*** 指定缓存失效时间** @param key 键* @param time 时间:秒* @return 操作是否成功*/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;}}/*** 根据key获取过期时间** @param key 键* @return 时间(秒),返回0代表永久有效*/public long getExpireTime(String key) {return redisTemplate.getExpire(key, TimeUnit.SECONDS);}/*** 判断key是否存在** @param key 键* @return true存在,false不存在*/public boolean hasKey(String key) {try {return redisTemplate.hasKey(key);} catch (Exception e) {log.error("failed in hasKey, e: {}", e.getMessage(), e);return false;}}/*** 判断key是否存在** @param key 键* @return true存在,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;}}/*** @param key 查看对应 位数量*/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;}}/*** @param key 查看对应 位数量*/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;}}/*** @param key 获取对应位图上  第一个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;}}/*** @param key 获取对应位图上  第一个0/1 的位置  区间中第一个0/1 的位置*/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;}}/*** String类型获取值** @param key 键* @return 值*/public Object get(String key) {return key == null ? null : redisTemplate.opsForValue().get(key);}/*** String类型获取值** @param key 键* @return 值*/public Object getOutTenant(String key) {return key == null ? null : redisTemplateOutTenant.opsForValue().get(key);}/*** 添加缓存并设置过期时间** @param key 键* @param value 值* @param time 时间(秒)* @return true成功 false失败*/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;}}/*** 添加缓存并设置过期时间** @param key 键* @param value 值* @param time 时间(秒)* @return true成功 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;}}/*** 添加缓存** @param key 键* @param value 值* @return true成功 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;}}/*** 递增** @param key 键* @return*/public long incrOutTenant(String key, long delta) {return redisTemplateOutTenant.opsForValue().increment(key, delta);}public long decrOutTenant(String key) {return redisTemplateOutTenant.opsForValue().decrement(key);}/*** 递减** @param key 键* @return*/public long decr(String key, long delta) {if (delta < 0) {throw new RuntimeException("递减因子必须大于0");}return redisTemplate.opsForValue().increment(key, -delta);}/*** HashGet** @param key 键 不能为null* @param item 项 不能为null* @return 值*/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);}/*** 批量获取hashKey value** @param keys* @return*/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;});}/*** HashGet** @param key 键 不能为null* @param item 项 不能为null* @return 值*/public Object hgetOutTenant(String key, String item) {return redisTemplateOutTenant.opsForHash().get(key, item);}/*** 获取hashKey对应的所有键值** @param key 键* @return 对应的多个键值*/public Map<Object, Object> hmget(String key) {return redisTemplate.opsForHash().entries(key);}/*** HashSet** @param key 键* @param map 对应多个键值* @return true 成功 false 失败*/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;}}/*** HashSet 并设置时间** @param key 键* @param map 对应多个键值* @param time 时间(秒)* @return true成功 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;}}/*** 指定缓存失效时间** @param key 键* @param time 时间:秒* @return 操作是否成功*/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;}}/*** 向一张hash表中放入数据,如果不存在将创建** @param key 键* @param item 项* @param value 值* @return true 成功 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;}}/*** 向一张hash表中放入数据,如果不存在将创建** @param key 键* @param item 项* @param value 值* @return true 成功 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;}}/*** 向一张hash表中放入数据,如果不存在将创建** @param key 键* @param item 项* @param value 值* @return true 成功 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;}}/*** 向一张hash表中放入数据,如果不存在将创建** @param key 键* @param item 项* @param value 值* @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间* @return true 成功 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;}}/*** 向一张hash表中放入数据,如果不存在将创建** @param key 键* @param item 项* @param value 值* @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间* @return true 成功 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;}}/*** 向一张hash表中放入数据,如果不存在将创建** @param key 键* @param item 项* @param value 值* @param time 不会覆盖第一次的* @return true 成功 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;}}/*** 删除hash表中的值** @param key 键 不能为null* @param item 项 可以使多个 不能为null*/public void hdel(String key, Object... item) {redisTemplate.opsForHash().delete(key, item);}public void hdelOutTenant(String key, Object... item) {redisTemplateOutTenant.opsForHash().delete(key, item);}/*** 判断hash表中是否有该项的值** @param key 键 不能为null* @param item 项 不能为null* @return true 存在 false不存在*/public boolean hHasKey(String key, String item) {return redisTemplate.opsForHash().hasKey(key, item);}/*** hash递增 如果不存在,就会创建一个 并把新增后的值返回** @param key 键* @param item 项* @param by 要增加几(大于0)* @return*/public double hincr(String key, String item, double by) {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) {return redisTemplate.opsForHash().increment(key, item, -by);}/*** 根据key获取Set中的所有值** @param key 键* @return*/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;}}/*** 根据key获取Set中的所有值** @param key 键* @return*/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;}}/*** Set union** @param key 键名* @return*/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();}}/*** Set union** @param key 键名* @return*/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();}}/*** Set union** @param keys 键名 list* @return*/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();}}/*** Set union** @param keys 键名 list* @return*/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();}}/*** 根据value从一个set中查询,是否存在** @param key 键* @param value 值* @return true 存在 false不存在*/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;}}/*** 根据value从一个set中查询,是否存在** @param key 键* @param value 值* @return true 存在 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;}}/*** 获取key集合*/public Set keys(String pattern) {try {return redisTemplate.keys(pattern);} catch (Exception e) {log.error("failed in keys, e: {}", e.getMessage(), e);return null;}}/*** 将数据放入set缓存** @param key 键* @param values 值 可以是多个* @return 成功个数*/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;}}/*** 将数据放入set缓存** @param key 键* @param values 值 可以是多个* @return 成功个数*/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;}}/*** 将数据放入set缓存** @param key 键* @param time 时间(秒)* @param values 值 可以是多个* @return 成功个数*/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;}}/*** 将set数据放入缓存** @param key 键* @param time 时间(秒)* @param values 值 可以是多个* @return 成功个数*/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;}}/*** 将set数据放入缓存** @param key 键* @param time 时间(秒)* @param values 值 可以是多个* @return 成功个数*/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;}}/*** 获取set缓存的长度** @param key 键* @return*/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;}}/*** 获取set缓存的长度** @param key 键* @return*/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;}}/*** 移除值为value的** @param key 键* @param values 值 可以是多个* @return 移除的个数*/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;}}/*** 移除值为value的** @param key 键* @param values 值 可以是多个* @return 移除的个数*/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;}}/*** 获取list缓存的内容** @param key 键* @param start 开始* @param end 结束 0 到 -1代表所有值* @return*/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;}}/*** 获取list缓存的内容** @param key 键* @param start 开始* @param end 结束 0 到 -1代表所有值* @return*/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;}}/*** 获取list 所有 key** @param key 键* @return*/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;}}/*** 获取list 所有 key** @param key 键* @return*/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;}}/*** create by: lizr<wwww.liyangme.top>* description: trim list通过下标 删除数据* create time: 2020/7/16 17:01** @return boolean* @Param: key* @Param: start* @Param: end*/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;}}/*** 获取list缓存的长度** @param key 键* @return*/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;}}/*** 获取list缓存的长度** @param key 键* @return*/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;}}/*** 获取list缓存的长度** @param key 键* @return*/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;}}/*** 通过索引 获取list中的值** @param key 键* @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推* @return*/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;}}/*** 通过索引 获取list中的值** @param key 键* @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推* @return*/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;}}/*** 将list放入缓存** @param key 键* @param value 值* @return*/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;}}/*** 将list放入缓存** @param key 键* @param value 值* @return*/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;}}/*** 将list放入缓存** @param key 键* @param value 值* @param time 时间(秒)* @return*/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;}}/*** 将list放入缓存** @param key 键* @param value 值* @param time 时间(秒)* @return*/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;}}/*** 将list放入缓存** @param key 键* @param value 值* @return*/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;}}/*** 将list放入缓存** @param key 键* @param value 值* @return*/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;}}/*** 将list放入缓存** @param key 键* @param value 值* @param time 时间(秒)* @return*/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;}}/*** 将list放入缓存** @param key 键* @param value 值* @param time 时间(秒)* @return*/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;}}/*** 根据索引修改list中的某条数据** @param key 键* @param index 索引* @param value 值* @return*/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;}}/*** 根据索引修改list中的某条数据** @param key 键* @param index 索引* @param value 值* @return*/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;}}/*** 移除N个值为value** @param key 键* @param count 移除多少个* @param value 值* @return 移除的个数*/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;}}/*** 移除N个值为value** @param key 键* @param count 移除多少个* @param value 值* @return 移除的个数*/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;}}/*** create by: lizr<wwww.liyangme.top>* description: 删除多个key* create time: 2020/6/9 15:52** @return boolean* @Param: keys*/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;}}/*** create by: lizr<wwww.liyangme.top>* description: zset 添加 分值为double* create time: 2020/6/9 15:52** @return boolean* @Param: key* @Param: object* @Param: score*/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;}/*** zset 批量添加** @param key* @param set* @return*/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;}/*** create by: lizr<wwww.liyangme.top>* description:* create time: 2020/6/9 15:53** @return boolean* @Param: key* @Param: value*/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;}/*** create by: lizr<wwww.liyangme.top>* description: 删除 一段区间时间戳内的数据* create time: 2020/6/9 15:53** @return boolean* @Param: key* @Param: timeStart* @Param: timeEnd*/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;}/*** 删除zset中指定的值** @param key* @param values* @return*/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;}/*** create by: lizr<wwww.liyangme.top>* description: 按分值删除* create time: 2020/6/9 15:55** @return boolean* @Param: key* @Param: startScore* @Param: endScore*/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;}/*** create by: lizr<wwww.liyangme.top>* description: 统计分值段内的数量* create time: 2020/6/9 15:58** @return long* @Param: key* @Param: startScore* @Param: endScore*/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;}}/*** create by: lizr<wwww.liyangme.top>* description: 通过时间戳取 zset区间值* create time: 2020/6/9 16:01** @return java.util.Set<V>* @Param: key* @Param: timeStart* @Param: timeEnd*/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<>();}}/*** create by: lizr<wwww.liyangme.top>* description: 通过时间戳取 zset区间值* create time: 2020/6/9 16:01** @return java.util.Set<V>* @Param: key* @Param: timeStart* @Param: timeEnd*/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<>();}}/*** create by: lizr<wwww.liyangme.top>* description: bimap操作* create time: 2020/7/31 15:01** @return boolean* @Param: key* @Param: offset 偏移量位置* @Param: bit  置 位 0/1*/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;}}/*** create by: lizr<wwww.liyangme.top>* description: bimap操作*/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;}}/*** create by: lizr<wwww.liyangme.top>* description: bimap操作* create time: 2020/7/31 15:01** @return boolean* @Param: key* @Param: offset 偏移量位置*/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;}}/*** create by: lizr<wwww.liyangme.top>* description: 多个key* create time: 2020/7/31 15:01** @return Object* @Param: key*/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();}}/*** create by: lizr<wwww.liyangme.top>* description: 放入多个key* create time: 2020/7/31 15:01** @return Object* @Param: key*/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);}}/*** create by: lizr<wwww.liyangme.top>* description: bimap操作* create time: 2020/7/31 15:01** @return boolean* @Param: key* @Param: offset 偏移量位置* @Param: bit  置 位 0/1*/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;}}/*** create by: lizr<wwww.liyangme.top>* description: bimap操作*/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;}}/*** create by: lizr<wwww.liyangme.top>* description: bimap操作* create time: 2020/7/31 15:01** @return boolean* @Param: key* @Param: offset 偏移量位置*/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;}}/*** create by: lizr<wwww.liyangme.top>* description: 向redis 通道里 发送消息* create time: 2020/8/7 15:28** @return void* @Param: topic* @Param: message*/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);}/*** 存值** @param key 键* @param value 值* @return*/public boolean lpush(String key, Object value) {try {redisTemplateOutTenant.opsForList().leftPush(key, value);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 取值 - <rpop:非阻塞式>** @param key 键* @return*/public Object rpop(String key) {try {return redisTemplateOutTenant.opsForList().rightPop(key);} catch (Exception e) {e.printStackTrace();return null;}}/*** 取值 - <brpop:阻塞式> - 推荐使用** @param key 键* @param timeout 超时时间* @param timeUnit 给定单元粒度的时间段* TimeUnit.DAYS          //天* TimeUnit.HOURS         //小时* TimeUnit.MINUTES       //分钟* TimeUnit.SECONDS       //秒* TimeUnit.MILLISECONDS  //毫秒* @return*/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;}}/*** 查看值** @param key 键* @param start 开始* @param end 结束 0 到 -1代表所有值* @return*/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;}}/*** 批量删除锁** @param keys*/public void delete(Collection<String> keys) {redisTemplate.delete(keys);}/*** 获取哈希key下面的所有id** @param hkey* @return*/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;}/*** 清除缓存** @param redisKey*/public void removeCache(String redisKey) {Set<Object> keys = hKeys(redisKey);if (CollectionUtils.isNotEmpty(keys)) {hdelOutTenant(redisKey, keys.stream().collect(Collectors.toList()).toArray());}}
}
http://www.dtcms.com/a/330024.html

相关文章:

  • 【SpringBoot系列-02】自动配置机制源码剖析
  • Promise.all使用
  • 嵌入式Linux中的OpenWrt 是指什么
  • python类--python011
  • Python3解释器深度解析与实战教程:从源码到性能优化的全路径探索
  • O2OA:数字化转型中安全与效率的平衡之道
  • hadoop 前端yarn 8088端口查看任务执行情况
  • 华清远见25072班C语言学习day8
  • Spring学习笔记:基于注解的Sprig AOP配置的深入学习
  • ConstraintViolation是什么?
  • 架构设计原则与风格
  • 销售管理系统哪个好?14款软件深度对比
  • 【从网络基础到实战】理解TCP/IP协议体系的核心要点(包含ARP协议等其他协议介绍)
  • Flutter网络请求实战:Retrofit+Dio完美解决方案
  • 2025年前端组件库热度排行榜分析
  • 修复运动模糊的视频用什么软件?快速解决方案分享
  • 仓库无人叉车的安全功能有哪些?如何在提升效率时保障安全?
  • 制作一款打飞机游戏90:完结
  • TF-IDF------词向量转化:从“文字”到“向量”
  • 【Unity3D实例-功能-下蹲】角色下蹲(三)动画配置
  • 直播预告|鸿蒙生态中的AI新玩法
  • 2025年PMP考试指南:内容、题型与核心变化全解析
  • PyTorch神经网络工具箱(神经网络核心组件)
  • Android图片加载库Glide深度解析与实践指南
  • 模型路由相关论文速览——《Universal Model Routing for Efficient LLM inference》
  • FxSound:为你的音频体验注入专业级享受
  • 汽车高位制动灯难达 CIE 标准?OAS 光学软件高效优化破局
  • 中科米堆CASAIM汽车零部件三维扫描检测解决方案
  • 数据结构摘星题库800题笔记 第1章绪论
  • 5G 迷你图传模块:性能与实用性兼备的传输利器