Redis java常用封装

@Service
public class RedisService {

    @Autowired
    private RedissonClient redissonClient;

    @Resource
    private RedisTemplate<String, Object> redisTemplate;
    
    /**
     * 建议使用redisson的加锁 释放锁
     */
    /**
     * 释放锁成功返回值
     */
    private static final Long RELEASE_LOCK_SUCCESS_RESULT = 1L;
    private static final String RELEASE_LOCK_SCRIPT = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";

    /**
     * 模糊查询 获取key集合
     *
     * @param key
     * @return
     */
    public Iterator<String> getKeys(String key) {
        Iterable<String> keysByPattern = redissonClient.getKeys().getKeysByPattern(key);
        Iterator<String> iterator = keysByPattern.iterator();
        return iterator;
    }

    /**
     * 获取list信息
     *
     * @param key
     * @param clazz
     * @param <T>
     * @return
     */
    public <T> List<T> getList(String key, Class<T> clazz) {
        RList<T> list = redissonClient.getList(key);
        List<T> ts = list.readAll();
        return ts;
    }

    /**
     * 添加所有 list信息
     *
     * @param key
     * @param data
     * @param clazz      泛型 (需要实现Serializable接口)
     * @param timeToLive 过期时间 单位(秒)
     * @param <T>
     * @return
     */
    public <T> boolean setList(String key, List<T> data, Class<T> clazz, Long timeToLive) {
        RList<T> list = redissonClient.getList(key);
        list.clear();
        boolean b = list.addAll(data);
        list.expire(timeToLive, TimeUnit.SECONDS);
        return b;
    }

    /**
     * 添加所有 list信息
     *
     * @param key
     * @param data
     * @param clazz 泛型 (需要实现Serializable接口)
     * @param <T>
     * @return
     */
    public <T> boolean setList(String key, List<T> data, Class<T> clazz) {
        RList<T> list = redissonClient.getList(key);
        list.clear();
        boolean b = list.addAll(data);
        return b;
    }

    /**
     * 追加list
     *
     * @param key
     * @param data
     * @param clazz 泛型 (需要实现Serializable接口)
     * @param <T>
     * @return
     */
    public <T> boolean addList(String key, T data, Class<T> clazz) {
        RList<T> list = redissonClient.getList(key);
        boolean b = list.add(data);
        return b;
    }

    /**
     * 追加所有list
     *
     * @param key
     * @param data
     * @param clazz
     * @param <T>
     * @return
     */
    public <T> boolean addAllList(String key, List<T> data, Class<T> clazz) {
        RList<T> list = redissonClient.getList(key);
        boolean b = list.addAll(data);
        return b;
    }

    /**
     * 添加String
     *
     * @param key
     * @param data
     */
    public void setString(String key, String data) {
        RBucket<String> bucket = redissonClient.getBucket(key, new StringCodec());
        bucket.set(data);
    }

    /**
     * 添加String  失效时间
     *
     * @param key
     * @param data
     * @param timeToLive
     */
    public void setString(String key, String data, Long timeToLive) {
        RBucket<String> bucket = redissonClient.getBucket(key, new StringCodec());
        bucket.set(data);
        bucket.expire(timeToLive, TimeUnit.SECONDS);
    }

    /**
     * 删除redis
     *
     * @param key
     */
    public void delete(String key) {
        RBucket<String> bucket = redissonClient.getBucket(key, new StringCodec());
        bucket.delete();
    }

    /**
     * 获取String
     *
     * @param key
     */
    public String getString(String key) {
        RBucket<String> bucket = redissonClient.getBucket(key, new StringCodec());
        String s = bucket.get();
        return s;
    }

    /**
     * 插入对象
     *
     * @param <T>
     * @param key
     * @param t
     * @param timeToLive
     */
    public <T> void setBucket(String key, T t, Long timeToLive) {
        RBucket<Object> bucket = redissonClient.getBucket(key);
        bucket.set(t);
        bucket.expire(timeToLive, TimeUnit.SECONDS);
    }

    /**
     * 插入对象
     *
     * @param key
     * @param t
     * @param clazz
     * @param <T>
     */
    public <T> void setBucket(String key, T t, Class<T> clazz) {
        RBucket<Object> bucket = redissonClient.getBucket(key);
        bucket.set(t);
    }

    /**
     * 获取对象
     *
     * @param key
     * @param <T>
     * @return
     */
    public <T> T getBucket(String key, Class<T> clazz) {
        RBucket<T> bucket = redissonClient.getBucket(key);
        T t = bucket.get();
        return t;
    }

    /**
     * 判断key值或内容是否存在
     *
     * @param key
     * @return
     */
    public boolean hasKey(String key) {
        RBucket<String> bucket = redissonClient.getBucket(key, new StringCodec());
        if (bucket.isExists()) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 添加map
     *
     * @param name
     * @param key
     * @param value
     * @param <T>
     */
    public <T> void putMap(String name, String key, T value) {
        RMap<String, T> map = redissonClient.getMap(name);
        map.put(key, value);
    }

    /**
     * 添加map
     *
     * @param name
     * @param key
     * @param value
     * @param timeToLive
     * @param <T>
     */
    public <T> void putMap(String name, String key, T value, Long timeToLive) {
        RMap<String, T> map = redissonClient.getMap(name);
        map.put(key, value);
        map.expire(timeToLive, TimeUnit.SECONDS);
    }

    /**
     * 获取map
     *
     * @param name
     * @param key
     * @param <T>
     * @return
     */
    public <T> T getMap(String name, String key) {
        RMap<String, T> map = redissonClient.getMap(name);
        T t = map.get(key);
        return t;
    }

    /**
     * 获取增量
     *
     * @return
     */
    public Long incrementAndGet(String key) {
        return redissonClient.getAtomicLong(key).incrementAndGet();
    }
/*
    *//**
     * 与 tryLock 相对应,用作释放锁
     *
     * @param lockKey
     * @param clientId
     * @return
     *//*
    public Boolean releaseLock(String lockKey, String clientId) {
        DefaultRedisScript<Long> redisScript = new DefaultRedisScript<Long>(RELEASE_LOCK_SCRIPT, Long.class);
        Long result = redisTemplate.execute(redisScript, Collections.singletonList(lockKey), clientId);
        return Objects.equals(result, RELEASE_LOCK_SUCCESS_RESULT);
    }

    *//**
     * 该加锁方法仅针对单实例 Redis 可实现分布式加锁
     * 对于 Redis 集群则无法使用
     * <p>
     * 支持重复,线程安全
     * 建议使用Redisson加锁
     * @param lockKey  加锁键
     * @param clientId 加锁客户端唯一标识(采用UUID)
     * @param seconds  锁过期时间
     * @return
     *//*
    public Boolean tryLock(String lockKey, String clientId, long seconds) {
        Boolean ret = redisTemplate.opsForValue().setIfAbsent(lockKey, clientId, seconds, TimeUnit.SECONDS);
        return ret;
    }*/

    /***
     * 尝试直接加锁
     * @param key
     * @return
     */
    public boolean tryLock(String key) {
        RLock lock = redissonClient.getLock(key);
        return lock.tryLock();
    }

    /**
     * 尝试加锁
     *
     * @param key
     * @param leaseTime 加锁时间
     * @return
     */
    public boolean tryLock(String key, Long leaseTime) {
        Boolean result = false;
        try {
            RLock lock = redissonClient.getLock(key);
            result = lock.tryLock(0, leaseTime, TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            return false;
        }
        return result;
    }


    /**
     * 尝试加锁
     *
     * @param key
     * @param waitTime  等待时间
     * @param leaseTime 加锁时间
     * @return
     */
    public boolean tryLock(String key, Long waitTime, Long leaseTime) {
        Boolean result = false;
        try {
            RLock lock = redissonClient.getLock(key);
            result = lock.tryLock(waitTime, leaseTime, TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            return false;
        }
        return result;
    }

    /**
     * 释放锁
     *
     * @param key
     */
    public void unLock(String key) {
        try {
            RLock lock = redissonClient.getLock(key);
            lock.unlock();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}