package com.njupt.swg.cache; import com.njupt.swg.common.exception.SnailmallException; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; /** * 该类CommonCacheUtil是一个工具类,用于与Redis缓存进行交互操作,提供了如缓存数据、获取缓存数据、设置带过期时间的缓存以及删除缓存等常用功能。 * 它依赖于JedisPoolWrapper来获取JedisPool对象,进而操作Redis缓存,并且在操作过程中如果出现异常会抛出SnailmallException异常,同时记录相关的日志信息用于排查问题。 * 此类被标记为Spring的@Component组件,方便在Spring容器中进行管理和注入使用。 * @Author swg. * @Date 2019/1/1 15:03 * @CONTACT 317758022@qq.com * @DESC */ @Component // 该注解表明这个类是Spring框架中的一个组件,Spring会自动扫描并将其纳入到容器管理中,使其可以被其他需要使用的类进行依赖注入。 @Slf4j // 使用lombok的@Slf4j注解,自动生成一个名为log的日志记录对象,方便在类中记录日志信息,便于后续调试和查看与Redis交互过程中出现的问题情况。 public class CommonCacheUtil { @Autowired // 使用Spring的依赖注入功能,自动注入JedisPoolWrapper的实例,通过它来获取JedisPool,从而能够获取Jedis客户端连接到Redis服务器进行操作。 private JedisPoolWrapper jedisPoolWrapper; /** * 缓存永久key的方法,用于将指定的键值对存储到Redis缓存中,且该缓存数据没有设置过期时间(永久有效,除非手动删除)。 * * @param key 要存储到Redis中的键,用于唯一标识缓存数据,后续可以通过该键来获取对应的缓存值。 * @param value 要存储到Redis中的值,对应键所关联的数据内容,可以是各种序列化后的字符串形式的数据(如JSON字符串等)。 */ public void cache(String key, String value) { try { JedisPool pool = jedisPoolWrapper.getJedisPool(); if (pool!= null) { try (Jedis jedis = pool.getResource()) { jedis.select(0); // 使用Jedis客户端将指定的键值对存储到Redis中,默认存储到Redis的第0个数据库(Redis可以有多个数据库,通过select方法选择)。 jedis.set(key, value); } } } catch (Exception e) { log.error("redis存值失败", e); // 如果在存储过程中出现异常,记录错误日志,并抛出SnailmallException异常,提示“redis报错”,由全局异常处理机制进行处理。 throw new SnailmallException("redis报错"); } } /** * 获取缓存key对应的缓存值的方法,用于从Redis缓存中根据指定的键获取对应的值。 * * @param key 要从Redis中获取值的键,通过该键来查找之前存储在Redis中的对应缓存数据。 * @return 返回从Redis中获取到的对应键的值,如果键不存在则返回null,若获取过程中出现异常会抛出相应异常。 */ public String getCacheValue(String key) { String value = null; try { JedisPool pool = jedisPoolWrapper.getJedisPool(); if (pool!= null) { try (Jedis jedis = pool.getResource()) { jedis.select(0); // 使用Jedis客户端根据指定的键从Redis中获取对应的值,默认从Redis的第0个数据库中查找。 value = jedis.get(key); } } } catch (Exception e) { log.error("redis获取指失败", e); // 如果在获取过程中出现异常,记录错误日志,并抛出SnailmallException异常,提示“redis报错”,由全局异常处理机制进行处理。 throw new SnailmallException("redis报错"); } return value; } /** * 过期key的方法,用于将指定的键值对存储到Redis缓存中,并同时设置该缓存数据的过期时间,且只有在键不存在时才设置成功(原子操作)。 * * @param key 要存储到Redis中的键,用于唯一标识缓存数据,后续可以通过该键来获取对应的缓存值以及判断其是否过期等情况。 * @param value 要存储到Redis中的值,对应键所关联的数据内容,可以是各种序列化后的字符串形式的数据(如JSON字符串等)。 * @param expire 要设置的缓存数据的过期时间,单位为秒,表示从存储该缓存数据开始,经过指定的秒数后,该缓存数据将自动从Redis中删除。 * @return 返回一个长整型结果,表示设置操作是否成功,若返回1表示设置成功(键不存在,成功设置了键值对并设置了过期时间),若返回0表示设置失败(键已存在)。 */ public long cacheNxExpire(String key, String value, int expire) { long result = 0; try { JedisPool pool = jedisPoolWrapper.getJedisPool(); if (pool!= null) { try (Jedis jedis = pool.getResource()) { jedis.select(0); // 先使用Jedis的setnx方法尝试设置键值对,只有在键不存在时才会设置成功,返回1;若键已存在则设置失败,返回0。这是一个原子操作。 result = jedis.setnx(key, value); // 如果设置键值对成功(即setnx返回1),再使用expire方法设置该键对应的缓存数据的过期时间,单位为秒。 jedis.expire(key, expire); } } } catch (Exception e) { log.error("redis塞值和设置缓存时间失败", e); // 如果在设置过程中出现异常,记录错误日志,并抛出SnailmallException异常,提示“redis报错”,由全局异常处理机制进行处理。 throw new SnailmallException("redis报错"); } return result; } /** * 删除缓存key的方法,用于从Redis缓存中删除指定的键及其对应的数据。 * * @param key 要从Redis中删除的键,通过该键来定位并删除对应的缓存数据。 */ public void delKey(String key) { JedisPool pool = jedisPoolWrapper.getJedisPool(); if (pool!= null) { try (Jedis jedis = pool.getResource()) { jedis.select(0); try { // 使用Jedis客户端根据指定的键从Redis中删除对应的缓存数据,默认从Redis的第0个数据库中删除。 jedis.del(key); } catch (Exception e) { log.error("从redis中删除失败", e); // 如果在删除过程中出现异常,记录错误日志,并抛出SnailmallException异常,提示“redis报错”,由全局异常处理机制进行处理。 throw new SnailmallException("redis报错"); } } } } }