您的位置:首页 > 教育 > 培训 > 分布式调度 redis scheduler锁的实现参考

分布式调度 redis scheduler锁的实现参考

2024/10/5 21:14:46 来源:https://blog.csdn.net/eif88/article/details/141332096  浏览:    关键词:分布式调度 redis scheduler锁的实现参考

scheduler竞争锁

注意参数类型和返回值

    @Autowiredprivate StringRedisTemplate redisTemplate;@Autowiredprivate XfuzzConfig xfuzzConfig;private volatile boolean scheduler = false;@Scheduled(fixedDelay = 5 * 1000, initialDelay = 10 * 1000)public void acquireLock() {String id = IpUtils.matchIp(xfuzzConfig.getEthName());String key = "lock:scheduler";int seconds = 60;if (!scheduler) {scheduler = redisTemplate.opsForValue().setIfAbsent(key, id, seconds, TimeUnit.SECONDS);return;}String lua = "if redis.call('get',KEYS[1]) == ARGV[1] then\n" +"    redis.call('expire', KEYS[1], ARGV[2])\n" +"    return true\n" +"else\n" +"end";DefaultRedisScript<Boolean> redisScript = new DefaultRedisScript<>();redisScript.setResultType(Boolean.class);redisScript.setScriptText(lua);List<String> keyList = new ArrayList<>();keyList.add(key);scheduler = redisTemplate.execute(redisScript, keyList, id, seconds + "");}

获取 ip(常见网卡匹配)

    public static String matchIp(String ifName) {if (ifName.contains(",")) {for (String reg : ifName.split(",")) {String ip = getIp(reg);if (StringUtils.isNotBlank(ip)) {return ip;}}throw new RuntimeException("未获取到网卡" + ifName + " ip");} else {String ip = getIp(ifName);if (StringUtils.isNotBlank(ip)) {return ip;}throw new RuntimeException("未获取到网卡" + ifName + " ip");}}public static String getIp(String ifName) {ifName = ifName.trim();try {Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();while (networkInterfaces.hasMoreElements()) {NetworkInterface networkInterface = (NetworkInterface) networkInterfaces.nextElement();if (networkInterface.isLoopback() || !networkInterface.isUp()) {continue;}String name = networkInterface.getName();boolean match = StringUtils.isNotBlank(name) && name.matches(ifName);name = networkInterface.getDisplayName();match = match || (StringUtils.isNotBlank(name) && name.matches(ifName));if (!match) {continue;}Enumeration<InetAddress> addresses = networkInterface.getInetAddresses();while (addresses.hasMoreElements()) {InetAddress inetAddress = addresses.nextElement();if (inetAddress.isSiteLocalAddress()) {return inetAddress.getHostAddress();}}}} catch (Exception e) {log.error("获取网卡 {} ip失败", ifName, e);}return null;}

redis 任务管理

利用 zset

    public boolean isRunning(String id) {Double expire = redisTemplate.opsForZSet().score(VM_VM_IDS, id);return expire != null && expire.longValue() >= System.currentTimeMillis();}public void addTask(String id) {long expireAt = System.currentTimeMillis() + 60 * 1000;redisTemplate.opsForZSet().add(VM_VM_IDS, id, expireAt);}public void removeTask(String id) {redisTemplate.opsForZSet().remove(VM_VM_IDS, id);}public void removeExpiredTask() {long now = System.currentTimeMillis();redisTemplate.opsForZSet().removeRangeByScore(VM_VM_IDS, 0, now);}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com