当前位置:   article > 正文

自定义redis监听器

redis监听器

监听器主要用于监听redis的失效Key,根据此key来做一些其他业务(在此我用来处理redis的list结构中保存的Key,该key本身使用string类型保存了一些其他的json数据,你们可根据自己的业务需求来做其他处理)

  1. import lombok.extern.slf4j.Slf4j;
  2. import org.apache.commons.lang3.StringUtils;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.data.redis.connection.Message;
  5. import org.springframework.data.redis.connection.MessageListener;
  6. import org.springframework.data.redis.core.*;
  7. import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
  8. import org.springframework.data.redis.listener.RedisMessageListenerContainer;
  9. import org.springframework.scheduling.annotation.Async;
  10. import org.springframework.stereotype.Component;
  11. import java.util.*;
  12. import javax.annotation.Resource;
  13. import java.util.function.Function;
  14. import java.util.stream.Collectors;
  15. @Slf4j
  16. @Component
  17. public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
  18. private final RedisTemplate<String, String> redisTemplate;
  19. @Autowired
  20. public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer, RedisTemplate<String, String> redisTemplate) {
  21. super(listenerContainer);
  22. this.redisTemplate = redisTemplate;
  23. }
  24. @Override
  25. public void onMessage(Message message, byte[] pattern) {
  26. // 用户做自己的业务处理即可,注意message.toString()可以获取失效的key
  27. log.info("进入key失效监听事件!");
  28. performOperationForRedis(message);
  29. }
  30. /**
  31. * 异步执行删除失效key业务
  32. *
  33. * @param message
  34. */
  35. @Async
  36. public void performOperationForRedis(Message message) {
  37. String uuid = message.toString(); // 获取到失效的key
  38. FileService fileService = new FileService();
  39. try {
  40. String substring = uuid.substring(0, 4);
  41. // 新开线程,执行redis删除操作
  42. Set keys = redisTemplate.keys("*");
  43. List<String> list = new ArrayList<>(keys);
  44. log.info("执行redis删除操作!");
  45. for (String key : list) {
  46. // 过滤掉hash格式的key(不以图片存储格式结尾)
  47. if (!key.endsWith("Jpeg") && !key.endsWith("jpg")) {
  48. ListOperations listOperations = redisTemplate.opsForList();
  49. // 不是hash格式的key则获取整个列表
  50. List redisList = getRedisList(listOperations, key); // 该方法处理了异常,key为空或值无法获取的则返回空集合
  51. // 获取到的集合数据不为空
  52. if (redisList != null) {
  53. // 循环获取到集合中存在的单个元素(单个key)
  54. for (Object aaa : redisList) {
  55. // 判断获取出的Key是否是失效的key
  56. if (StringUtils.equals(String.valueOf(aaa), uuid)) {
  57. listOperations.remove(key, 0, uuid);
  58. log.info("失效key删除成功");
  59. }
  60. }
  61. }
  62. }
  63. }
  64. log.info("缓存清理完成!");
  65. } catch (Exception e) {
  66. log.info("删除redis数据失败-》uuid: " + uuid);
  67. e.printStackTrace();
  68. }
  69. }
  70. /**
  71. * 获取redis中该key下的所有值方法(考虑到key存在但数据不存在会报异常,或者key不存在会报异常的两种情况,抽出方法来做单独的异常捕获)
  72. *
  73. * @param listOperations
  74. * @param key
  75. * @return
  76. */
  77. public List getRedisList(ListOperations listOperations, String key) {
  78. try {
  79. // 获取redis列表中的值
  80. List range = listOperations.range(key, 0, -1);
  81. return range;
  82. } catch (Exception e) {
  83. // 异常返回空集合
  84. return null;
  85. }
  86. }
  87. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/925192
推荐阅读
相关标签
  

闽ICP备14008679号