package com.starry.common.redis;

import java.util.Collection;
import java.util.concurrent.TimeUnit;
import javax.annotation.Resource;
import org.springframework.dao.QueryTimeoutException;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;

/**
 * @author rieds 工具类
 * @since 2022/8/26
 */
@Component
public class RedisCache {

    @Resource
    public RedisTemplate<String, Object> redisTemplate;

    /**
     * 获得缓存的基本对象。
     *
     * @param key
     *            缓存键值
     * @return 缓存键值对应的数据
     */
    public <T> T getCacheObject(final String key) {
        ValueOperations<String, Object> operations = redisTemplate.opsForValue();
        try {
            return (T) operations.get(key);
        } catch (QueryTimeoutException e) {
            throw new RuntimeException("系统错误，通讯异常");
        }

    }

    /**
     * 缓存基本的对象，Integer、String、实体类等
     *
     * @param key
     *            缓存的键值
     * @param value
     *            缓存的值
     */
    public <T> void setCacheObject(final String key, final T value) {
        redisTemplate.opsForValue().set(key, value);
    }

    /**
     * 缓存基本的对象，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
     */
    public boolean deleteObject(final String key) {
        return redisTemplate.delete(key);
    }

    /**
     * 获得缓存的基本对象列表
     *
     * @param pattern
     *            字符串前缀
     * @return 对象列表
     */
    public Collection<String> keys(final String pattern) {
        return redisTemplate.keys(pattern);
    }

    /**
     * 删除集合对象
     *
     * @param collection
     *            多个对象
     * @return
     */
    public long deleteObject(final Collection collection) {
        return redisTemplate.delete(collection);
    }
}
