redis 使用redisson缓存api模板

import com.baomidou.mybatisplus.core.metadata.IPage;
import org.redisson.api.RLock;
import org.redisson.api.listener.MessageListener;
import org.redisson.client.protocol.ScoredEntry;

import java.time.Duration;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * @Author: Garcia
 * @CreateDate: 2021/04/10 17:45
 * @Description: what it is class?
 */
public interface ICacheService {

    /**
     * 设置缓存
     * - 默认缓存失效时间30m
     *
     * @param key
     * @param value
     */
    <V> void set(String key,V value);

    /**
     * 设置String类型缓存
     *
     * @param key
     * @param value
     * @param expireSeconds 缓存失效时间单位 秒
     */
    void set(String key,String value,int expireSeconds);

    /**
     * 设置String类型缓存
     *
     * @param key
     * @param value
     * @param expire 缓存失效时间
     * @param timeUnit 时间单位
     */
    void set(String key,String value,int expire,TimeUnit timeUnit);

    /**
     * 批量设置多个缓存
     *
     * @param temps
     * @param <V>
     */
    <V> void multiSet(Map<String,V> temps);

    /**
     * 设置缓存
     *
     * @param key
     * @param value
     * @param expireSeconds 缓存失效时间单位 秒
     */
    <V> void set(String key,V value,int expireSeconds);

    /**
     * 设置缓存失效时间
     *
     * @param key
     * @param duration 缓存失效时间,of
     * @return 是否成功
     */
    boolean expire(String key, Duration duration);

    /**
     * 获取缓存生存时间
     *
     * @param key
     * @return 是否成功
     */
    Long ttl(String key);

    /**
     * 获取缓存值
     *
     * @param key
     * @param <V>
     * @return
     */
    <V> V get(String key);

    /**
     * 以原子操作设置指定缓存值,并返回之前的缓存值
     *
     * @param key
     * @param value
     * @param <V>
     * @return
     */
    <V> V getAndSet(String key , V value);

    /**
     * 获取所有匹配 pattern 的缓存key 对应的缓存值
     * 此方法 谨慎使用
     *
     * @param pattern
     * @param <V>
     * @return
     */
    <V> Set<V> getAll(String pattern);

    /**
     * 是否存在缓存key
     *
     * @param key
     * @return
     */
    Boolean hasKey(String key);

    /**
     * 删除key
     *
     * @param key
     */
    void delete(String key);

    /**
     * 删除所有匹配 pattern 的缓存key
     *
     * @param pattern
     */
    void deleteAll(String pattern);

    /**
     * 获取缓存类型
     *
     * @param key
     * @return
     */
    String getType(String key);

    /**
     * 获取Map
     *
     * @param key
     * @param <K>
     * @param <V>
     * @return
     */
    <K,V> Map<K,V> getMap(String key);

    /**
     * 是否有Map Key
     *
     * @param key
     * @param entryKey
     * @param <K>
     * @return
     */
    <K> Boolean hasMapKey(String key, K entryKey);

    /**
     * 设置Map 参数
     * @param key
     * @param entryKey
     * @param entryValue
     * @param <K>
     * @param <V>
     */
    <K,V> void addMapEntry(String key,K entryKey ,V entryValue);

    /**
     * 设置Map 参数
     * @param key
     * @param entryKey
     * @param entryValue
     * @param expireSeconds 缓存失效时间单位 秒
     * @param <K>
     * @param <V>
     */
    <K,V> void addMapEntry(String key,K entryKey ,V entryValue,int expireSeconds);

    /**
     * 添加整个Map
     * @param key
     * @param map
     * @param <K>
     * @param <V>
     */
    <K,V> void addMap(String key,Map<K,V> map);

    /**
     * 获取 map 值
     * @param key
     * @param entryKey
     * @param <K>
     * @param <V>
     * @return
     */
    <K,V> V getMapEntry(String key,K entryKey);

    /**
     * 根据KEY集合获取Map数据
     * @param key
     * @param entryKey
     * @param <K>
     * @param <V>
     * @return
     */
    <K, V> Map<K,V> getMapEntryAll(String key, Set<K> entryKey);

    /**
     * 删除Map值
     * @param key
     * @param entryKey
     * @param <K>
     */
    <K> void delMapEntry(String key,K entryKey);

    /**
     * 获取Set 集合size
     *
     * @param key
     * @return
     */
    Integer getSetSize(String key);

    /**
     * 添加Set 元素
     *
     * @param key
     * @param element
     * @param <V>
     */
    <V> void addSetElement(String key, V element);

    /**
     *
     * @param key
     * @param element
     * @param expireSeconds 缓存失效时间单位 秒
     * @param <V>
     */
    <V> void addSetElement(String key, V element,int expireSeconds);

    /**
     * 添加Set
     *
     * @param key
     * @param elements
     * @param <V>
     */
    <V> void addSet(String key, Set<V> elements);

    /**
     * 添加Set
     *
     * @param key
     * @param elements
     * @param <V>
     */
    <V> void addSet(String key, Set<V> elements,int expireSeconds);

    /**
     * 获取Set 集合
     *
     * @param key
     * @param <V>
     * @return
     */
    <V> Set<V> getSet(String key);

    /**
     * 是否有Set元素
     *
     * @param key
     * @param element
     * @param <V>
     * @return
     */
    <V> boolean hasSetElement(String key,V element);

    /**
     * 删除Set 元素
     * @param key
     * @param element
     * @param <V>
     * @return
     */
    <V> boolean delSetElement(String key,V element);

    /**
     * 获取List 集合size
     *
     * @param key
     * @return
     */
    Integer getListSize(String key);

    <V> void addListElement(String key, V element);

    <V> void addListElement(String key, V element,int expireSeconds);

    /**
     * 添加List
     *
     * @param key
     * @param elements
     * @param <V>
     */
    <V> void addList(String key, List<V> elements);

    /**
     * 添加List
     *
     * @param key
     * @param elements
     * @param <V>
     */
    <V> void addList(String key, List<V> elements,int expireSeconds);

    /**
     * 获取List 集合
     *
     * @param key
     * @param <V>
     * @return
     */
    <V> List<V> getList(String key);

    /**
     * 分布式锁-获取锁
     * @param key
     * @return
     */
    RLock fairLock(String key);

    /**
     * 计数器+
     *
     * @param key
     * @param num 从几开始
     * @param duration
     * @return
     */
    long incrementAndGet(String key , int num ,Duration duration);

    /**
     * 计算器+
     *
     * @param key
     * @param duration
     * @return
     */
    long incrementAndGet(String key ,Duration duration);

    /**
     * 计数器+
     *
     * @param key
     * @return
     */
    long incrementAndGet(String key);

    /**
     * 获取计数值
     * @param key
     * @return
     */
    long incrementGet(String key);


    /**
     * 计数器 -
     *
     * @param key
     * @param num 从几开始
     * @param duration
     * @return
     */
    long decrementAndGet(String key , int num ,Duration duration);

    /**
     * 计算器-
     *
     * @param key
     * @param duration
     * @return
     */
    long decrementAndGet(String key ,Duration duration);

    /**
     * 计数器-
     *
     * @param key
     * @return
     */
    long decrementAndGet(String key);

    /**
     * 获取计数值
     * @param key
     * @return
     */
    long decrementGet(String key);

    /**
     * 获取分数排序集合大小
     * 默认从低分到高分排序
     * @param key
     * @return
     */
    Integer getScoredSortedSetSize(String key);

    /**
     * 分数排序集合添加元素
     * 默认从低分到高分排序
     * @param key
     * @param element
     * @param <V>
     */
    <V> void addScoredSortedSetElement(String key, V element);

    /**
     * 分数排序集合添加元素
     * 默认从低分到高分排序
     * 指定分数
     * @param key
     * @param element
     * @param v
     * @param <V>
     */
    <V> void addScoredSortedSetElement(String key, V element,double v);

    /**
     * 分数排序集合添加元素
     * 默认从低分到高分排序
     * @param key
     * @param element
     * @param expireSeconds
     * @param <V>
     */
    <V> void addScoredSortedSetElement(String key, V element, int expireSeconds);

    /**
     * 分数排序集合添加元素
     * 默认从低分到高分排序
     * 指定分数
     * @param key
     * @param element
     * @param v
     * @param <V>
     */
    <V> void addScoredSortedSetElement(String key, V element,double v, int expireSeconds);

    /**
     * 获取分数排序集合
     * 以相反的顺序按排名范围返回值
     * @param key
     * @param startIndex
     * @param endIndex
     * @param <V>
     * @return
     */
    <V> Collection<V> getScoredSortedSetValueRangeReversed(String key,int startIndex, int endIndex);

    /**
     * 获取分数排序集合
     * 顺序按排名范围返回值
     * @param key
     * @param startIndex
     * @param endIndex
     * @param <V>
     * @return
     */
    <V> Collection<V> getScoredSortedSetValueRange(String key,int startIndex, int endIndex);

    /**
     * 获取分数排序集合
     * 以相反的顺序按排名范围返回条目(值及其分数)
     * @param key
     * @param startIndex
     * @param endIndex
     * @param <V>
     * @return
     */
    <V> Collection<ScoredEntry<V>> getScoredSortedSetEntryRangeReversed(String key,int startIndex, int endIndex);

    /**
     * 获取分数排序集合所有值
     * @param key
     * @param <V>
     * @return
     */
    <V> Collection<V> getScoredSortedSet(String key);

    /**
     * 是否存在该元素
     * @param key
     * @param element
     * @param <V>
     * @return
     */
    <V> boolean hasScoredSortedSetElement(String key, V element);

    /**
     * 删除指定元素
     * @param key
     * @param element
     * @param <V>
     * @return
     */
    <V> boolean delScoredSortedSetElement(String key, V element);

    /**
     * 是否存在分页元素
     * @param key
     * @param elementKey
     * @param <V>
     * @return
     */
    <V> boolean hasPageElement(String key, V elementKey);

    /**
     * 添加分页元素
     * 存在则覆盖
     * @param key
     * @param entryKey
     * @param element
     * @param <V>
     */
    <V> void addPageElement(String key,V entryKey,V element);

    /**
     * 添加分页元素。并指定分数
     * 存在则覆盖
     * @param key
     * @param entryKey
     * @param element
     * @param <V>
     * @param v
     */
    <V> void addPageElement(String key,V entryKey,V element,double v);

    /**
     * 删除分页元素
     * @param key
     * @param entryKey
     */
    <V> void delPageElement(String key,V entryKey);

    /**
     * 获取分页数据,按从高分到低分排序
     * 页码从1开始
     * @param key
     * @param pageCurrent
     * @param pageSize
     * @param <V>
     * @return
     */
    <V> IPage<V> getPageElementDesc(String key,Integer pageCurrent,Integer pageSize);

    /**
     * 获取分页数据,按从低分到高分排序
     * 页码从1开始
     * @param key
     * @param pageCurrent
     * @param pageSize
     * @param <V>
     * @return
     */
    <V> IPage<V> getPageElement(String key,Integer pageCurrent,Integer pageSize);

    /**
     * 获取 map 值
     * @param key
     * @param entryKey
     * @param <K>
     * @param <V>
     * @return
     */
    <K,V> V getPageElement(String key,K entryKey);

    /**
     * 发布消息
     * @param key
     * @param msg
     * @param <V>
     */
    <V> void publish(String key,V msg);

    /**
     * 监听消息
     * @param key
     * @param clazz
     * @param messageListener
     * @param <V>
     */
    <V> void addListener(String key,Class<V> clazz, MessageListener<V> messageListener);

    /**
     * 添加延迟队列
     * 应用场景:订单未支付到期自动关闭
     * @param queueName
     * @param value
     * @param expire
     * @param timeUnit
     * @param <V>
     */
    <V> void addDelayQueue(String queueName,V value, int expire, TimeUnit timeUnit);

    /**
     * 添加延迟队列
     * 应用场景:订单未支付到期自动关闭
     * @param queueName
     * @param value
     * @param expire
     * @param <V>
     */
    <V> void addDelayQueue(String queueName,V value, int expire);

    /**
     * 获取延迟队列
     * @param queueName
     * @return
     * @param <T>
     */
    <T> T getDelayQueue(String queueName);

    /**
     * 延迟队列是否包含值
     * @param queueName
     * @param value
     * @return
     * @param <V>
     */
    <V> Boolean delayQueueContainValue(String queueName,V value);

    /**
     * 延迟队列删除值
     * @param queueName
     * @param value
     * @return
     * @param <V>
     */
    <V> Boolean delayQueueRemoveValue(String queueName,V value);

}

 Impl:

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fuing.awaken.commons.cache.ICacheService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.*;
import org.redisson.api.listener.MessageListener;
import org.redisson.client.protocol.ScoredEntry;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.time.Duration;
import java.util.*;
import java.util.concurrent.TimeUnit;

/**
 * @Author: Garcia
 * @CreateDate: 2023/05/13 17:46
 * @Description: what it is class?
 */
@Slf4j
@Service
public class CacheServiceImpl implements ICacheService {

    @Resource
    private RedissonClient redisson;

    @Value("${spring.redis.app-code}")
    private String appCode;

    @Value("${spring.profiles.active}")
    private String profile;

    /**
     * 指定key位置
     * @param key
     * @return
     */
    private String wrap(String key){
        StringBuilder sb = new StringBuilder(appCode).append(":").append(profile).append(":").append(key);
        if (!key.endsWith(":")){
            sb.append(":");
        }
        return sb.toString();
    }

    private String wrapEntry(String key){
        StringBuilder sb = new StringBuilder(appCode).append(":").append(profile).append(":").append(key);
        if (!key.endsWith(":")){
            sb.append(":").append("entry:");
        }else {
            sb.append("entry:");
        }
        return sb.toString();
    }

    @Override
    public <V> void set(String key, V value) {
        RBucket<V> bucket = redisson.getBucket(wrap(key));
        bucket.set(value);
    }

    @Override
    public void set(String key, String value, int expireSeconds) {
        RBucket<String> bucket = redisson.getBucket(wrap(key));
        bucket.set(value,expireSeconds,TimeUnit.SECONDS);
    }

    @Override
    public void set(String key, String value, int expire, TimeUnit timeUnit) {
        RBucket<String> bucket = redisson.getBucket(wrap(key));
        bucket.set(value,expire,timeUnit);
    }

    @Override
    public <V> void multiSet(Map<String, V> temps) {
        redisson.getBuckets().set(temps);
    }

    @Override
    public <V> void set(String key, V value, int expireSeconds) {
        RBucket<V> bucket = redisson.getBucket(wrap(key));
        bucket.set(value,expireSeconds,TimeUnit.SECONDS);
    }

    @Override
    public boolean expire(String key, Duration duration) {
        try {
            return redisson.getBucket(wrap(key)).expire(duration);
        }catch (Exception e){
            log.error("Method#expire failed",e);
            return false;
        }
    }

    @Override
    public Long ttl(String key) {
        try {
            return redisson.getBucket(wrap(key)).remainTimeToLive();
        }catch (Exception e){
            log.error("Method#ttl failed",e);
            return 0L;
        }
    }

    @Override
    public <V> V get(String key) {
        try {
            RBucket<V> bucket = redisson.getBucket(wrap(key));
            return bucket.get();
        }catch (Exception e){
            log.error("Method#get failed",e);
            return null;
        }
    }

    @Override
    public <V> V getAndSet(String key, V value) {
        try {
            RBucket<V> bucket = redisson.getBucket(wrap(key));
            return bucket.getAndSet(value);
        }catch (Exception e){
            log.error("Method#getAndSet failed",e);
            return null;
        }
    }

    @Override
    public <V> Set<V> getAll(String pattern) {
        try {
            Set<V> set = new HashSet<>();
            Iterable<String> keys = redisson.getKeys().getKeysByPattern(pattern);
            for (Iterator<String> iterator = keys.iterator();iterator.hasNext();){
                String key = iterator.next();
                RBucket<V> bucket = redisson.getBucket(wrap(key));
                set.add(bucket.get());
            }
            return set;
        }catch (Exception e){
            log.error("Method#getAll failed",e);
            return null;
        }
    }

    @Override
    public Boolean hasKey(String key) {
        try {
            return redisson.getBucket(wrap(key)).isExists();
        }catch (Exception e){
            log.error("Method#hasKey failed",e);
            return null;
        }
    }

    @Override
    public void delete(String key) {
        redisson.getKeys().delete(wrap(key));
    }

    @Override
    public void deleteAll(String pattern) {
        redisson.getKeys().deleteByPattern(pattern);
    }

    @Override
    public String getType(String key) {
        try {
            RType type = redisson.getKeys().getType(wrap(key));
            if (type==null){
                return null;
            }
            return type.getClass().getName();
        }catch (Exception e){
            log.error("Method#getType failed",e);
            return null;
        }
    }

    @Override
    public <K, V> Map<K, V> getMap(String key) {
        try {
            return (RMap<K, V>)redisson.getMap(wrap(key)).readAllMap();
        }catch (Exception e){
            log.error("Method#getMap failed",e);
            return Collections.emptyMap();
        }
    }

    @Override
    public <K> Boolean hasMapKey(String key, K entryKey) {
        try {
            return redisson.getMap(wrap(key)).containsKey(entryKey);
        }catch (Exception e){
            log.error("Method#getMap failed",e);
            return false;
        }
    }

    @Override
    public <K, V> void addMapEntry(String key, K entryKey, V entryValue) {
        redisson.getMap(wrap(key)).put(entryKey,entryValue);
    }

    @Override
    public <K, V> void addMapEntry(String key, K entryKey, V entryValue, int expireSeconds) {
        redisson.getMap(wrap(key)).put(entryKey,entryValue);
        expire(key,Duration.ofSeconds(expireSeconds));
    }

    @Override
    public <K, V> void addMap(String key, Map<K, V> map) {
        redisson.getMap(wrap(key)).putAll(map);
    }

    @Override
    public <K, V> V getMapEntry(String key, K entryKey) {
        try {
            RMap<K, V> rMap = redisson.getMap(wrap(key));
            return rMap.get(entryKey);
        }catch (Exception e){
            log.error("Method#getMapEntry failed",e);
            return null;
        }
    }

    @Override
    public <K, V> Map<K,V> getMapEntryAll(String key, Set<K> entryKey) {
        try {
            RMap<K, V> rMap = redisson.getMap(wrap(key));
            return rMap.getAll(entryKey);
        }catch (Exception e){
            log.error("Method#getMapEntryAll failed",e);
            return null;
        }
    }

    @Override
    public <K> void delMapEntry(String key, K entryKey) {
        try {
            redisson.getMap(wrap(key)).remove(entryKey);
        }catch (Exception e){
            log.error("Method#delMapEntry failed",e);
        }
    }

    @Override
    public Integer getSetSize(String key) {
        return redisson.getSet(wrap(key)).size();
    }

    @Override
    public <V> void addSetElement(String key, V element) {
        redisson.getSet(wrap(key)).add(element);
    }

    @Override
    public <V> void addSetElement(String key, V element, int expireSeconds) {
        redisson.getSet(wrap(key)).add(element);
        expire(key,Duration.ofSeconds(expireSeconds));
    }

    @Override
    public <V> void addSet(String key, Set<V> elements) {
        redisson.getSet(wrap(key)).addAll(elements);
    }

    @Override
    public <V> void addSet(String key, Set<V> elements, int expireSeconds) {
        redisson.getSet(wrap(key)).addAll(elements);
        expire(key,Duration.ofSeconds(expireSeconds));
    }

    @Override
    public <V> Set<V> getSet(String key) {
        try {
            return (Set<V>)redisson.getSet(wrap(key)).readAll();
        }catch (Exception e){
            log.error("Method#getSet failed",e);
            return Collections.emptySet();
        }
    }

    @Override
    public <V> boolean hasSetElement(String key, V element) {
        try {
            return redisson.getSet(wrap(key)).contains(element);
        }catch (Exception e){
            log.error("Method#hasSetElement failed",e);
            return false;
        }
    }

    @Override
    public <V> boolean delSetElement(String key, V element) {
        return redisson.getSet(wrap(key)).remove(element);
    }

    @Override
    public Integer getListSize(String key) {
        try {
            return redisson.getList(wrap(key)).size();
        }catch (Exception e){
            log.error("Method#getListSize failed",e);
            return 0;
        }
    }

    @Override
    public <V> void addListElement(String key, V element) {
        redisson.getList(wrap(key)).add(element);
    }

    @Override
    public <V> void addListElement(String key, V element, int expireSeconds) {
        redisson.getList(wrap(key)).add(element);
        expire(key,Duration.ofSeconds(expireSeconds));
    }

    @Override
    public <V> void addList(String key, List<V> elements) {
        redisson.getList(wrap(key)).addAll(elements);
    }

    @Override
    public <V> void addList(String key, List<V> elements, int expireSeconds) {
        redisson.getList(wrap(key)).addAll(elements);
        expire(key,Duration.ofSeconds(expireSeconds));
    }

    @Override
    public <V> List<V> getList(String key) {
        try {
            return (List<V>)redisson.getList(wrap(key)).readAll();
        }catch (Exception e){
            log.error("Method#getList failed",e);
            return Collections.emptyList();
        }
    }

    @Override
    public RLock fairLock(String key) {
        try {
            return redisson.getFairLock(wrap(key));
        }catch (Exception e){
            log.error("Method#lock failed",e);
        }
        return null;
    }

    @Override
    public long incrementAndGet(String key, int num ,Duration duration) {
        try {
            RAtomicLong atomicLong = redisson.getAtomicLong(wrap(key));
            atomicLong.set(num);
            atomicLong.expire(duration);
            return atomicLong.incrementAndGet();
        }catch (Exception e){
            log.error("Method#incrementAndGet failed",e);
        }
        return 0;
    }

    @Override
    public long incrementAndGet(String key,Duration duration) {
        try {
            RAtomicLong atomicLong = redisson.getAtomicLong(wrap(key));
            atomicLong.expire(duration);
            return atomicLong.incrementAndGet();
        }catch (Exception e){
            log.error("Method#incrementAndGet failed",e);
        }
        return 0;
    }

    @Override
    public long incrementAndGet(String key) {
        try {
            RAtomicLong atomicLong = redisson.getAtomicLong(wrap(key));
            return atomicLong.incrementAndGet();
        }catch (Exception e){
            log.error("Method#incrementAndGet failed",e);
        }
        return 0;
    }

    @Override
    public long incrementGet(String key) {
        try {
            RAtomicLong atomicLong = redisson.getAtomicLong(wrap(key));
            return atomicLong.get();
        }catch (Exception e){
            log.error("Method#incrementGet failed",e);
        }
        return 0;
    }

    @Override
    public long decrementAndGet(String key, int num, Duration duration) {
        try {
            RAtomicLong atomicLong = redisson.getAtomicLong(wrap(key));
            atomicLong.set(num);
            atomicLong.expire(duration);
            return atomicLong.decrementAndGet();
        }catch (Exception e){
            log.error("Method#incrementAndGet failed",e);
        }
        return 0;
    }

    @Override
    public long decrementAndGet(String key, Duration duration) {
        try {
            RAtomicLong atomicLong = redisson.getAtomicLong(wrap(key));
            atomicLong.expire(duration);
            return atomicLong.decrementAndGet();
        }catch (Exception e){
            log.error("Method#incrementAndGet failed",e);
        }
        return 0;
    }

    @Override
    public long decrementAndGet(String key) {
        try {
            RAtomicLong atomicLong = redisson.getAtomicLong(wrap(key));
            return atomicLong.decrementAndGet();
        }catch (Exception e){
            log.error("Method#incrementAndGet failed",e);
        }
        return 0;
    }

    @Override
    public long decrementGet(String key) {
        try {
            RAtomicLong atomicLong = redisson.getAtomicLong(wrap(key));
            return atomicLong.get();
        }catch (Exception e){
            log.error("Method#incrementGet failed",e);
        }
        return 0;
    }

    @Override
    public Integer getScoredSortedSetSize(String key) {
        RScoredSortedSet<Object> sortedSet = redisson.getScoredSortedSet(wrap(key));
        return sortedSet.size();
    }

    @Override
    public <V> void addScoredSortedSetElement(String key, V element) {
        redisson.getScoredSortedSet(wrap(key)).add(0,element);
    }

    @Override
    public <V> void addScoredSortedSetElement(String key, V element,double v) {
        redisson.getScoredSortedSet(wrap(key)).add(v,element);
    }

    @Override
    public <V> void addScoredSortedSetElement(String key, V element, int expireSeconds) {
        redisson.getScoredSortedSet(wrap(key)).add(0,element);
    }

    @Override
    public <V> void addScoredSortedSetElement(String key, V element,double v, int expireSeconds) {
        redisson.getScoredSortedSet(wrap(key)).add(v,element);
    }

    @Override
    public <V> Collection<V> getScoredSortedSetValueRangeReversed(String key,int startIndex, int endIndex) {
        try {
            RScoredSortedSet<V> rSet = redisson.getScoredSortedSet(wrap(key));
            return rSet.valueRangeReversed(startIndex,endIndex);
        }catch (Exception e){
            log.error("Method#getScoredSortedSetValueRangeReversed failed",e);
            return Collections.emptySet();
        }
    }

    @Override
    public <V> Collection<V> getScoredSortedSetValueRange(String key,int startIndex, int endIndex) {
        try {
            RScoredSortedSet<V> rSet = redisson.getScoredSortedSet(wrap(key));
            return rSet.valueRange(startIndex,endIndex);
        }catch (Exception e){
            log.error("Method#getScoredSortedSetValueRangeReversed failed",e);
            return Collections.emptySet();
        }
    }

    @Override
    public <V> Collection<ScoredEntry<V>> getScoredSortedSetEntryRangeReversed(String key,int startIndex, int endIndex) {
        try {
            RScoredSortedSet<V> rSet = redisson.getScoredSortedSet(wrap(key));
            return rSet.entryRangeReversed(startIndex,endIndex);
        }catch (Exception e){
            log.error("Method#getScoredSortedSetValueRangeReversed failed",e);
            return Collections.emptySet();
        }
    }

    @Override
    public <V> Collection<V> getScoredSortedSet(String key) {
        try {
            RScoredSortedSet<V> rSet = redisson.getScoredSortedSet(wrap(key));
            return rSet.readAll();
        }catch (Exception e){
            log.error("Method#getScoredSortedSet failed",e);
            return Collections.emptySet();
        }
    }

    @Override
    public <V> boolean hasScoredSortedSetElement(String key, V element) {
        try {
            return redisson.getSet(wrap(key)).contains(element);
        }catch (Exception e){
            log.error("Method#hasSetElement failed",e);
            return false;
        }
    }

    @Override
    public <V> boolean delScoredSortedSetElement(String key, V element) {
        return redisson.getSet(wrap(key)).remove(element);
    }

    @Override
    public <V> boolean hasPageElement(String key, V elementKey) {
        boolean b = this.hasScoredSortedSetElement(key,elementKey);
        if (!b){
            return false;
        }
        return this.hasMapKey(wrapEntry(key),elementKey);
    }

    @Override
    public <V> void addPageElement(String key,V entryKey,V element){
        this.addScoredSortedSetElement(key,entryKey);
        this.addMapEntry(wrapEntry(key),entryKey,element);
    }

    @Override
    public <V> void addPageElement(String key,V entryKey,V element,double v){
        this.addScoredSortedSetElement(key,entryKey,v);
        this.addMapEntry(wrapEntry(key),entryKey,element);
    }

    @Override
    public <V> void delPageElement(String key,V entryKey){
        this.delScoredSortedSetElement(key,entryKey);
        this.delMapEntry(wrapEntry(key),entryKey);
    }

    @Override
    public <V> IPage<V> getPageElementDesc(String key,Integer pageCurrent,Integer pageSize){
        IPage<V> page = new Page<>(pageCurrent,pageSize);
        //总数
        Integer total = this.getScoredSortedSetSize(key);
        if (total!=null&&total>0){
            page.setTotal(total);
            if (page.getPages()<pageCurrent){
                //当前页码大于页码数直接返回空
                return page;
            }
            int startIndex = Integer.parseInt(String.valueOf(page.offset()));
            int endIndex = Integer.parseInt(String.valueOf(page.offset()))+pageSize-1;
            //分页条目
            Collection<Long> list = this.getScoredSortedSetValueRangeReversed(key,startIndex,endIndex);
            return getPage(key,page,list);
        }
        return page;
    }

    @Override
    public <V> IPage<V> getPageElement(String key,Integer pageCurrent,Integer pageSize){
        IPage<V> page = new Page<>(pageCurrent,pageSize);
        //总数
        Integer total = this.getScoredSortedSetSize(key);
        if (total!=null&&total>0){
            page.setTotal(total);
            if (page.getPages()<pageCurrent){
                //当前页码大于页码数直接返回空
                return page;
            }
            int startIndex = Integer.parseInt(String.valueOf(page.offset()));
            int endIndex = Integer.parseInt(String.valueOf(page.offset()))+pageSize-1;
            //分页条目
            Collection<Long> list = this.getScoredSortedSetValueRange(key,startIndex,endIndex);
            return getPage(key,page,list);
        }
        return page;
    }

    @Override
    public <K, V> V getPageElement(String key, K entryKey) {
        return this.getMapEntry(wrapEntry(key),entryKey);
    }

    @Override
    public <V> void publish(String key, V msg){
        try {
            redisson.getTopic(key).publish(msg);
        }catch (Exception e){
            log.error("Method#publish failed",e);
        }
    }

    @Override
    public <V> void addListener(String key, Class<V> clazz, MessageListener <V> messageListener){
        try {
            redisson.getTopic(key).addListener(clazz,messageListener);
        }catch (Exception e){
            log.error("Method#addListener failed",e);
        }
    }

    @Override
    public <V> void addDelayQueue(String queueName,V value, int expire, TimeUnit timeUnit){
        try {
            RBlockingDeque<V> blockingDeque = redisson.getBlockingDeque(queueName);
            RDelayedQueue<V> delayedQueue = redisson.getDelayedQueue(blockingDeque);
            delayedQueue.offer(value, expire, timeUnit);
        }catch (Exception e){
            log.error("Method#addDelayQueue failed",e);
        }
    }

    @Override
    public <V> void addDelayQueue(String queueName,V value, int expire){
        addDelayQueue(queueName,value,expire,TimeUnit.SECONDS);
    }

    @Override
    public <T> T getDelayQueue(String queueName){
        try {
            RBlockingDeque<T> blockingDeque = redisson.getBlockingDeque(queueName);
            //避免消息伪丢失(应用重启未消费),官网推荐
            redisson.getDelayedQueue(blockingDeque);
            return blockingDeque.take();
        }catch (Exception e){
            log.error("Method#getDelayQueue failed",e);
        }
        return null;
    }

    @Override
    public <V> Boolean delayQueueContainValue(String queueName,V value){
        try {
            RBlockingDeque<Object> blockingDeque = redisson.getBlockingDeque(queueName);
            RDelayedQueue<Object> delayedQueue = redisson.getDelayedQueue(blockingDeque);
            return delayedQueue.contains(value);
        }catch (Exception e){
            log.error("Method#delayQueueContainValue failed",e);
        }
        return Boolean.FALSE;
    }

    @Override
    public <V> Boolean delayQueueRemoveValue(String queueName,V value){
        try {
            RBlockingDeque<Object> blockingDeque = redisson.getBlockingDeque(queueName);
            RDelayedQueue<Object> delayedQueue = redisson.getDelayedQueue(blockingDeque);
            if (!delayedQueue.contains(value)){
                return Boolean.FALSE;
            }
            return delayedQueue.remove(value);
        }catch (Exception e){
            log.error("Method#delayQueueRemoveValue failed",e);
        }
        return Boolean.FALSE;
    }

    private <V> IPage<V> getPage(String key,IPage<V> page,Collection<Long> list){
        if (!CollectionUtils.isEmpty(list)){
            Set<Long> set = new HashSet<>(list);
            Map<Long, V> masterMap = this.getMapEntryAll(wrapEntry(key),set);
            masterMap.forEach((id, master) -> page.getRecords().add(master));
            return page;
        }
        return page;
    }
}

猜你喜欢

转载自blog.csdn.net/Qensq/article/details/115590788