From 832b65469f856e12749019191095c33423df3a6b Mon Sep 17 00:00:00 2001 From: zhouyu <3065526146@qq.com> Date: Tue, 17 Dec 2024 09:11:07 +0800 Subject: [PATCH] 111 --- .../com/njupt/swg/cache/CommonCacheUtil.java | 38 ++++++++++++++++--- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/snailmall-user-service/src/main/java/com/njupt/swg/cache/CommonCacheUtil.java b/snailmall-user-service/src/main/java/com/njupt/swg/cache/CommonCacheUtil.java index 66c6499..46a0ea8 100644 --- a/snailmall-user-service/src/main/java/com/njupt/swg/cache/CommonCacheUtil.java +++ b/snailmall-user-service/src/main/java/com/njupt/swg/cache/CommonCacheUtil.java @@ -13,21 +13,31 @@ import redis.clients.jedis.JedisPool; * @CONTACT 317758022@qq.com * @DESC */ +// 使用Spring框架的@Component注解,将该类标记为一个组件,意味着Spring会对这个类进行管理,在需要使用这个类的实例时,可以通过依赖注入等方式获取,方便在整个应用的各个组件之间进行协作和复用。 @Component +// 使用lombok的@Slf4j注解,用于自动生成日志相关的代码,方便在类中记录各种操作相关的日志信息,便于后续查看操作情况以及进行问题排查,比如当与Redis交互出现异常等情况时,可以详细记录错误信息,帮助定位和解决问题。 @Slf4j public class CommonCacheUtil { + // 通过Spring的依赖注入机制,使用@Autowired注解自动注入JedisPoolWrapper类型的实例,JedisPoolWrapper应该是对JedisPool(Jedis连接池)进行了一定封装的类,通过它可以获取到Jedis连接池对象,进而获取Jedis客户端实例来操作Redis缓存。 @Autowired private JedisPoolWrapper jedisPoolWrapper; + /** + * 此方法用于向缓存(通常是Redis)中存储一个永久有效的键值对,即将指定的键(key)和值(value)存入缓存中,没有设置过期时间,意味着数据会一直保存在缓存里,除非手动删除。 + * 具体操作流程如下: + * 首先,尝试通过注入的JedisPoolWrapper实例获取JedisPool对象,如果获取到的JedisPool不为null,说明可以正常获取到Jedis连接池,进而可以从中获取Jedis客户端连接来操作Redis。 + * 接着,通过try-with-resources语句获取Jedis客户端实例(Jedis),这样可以确保在使用完Jedis后自动关闭资源,避免资源泄露。获取到Jedis实例后,调用select(0)方法选择Redis的第0个数据库(在Redis中可以有多个数据库,这里默认选择第0个),然后使用set方法将传入的键值对存入Redis中。 + * 如果在整个过程中出现任何异常,会记录详细的错误日志(通过log.error方法记录“redis存值失败”以及具体的异常信息),并且抛出一个自定义的SnailmallException异常,提示“redis报错”,方便在调用这个方法的上层代码中进行相应的异常处理和业务逻辑调整。 + */ /** * 缓存永久key */ public void cache(String key, String value) { try { JedisPool pool = jedisPoolWrapper.getJedisPool(); - if (pool != null) { + if (pool!= null) { try (Jedis Jedis = pool.getResource()) { Jedis.select(0); Jedis.set(key, value); @@ -39,6 +49,12 @@ public class CommonCacheUtil { } } + /** + * 该方法用于从缓存(通常是Redis)中获取指定键(key)对应的缓存值。 + * 具体实现逻辑为: + * 先初始化一个用于存储获取到的值的变量value为null,然后尝试通过JedisPoolWrapper获取JedisPool对象,如果获取到的JedisPool不为null,就通过try-with-resources语句获取Jedis客户端实例,同样先选择Redis的第0个数据库,再使用get方法从Redis中获取指定键对应的缓存值,并将其赋值给value变量。 + * 如果在操作过程中出现异常,会记录“redis获取指失败”的错误日志以及具体异常信息,然后抛出SnailmallException异常提示“redis报错”,最后返回获取到的缓存值(如果获取成功则返回对应的值,若获取失败则返回初始化的null值),供调用该方法的代码进行后续处理,比如根据获取到的值判断业务逻辑等情况。 + */ /** * 获取缓存key */ @@ -46,7 +62,7 @@ public class CommonCacheUtil { String value = null; try { JedisPool pool = jedisPoolWrapper.getJedisPool(); - if (pool != null) { + if (pool!= null) { try (Jedis Jedis = pool.getResource()) { Jedis.select(0); value = Jedis.get(key); @@ -59,6 +75,13 @@ public class CommonCacheUtil { return value; } + /** + * 此方法实现了向缓存(通常是Redis)中存入一个带有过期时间的键值对,并且使用了setnx命令(set if not exists),只有当键不存在时才会设置成功,同时设置过期时间。 + * 具体步骤如下: + * 首先初始化一个用于存储操作结果的变量result为0,然后尝试通过JedisPoolWrapper获取JedisPool对象,如果获取到的JedisPool不为null,就通过try-with-resources语句获取Jedis客户端实例,选择Redis的第0个数据库后,先使用setnx方法尝试将键值对存入Redis中,setnx方法会返回一个长整型的值,表示设置是否成功(如果键不存在且设置成功则返回1,否则返回0),将这个返回值赋值给result变量。 + * 接着,无论setnx操作是否成功,都会调用expire方法设置指定键的过期时间(传入的expire参数表示过期时间,单位通常是秒),确保缓存数据在一定时间后会自动过期被删除。 + * 如果在整个过程中出现异常,会记录“redis塞值和设置缓存时间失败”的错误日志以及具体异常信息,然后抛出SnailmallException异常提示“redis报错”,最后返回result变量的值,调用者可以根据这个值判断是否成功设置了缓存键值对(通常根据返回值是否为1来判断),进而进行后续的业务逻辑处理。 + */ /** * 过期key */ @@ -66,7 +89,7 @@ public class CommonCacheUtil { long result = 0; try { JedisPool pool = jedisPoolWrapper.getJedisPool(); - if (pool != null) { + if (pool!= null) { try (Jedis jedis = pool.getResource()) { jedis.select(0); result = jedis.setnx(key, value); @@ -81,12 +104,17 @@ public class CommonCacheUtil { return result; } + /** + * 该方法用于从缓存(通常是Redis)中删除指定的键(key)对应的缓存数据,即将对应的缓存键值对从Redis中移除。 + * 实现逻辑是: + * 先通过JedisPoolWrapper获取JedisPool对象,如果获取到的JedisPool不为null,就通过try-with-resources语句获取Jedis客户端实例,选择Redis的第0个数据库后,尝试使用del方法删除指定的键对应的缓存数据,如果在删除过程中出现异常(比如键不存在或者其他Redis操作相关的错误),会记录“从redis中删除失败”的错误日志以及具体异常信息,然后抛出SnailmallException异常提示“redis报错”,确保在出现问题时能及时反馈异常情况,方便调用者进行相应处理。 + */ /** * 删除缓存key */ public void delKey(String key) { JedisPool pool = jedisPoolWrapper.getJedisPool(); - if (pool != null) { + if (pool!= null) { try (Jedis jedis = pool.getResource()) { jedis.select(0); try { @@ -101,4 +129,4 @@ public class CommonCacheUtil { -} +} \ No newline at end of file