IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Redis锁简单实现 -> 正文阅读

[大数据]Redis锁简单实现

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

`前提,项目部署在多个节点,业务需求单位时间内存在一个调度,且严格按照顺序执行,【锁时间需严格把控】

一、实现

@RestController
public class RedisController {
    public static final Logger log = LoggerFactory.getLogger(RedisController.class);
    
    @Resource
    private RedisTemplate<String, String> redisStringTemplate;
private static final String KEY = "KEY_";

    private static final String VALUE = "VALUE_";

    private static final long LOCK_TIME_MILLISECONDS = 5 * 60 * 1000;

    private static final Long SUCCESS = 1L;

    private Boolean tryLock(){
        Long start = System.currentTimeMillis();
        for (;;){
            Boolean absent = redisStringTemplate.opsForValue().setIfAbsent( KEY, VALUE,LOCK_TIME_MILLISECONDS,
                    TimeUnit.MILLISECONDS );
            if(absent){
                return Boolean.TRUE;
            }
            long end = System.currentTimeMillis() - start;
            if(end >= LOCK_TIME_MILLISECONDS){
                return Boolean.FALSE;
            }
        }
    }

    /**
     * 释放锁
     */
    private void unlock() {
        try {
            Object result = redisTemplate.delete(Collections.singletonList(KEY));
            if (SUCCESS.equals(result)) {
                logger.info("释放锁成功");
            }
        } catch (Exception e) {
            logger.error("释放锁失败");
        }
    }
	
	@Scheduled(cron = "0 */3 * * * *")
    public void task() {
		if(!tryLock()){
			logger.error("获取锁失败");
			return;
		}
		try{
			// TODO dosomething
		}catch (Exception e) {
			logger.error("异常:{}",e.getMessage(), e);
		}
		unlock();
	}	
}

总结

提示:业务处理时间需要把控,一旦超过key的存活时间限制,锁就会被释放,看业务而定。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 23:28:20  更:2022-04-01 23:32:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/19 14:37:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码