package com.ruoyi.common.core.redis; 
 | 
  
 | 
import java.util.*; 
 | 
import java.util.concurrent.TimeUnit; 
 | 
import java.util.stream.Collectors; 
 | 
  
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
import org.springframework.data.redis.connection.DataType; 
 | 
import org.springframework.data.redis.core.*; 
 | 
import org.springframework.stereotype.Component; 
 | 
  
 | 
/** 
 | 
 * spring redis 工具类 
 | 
 * 
 | 
 * @author ruoyi 
 | 
 **/ 
 | 
@SuppressWarnings(value = {"unchecked", "rawtypes"}) 
 | 
@Component 
 | 
public class RedisCache { 
 | 
    @Autowired 
 | 
    public RedisTemplate redisTemplate; 
 | 
  
 | 
    /** 
 | 
     * 缓存基本的对象,Integer、String、实体类等 
 | 
     * 
 | 
     * @param key   缓存的键值 
 | 
     * @param value 缓存的值 
 | 
     */ 
 | 
    public <T> void setCacheObject(final String key, final T value) { 
 | 
        redisTemplate.opsForValue().set(key, value); 
 | 
    } 
 | 
  
 | 
    public <T> void setCacheList(final String key, final List<T> values) { 
 | 
        redisTemplate.opsForList().rightPushAll(key, values); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 缓存基本的对象,Integer、String、实体类等 
 | 
     * 
 | 
     * @param key      缓存的键值 
 | 
     * @param value    缓存的值 
 | 
     * @param timeout  时间 
 | 
     * @param timeUnit 时间颗粒度 
 | 
     */ 
 | 
    public <T> void setCacheObject(final String key, final T value, final long timeout, final TimeUnit timeUnit) { 
 | 
        redisTemplate.opsForValue().set(key, value, timeout, timeUnit); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 设置有效时间 
 | 
     * 
 | 
     * @param key     Redis键 
 | 
     * @param timeout 超时时间 
 | 
     * @return true=设置成功;false=设置失败 
 | 
     */ 
 | 
    public boolean expire(final String key, final long timeout) { 
 | 
        return expire(key, timeout, TimeUnit.SECONDS); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 设置有效时间 
 | 
     * 
 | 
     * @param key     Redis键 
 | 
     * @param timeout 超时时间 
 | 
     * @param unit    时间单位 
 | 
     * @return true=设置成功;false=设置失败 
 | 
     */ 
 | 
    public boolean expire(final String key, final long timeout, final TimeUnit unit) { 
 | 
        return redisTemplate.expire(key, timeout, unit); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 获取有效时间 
 | 
     * 
 | 
     * @param key Redis键 
 | 
     * @return 有效时间 
 | 
     */ 
 | 
    public long getExpire(final String key) { 
 | 
        return redisTemplate.getExpire(key); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 判断 key是否存在 
 | 
     * 
 | 
     * @param key 键 
 | 
     * @return true 存在 false不存在 
 | 
     */ 
 | 
    public Boolean hasKey(String key) { 
 | 
        return redisTemplate.hasKey(key); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 获得缓存的基本对象。 
 | 
     * 
 | 
     * @param key 缓存键值 
 | 
     * @return 缓存键值对应的数据 
 | 
     */ 
 | 
    public <T> T getCacheObject(final String key) { 
 | 
        ValueOperations<String, T> operation = redisTemplate.opsForValue(); 
 | 
        return operation.get(key); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 删除单个对象 
 | 
     * 
 | 
     * @param key 
 | 
     */ 
 | 
    public boolean deleteObject(final String key) { 
 | 
        return redisTemplate.delete(key); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 删除集合对象 
 | 
     * 
 | 
     * @param collection 多个对象 
 | 
     * @return 
 | 
     */ 
 | 
    public boolean deleteObject(final Collection collection) { 
 | 
        return redisTemplate.delete(collection) > 0; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 缓存List数据 
 | 
     * 
 | 
     * @param key      缓存的键值 
 | 
     * @param dataList 待缓存的List数据 
 | 
     * @return 缓存的对象 
 | 
     */ 
 | 
    public <T> long setCacheListRight(final String key, final List<T> dataList) { 
 | 
        Long count = redisTemplate.opsForList().rightPushAll(key, dataList); 
 | 
        return count == null ? 0 : count; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 缓存List数据 
 | 
     * 
 | 
     * @param key      缓存的键值 
 | 
     * @param dataList 待缓存的List数据(这里如果新增的话,是往头部新增) 
 | 
     * @return 缓存的对象 
 | 
     */ 
 | 
    public <T> long setCacheListLeft(final String key, final List<T> dataList) { 
 | 
        Long count = redisTemplate.opsForList().leftPushAll(key, dataList); 
 | 
        return count == null ? 0 : count; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 缓存List数据 
 | 
     * 
 | 
     * @param cacheKey 缓存的键值 
 | 
     * @param list     待缓存的List数据(这里如果新增的话,是往头部新增)并去重 
 | 
     * @return 缓存的对象 
 | 
     */ 
 | 
    public void setCacheListLeftAndDistinct(String cacheKey, List<String> list) { 
 | 
        // 检查 key 类型 
 | 
        DataType keyType = redisTemplate.type(cacheKey); 
 | 
        if (keyType != DataType.NONE && keyType != DataType.LIST) { 
 | 
            // 如果已经存在但不是 list 类型,删除它(或直接抛异常也可) 
 | 
            redisTemplate.delete(cacheKey); 
 | 
        } 
 | 
  
 | 
        ListOperations<String, String> listOps = redisTemplate.opsForList(); 
 | 
        List<String> existingValues = listOps.range(cacheKey, 0, -1); 
 | 
  
 | 
        List<String> newValues = list.stream().filter(value -> !existingValues.contains(value)).collect(Collectors.toList()); 
 | 
  
 | 
        if (!newValues.isEmpty()) { 
 | 
            listOps.leftPushAll(cacheKey, newValues); 
 | 
        } 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 获得缓存的list对象 
 | 
     * 
 | 
     * @param key 缓存的键值 
 | 
     * @return 缓存键值对应的数据 
 | 
     */ 
 | 
    public <T> List<T> getCacheList(final String key) { 
 | 
        return redisTemplate.opsForList().range(key, 0, -1); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 缓存Set 
 | 
     * 
 | 
     * @param key     缓存键值 
 | 
     * @param dataSet 缓存的数据 
 | 
     * @return 缓存数据的对象 
 | 
     */ 
 | 
    public <T> BoundSetOperations<String, T> setCacheSet(final String key, final Set<T> dataSet) { 
 | 
        BoundSetOperations<String, T> setOperation = redisTemplate.boundSetOps(key); 
 | 
        Iterator<T> it = dataSet.iterator(); 
 | 
        while (it.hasNext()) { 
 | 
            setOperation.add(it.next()); 
 | 
        } 
 | 
        return setOperation; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 获得缓存的set 
 | 
     * 
 | 
     * @param key 
 | 
     * @return 
 | 
     */ 
 | 
    public <T> Set<T> getCacheSet(final String key) { 
 | 
        return redisTemplate.opsForSet().members(key); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 缓存Map 
 | 
     * 
 | 
     * @param key 
 | 
     * @param dataMap 
 | 
     */ 
 | 
    public <T> void setCacheMap(final String key, final Map<String, T> dataMap) { 
 | 
        if (dataMap != null) { 
 | 
            redisTemplate.opsForHash().putAll(key, dataMap); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 获取所有key 
 | 
     * 
 | 
     * @return 
 | 
     */ 
 | 
    public Set<String> getAllKeys() { 
 | 
        return redisTemplate.keys("*"); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 获得缓存的Map 
 | 
     * 
 | 
     * @param key 
 | 
     * @return 
 | 
     */ 
 | 
    public <T> Map<String, T> getCacheMap(final String key) { 
 | 
        return redisTemplate.opsForHash().entries(key); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 往Hash中存入数据 
 | 
     * 
 | 
     * @param key   Redis键 
 | 
     * @param hKey  Hash键 
 | 
     * @param value 值 
 | 
     */ 
 | 
    public <T> void setCacheMapValue(final String key, final String hKey, final T value) { 
 | 
        redisTemplate.opsForHash().put(key, hKey, value); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 获取Hash中的数据 
 | 
     * 
 | 
     * @param key  Redis键 
 | 
     * @param hKey Hash键 
 | 
     * @return Hash中的对象 
 | 
     */ 
 | 
    public <T> T getCacheMapValue(final String key, final String hKey) { 
 | 
        HashOperations<String, String, T> opsForHash = redisTemplate.opsForHash(); 
 | 
        return opsForHash.get(key, hKey); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 获取多个Hash中的数据 
 | 
     * 
 | 
     * @param key   Redis键 
 | 
     * @param hKeys Hash键集合 
 | 
     * @return Hash对象集合 
 | 
     */ 
 | 
    public <T> List<T> getMultiCacheMapValue(final String key, final Collection<Object> hKeys) { 
 | 
        return redisTemplate.opsForHash().multiGet(key, hKeys); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 删除Hash中的某条数据 
 | 
     * 
 | 
     * @param key  Redis键 
 | 
     * @param hKey Hash键 
 | 
     * @return 是否成功 
 | 
     */ 
 | 
    public boolean deleteCacheMapValue(final String key, final String hKey) { 
 | 
        return redisTemplate.opsForHash().delete(key, hKey) > 0; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 删除缓存LIST中的某个数据 
 | 
     * 
 | 
     * @param key           Redis键 
 | 
     * @param valueToRemove 需要删除的值 
 | 
     * @return Long 大于0表示删除了几个,等于0表示没有删除,小于0表示在执行删除操作时发生了错误 
 | 
     */ 
 | 
    public Long removeElementFromList(String key, String valueToRemove) { 
 | 
        ListOperations<String, String> listOps = redisTemplate.opsForList(); 
 | 
        Long remove = listOps.remove(key, 0, valueToRemove); 
 | 
        return remove; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 获得缓存的基本对象列表 
 | 
     * 
 | 
     * @param pattern 字符串前缀 
 | 
     * @return 对象列表 
 | 
     */ 
 | 
    public Collection<String> keys(final String pattern) { 
 | 
        return redisTemplate.keys(pattern); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 获取当前key值的数量 
 | 
     * @param key 
 | 
     * @return 
 | 
     */ 
 | 
    public Long getListSize(String key) { 
 | 
        return redisTemplate.opsForList().size(key); 
 | 
    } 
 | 
} 
 |