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

使用redission实现定时器+操作缓存(桶概念、分布式锁)

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

使用redission实现定时器+操作缓存(桶概念、分布式锁)

目录

1.加入maven依赖

2.编写application.yaml

3.编写RedissonConfig,配置RedissonClient的信息

4.编写定时器TimerService接口

5.编写定时器TimerService的实现子类,实现定时器

6.编写缓存LocalCacheUtils,实现缓存


1.加入maven依赖


    org.redisson
    redisson
    3.17.0

2.编写application.yaml
spring:
  redis:
    host: localhost
    port: 6379
    password: 111
    database: 0
timer:
  auto-check: "0 0/1 * * * ?"

spring.redis.* : 配置redis

timer.auto-check : 使用cron表达式,设置定时器多久执行一次,key值可自定义

cron表达式生成网址 : 在线Cron表达式生成器


3.编写RedissonConfig,配置RedissonClient的信息
import org.redisson.Redisson;
import org.redisson.config.Config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.redisson.api.RedissonClient;
 

@Configuration
public class RedissonConfig {
 
    @Value("${spring.redis.host}")
    private String host;
 
    @Value("${spring.redis.port}")
    private String port;
 
    @Value("${spring.redis.password}")
    private String password;
 
    @Value("${spring.redis.database}")
    private int database;
    
    @Bean
    public RedissonClient redissonClient() {
        Config config = new Config();
        config.useSingleServer().setAddress("redis://" + host + ":" + port)
                .setPassword(password).setDatabase(database);
        config.useSingleServer().setConnectionMinimumIdleSize(5);
        return Redisson.create(config);
    }
}

读取编写好的application.yaml文件,

并取得redis的配置信息,添加到Config中


4.编写定时器TimerService接口
public interface TimerService {

    
    void timer();

}

5.编写定时器TimerService的实现子类,实现定时器
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.concurrent.TimeUnit;


@Slf4j
@Service
public class TimerServiceImpl implements TimerService {

    @Autowired
    RedissonClient redissonClient;

    private final String schedule_lock = "timer:auto_check_lock";

    @Scheduled(cron = "${timer.auto-check: 0 0/1 * * * ?}")
    @Override
    public void timer() {
        log.info("trigger scheduled auto check");
        RLock lock = redissonClient.getLock(schedule_lock);
        try {
            //设置最长锁占用时间,避免服务挂掉导致锁无法释放
            if (lock.tryLock(0, 10, TimeUnit.MINUTES)) {
                // 写入需要定时执行的代码
                System.out.println(new Date()+": 定时器执行任务");
            } else {
                log.info("checkAndAutoReplay ignore,maybe another instance is running!");
            }
        } catch (InterruptedException e) {
            log.error("triggerRawReplyJob exception!", e);
        } finally {
            lock.unlock();
        }
    }
}

使用配置好的RedissonClient,并获取锁,

使用@Scheduled()并读取application.yaml中自定义的cron表达式设置定时器多久执行一次


6.编写缓存LocalCacheUtils,实现缓存
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RBucket;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;


@Slf4j
@Component
public class LocalCacheUtils {

    @Autowired
    RedissonClient redissonClient;

    
    public void add(String key, String value) {
        //根据key获取bucket桶对象
        RBucket bucket = redissonClient.getBucket(key);
        //判读是否存在,并打印日志信息
        if (!bucket.isExists()) {
            log.info("add data");
        }else {
            log.info("update data");
        }
        //添加缓存,若已存在,则替换,设置缓存超时时间
        bucket.set(value, 60, TimeUnit.SECONDS);
    }


    
    public Object get(String key) {
        //根据key获取bucket桶对象
        RBucket bucket = redissonClient.getBucket(key);
        //判读是否存在,并打印日志信息
        if (!bucket.isExists()) {
            log.info("error");
        }
        log.info("cache is {}", bucket.get());
        return bucket.get();
    }

    
    public void delete(String key) {
        //根据key获取bucket桶对象
        RBucket bucket = redissonClient.getBucket(key);
        //判读是否存在,并打印日志信息
        if (!bucket.isExists()) {
            log.info("error");
        }
        bucket.delete();
    }
    
} 

使用Bucket桶概念操作redis缓存


本篇文章分享到这里就结束啦!

点个赞再走吧~

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

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

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