栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

springboot-redis设置定时触发任务、删除定时任务

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

springboot-redis设置定时触发任务、删除定时任务

springboot-redis设置定时触发任务、删除定时任务
  • Redis实现定时触发任务、删除定时任务
    • 业务背景
    • 需求梳理
    • 配置
    • 项目代码

Redis实现定时触发任务、删除定时任务 业务背景
  • 个人平台账号可申请注销
  • 申请注销后七天内可撤销注销
  • 七天后触发删除账号业务的函数
需求梳理
  • 申请触发定时任务
  • 删除定时任务
配置
  • springboot-maven配置

            org.springframework.boot
            spring-boot-starter-data-redis

springboot提供了spring-boot-starter-data-redis,里面也已经封装了spring中redis的配置spring-data-redis。

项目代码

http请求访问时,service层函数内部调用redisTemplate在Redis里设置一个注销key

代码例子如下:

  1. 个人平台账号可申请注销
    @Autowired
    private RedisTemplate redisTemplate;
    
    public void deleteUser(String key, String value){
   
        // 关键代码
        redisTemplate.opsForValue().set(key, value);
        // 设置七天注销时间
        redisTemplate.expire(key, DEFAULT_DELETE_TIME, TimeUnit.SECONDS);

        // 监听过期key,获取value使用
        String tempKey = key + "_2";
        redisTemplate.opsForValue().set(tempKey, value);
    }

注意: redis里面设置了两个key,原因在于:key过期之后,在ResdisExpirationListener 的 onMessage函数中 无法拿到key对应的value,所以设置两个,key不同但是value一样。这个value是为了key到期之后触发想要的任务函数。

  1. 申请注销后七天内可撤销注销
 public void withdrawDeleteUser(String key) {
        redisTemplate.delete(key);
        // 删除临时key
        redisTemplate.delete(key + "_2");
    }

注意: redis里面设置的两个key都必须删除

  1. 新建RedisListenerConfig.class
@Component
public class RedisListenerConfig {

    @Bean
    @Primary
    public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory){

        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        return container;
    }
}
  1. 新建ResdisExpirationListener.class
    业务最主要在onMessage函数,key过期后会自动触发该函数,message信息是key,根据redisTemplate和另外设置的一个key拿到value,这个value在触发的定时任务函数里面用到了,所以必须拿到。
@Slf4j
@Component
@Transactional
    public class ResdisExpirationListener extends KeyExpirationEventMessageListener {


    @Autowired
    UserService userService;

    @Autowired
    private RedisTemplate redisTemplate;

    public ResdisExpirationListener(RedisMessageListenerContainer listenerContainer) {
        super(listenerContainer);
    }

    @Override
    public void onMessage(Message message, byte[] pattern){
        String messageKey = message.toString();

		// 业务实现
        if(messageKey.contains(RedisKey.DELETE_USER)){

            String userKey = redisTemplate.opsForValue().get(messageKey + "_2").toString();
            Long userId = Long.parseLong(userKey);
            // 触发定时任务
            userService.deleteUserProcess(userId);

            // 删除临时key
            redisTemplate.delete(messageKey + "_2");

        }
    }
}

好了,可以跑跑看了。

说明:

  • redis定时任务还可以有很多实现,文中只是一种。
  • 读者可以对redisTemplate中的方法进行封装,但因博主需求中只用到几个方法,出于代码可读性和解析性能考虑,不做封装。
  • 如果出现问题,要有耐心哦。可评论交流,也可自行查看api文档

sping_data_redis_api_document

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/281055.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号