package com.huaheng.common.redis; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import org.springframework.data.redis.core.*; import java.io.Serializable; import java.util.List; import java.util.Set; import java.util.concurrent.TimeUnit; /** * @ClassName RedisUtils * @Description redis操作的工具类 * @CreateDate 2022/12/22 15:01 * @Version 1.0 **/ public class RedisUtils { /** * @Description 写入缓存 * @Param [redisTemplate, key, value] * @Return void **/ public static void set(RedisTemplate redisTemplate,final String key, Object value) throws Exception { ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue(); operations.set(key, value); } /** * @Description 写入缓存设置时效时间 * @Param [redisTemplate, key, value, expireTime] * @Return void **/ public static void set(RedisTemplate redisTemplate,final String key, Object value, Long expireTime) throws Exception{ ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue(); operations.set(key, value); redisTemplate.expire(key, expireTime, TimeUnit.SECONDS); } /** * @Description 批量删除key * @Param [redisTemplate, pattern] * @Return void **/ public static void removePattern(RedisTemplate redisTemplate,final String pattern) throws Exception { Set<Serializable> keys = redisTemplate.keys(pattern); if (keys.size() > 0){ redisTemplate.delete(keys); } } /** * @Description 删除对应的value * @Param [redisTemplate, key] * @Return void **/ public static void remove(RedisTemplate redisTemplate,final String key) throws Exception{ if (exists(redisTemplate,key)) { redisTemplate.delete(key); } } /** * @Description 判断缓存中是否有对应的value * @Param [redisTemplate, key] * @Return boolean **/ public static boolean exists(RedisTemplate redisTemplate,final String key) throws Exception{ return redisTemplate.hasKey(key); } /** * @Description 读取缓存 * @Param [redisTemplate, key] * @Return java.lang.Object **/ public static Object get(RedisTemplate redisTemplate,final String key) throws Exception{ Object result = null; ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue(); result = operations.get(key); return result; } /** * @Description 哈希 添加 * @Param [redisTemplate, key, hashKey, value] * @Return void **/ public static void hmSet(RedisTemplate redisTemplate,String key, Object hashKey, Object value) throws Exception{ HashOperations<String, Object, Object> hash = redisTemplate.opsForHash(); hash.put(key,hashKey,value); } /** * @Description 删除哈希 * @Param [redisTemplate, key, value] * @Return void **/ public static void hmDel(RedisTemplate redisTemplate,String key, Object... value) throws Exception{ HashOperations<String, Object, Object> hash = redisTemplate.opsForHash(); hash.delete(key,value); } /** * @Description 哈希获取数据 * @Param [redisTemplate, key, hashKey] * @Return java.lang.Object **/ public static Object hmGet(RedisTemplate redisTemplate,String key, Object hashKey) throws Exception{ HashOperations<String, Object, Object> hash = redisTemplate.opsForHash(); return hash.get(key,hashKey); } /** * @Description 列表添加 * @Param [redisTemplate, k, v] * @Return void **/ public static void lPush(RedisTemplate redisTemplate,String k,Object v) throws Exception{ ListOperations<String, Object> list = redisTemplate.opsForList(); list.rightPush(k,v); } /** * @Description 列表获取 * @Param [redisTemplate, k, l, l1] * @Return java.util.List<java.lang.Object> **/ public static List<Object> lRange(RedisTemplate redisTemplate,String k, long l, long l1) throws Exception{ ListOperations<String, Object> list = redisTemplate.opsForList(); return list.range(k,l,l1); } /** * @Description 集合添加 * @Param [redisTemplate, key, value] * @Return void **/ public static void add(RedisTemplate redisTemplate,String key,Object value )throws Exception{ SetOperations<String, Object> set = redisTemplate.opsForSet(); set.add(key,value); } /** * @Description 集合获取 * @Param [redisTemplate, key] * @Return java.util.Set<java.lang.Object> **/ public static Set<Object> setMembers(RedisTemplate redisTemplate,String key) throws Exception{ SetOperations<String, Object> set = redisTemplate.opsForSet(); return set.members(key); } /** * @Description 有序集合添加 * @Param [redisTemplate, key, value, scoure] * @Return void **/ public static void zAdd(RedisTemplate redisTemplate,String key,Object value,double scoure) throws Exception{ ZSetOperations<String, Object> zset = redisTemplate.opsForZSet(); zset.add(key,value,scoure); } /** * @Description 有序集合获取 * @Param [redisTemplate, key, scoure, scoure1] * @Return java.util.Set<java.lang.Object> **/ public static Set<Object> rangeByScore(RedisTemplate redisTemplate,String key,double scoure,double scoure1)throws Exception{ ZSetOperations<String, Object> zset = redisTemplate.opsForZSet(); return zset.rangeByScore(key, scoure, scoure1); } /** * @Description 分布式上锁 * @Param redisTemplate key value exprieTime 过期时间,单位分钟 * @Return java.lang.Boolean **/ public static Boolean tryLock(RedisTemplate redisTemplate,String key, long value,long exprieTime) { if (redisTemplate.opsForValue().setIfAbsent(key, value, exprieTime ,TimeUnit.SECONDS)) { return true; } Object currentValue = redisTemplate.opsForValue().get(key); if (ObjectUtils.isNotEmpty(currentValue) && Long.valueOf(currentValue.toString()) < System.currentTimeMillis()) { //获取上一个锁的时间 如果高并发的情况可能会出现已经被修改的问题 所以多一次判断保证线程的安全 Object oldValue = redisTemplate.opsForValue().getAndSet(key, value); if (ObjectUtils.isNotEmpty(oldValue) && oldValue.equals(currentValue)) { return true; } } return false; } /** * @Description 释放分布式锁 * @Param redisTemplate key value * @Return void **/ public static void unlock(RedisTemplate redisTemplate,String key, long value) { Object currentValue = redisTemplate.opsForValue().get(key); try { if (ObjectUtils.isNotEmpty(currentValue) && currentValue.equals(value)) { redisTemplate.opsForValue().getOperations().delete(key); } } catch (Exception e) { } } }