广告
返回顶部
首页 > 资讯 > 后端开发 > Python >java如何使用redis加锁
  • 408
分享到

java如何使用redis加锁

java使用redis加锁javaredis加锁redis加锁 2023-01-09 18:01:56 408人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录java使用Redis加锁redis锁用法java代码总结java使用redis加锁 1.编写LockUtil工具类 import org.springframework.bea

java使用redis加锁

1.编写LockUtil工具

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.RedisStrinGCommands.SetOption;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.types.Expiration;
import org.springframework.stereotype.Service;
 

@Service
public class LockUtil {
 
    @Autowired
    private RedisTemplate redisTemplate;
 
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
 
    
    public boolean lock(String lockKey, int lockSeconds) {
        return (Boolean) redisTemplate.execute((RedisCallback) connection -> {
            byte[] key = lockKey.getBytes();
            Boolean set = connection.set(key, key, Expiration.seconds(lockSeconds), SetOption.SET_IF_ABSENT);
            if (set == null) {
                return false;
            }
            return set;
        });
    }
 
    public boolean isLock(String lockKey) {
        return stringRedisTemplate.opsForValue().get(lockKey)!=null;
    }
 
 
    public boolean clearLock(String lockKey){
       return redisTemplate.delete(lockKey);
    }
}

2.使用锁

public abstract class AbstractTask {
 
    @Autowired
    private LockUtil lockUtil;
 
    
    protected abstract String getLockKey();
 
    protected boolean lock() {
        return lockUtil.lock(getLockKey(), 120);
    }
 
    protected boolean lockManual() {
        return lockUtil.lock(getLockKey(), 299);
    }
 
    protected boolean clearLock() {
        return lockUtil.clearLock(getLockKey());
    }
}
@Component
@Slf4j
@RefreshScope
public class FileCapacityCountTask extends AbstractTask{
    @Autowired
    private FileCapacityCountService fileCapacityCountService;
   
 
    @Scheduled(cron = "${batch.verification.schedule.capacity}")
    public void task(){
        if (!lock()) {
            log.info("本实例无需执行定时任务");
            return;
        }
        fileCapacityCountService.fileCapacityCountTask();
    }
 
    @Override
    protected String getLockKey() {
        String today = DateUtil.fORMatDate(new Date());
        return FileCapacityCountTask.class.getSimpleName() + CommonConstant.APPLICATION_NAME + today;
    }
}

redis锁用法java代码

由于redis是串行的,所以可以用redis实现锁机制。

下方是java代码:

@Component
@Slf4j
public class RedisSingleLock {
    private final StringRedisTemplate redis;

    public SimpleDistributedLock(StringRedisTemplate redis) {
        this.redis = redis;
    }

    //这个方法,可以传入key加锁;多线程调用时,只有1个能获取锁成功,其它线程则会进入循环,不停尝试获取锁
    public void lock(String key) {
        do {
            Boolean lockSuccess = redis.opsForValue().setIfAbsent(key, "1", 1, TimeUnit.DAYS);
            if (lockSuccess == null) {
                throw new IllegalStateException();
            }
            if (!lockSuccess) {
                try {
                    TimeUnit.MILLISECONDS.sleep(100);
                } catch (InterruptedException e) {
                    log.error(e.getMessage(), e);
                }
            } else {
                break;
            }
        } while (true);
    }

    //这个方法,传入key释放锁,当持有锁的线程执行业务代码完毕后调用,释放这个锁;上方某一个在lock方法中循环尝试获得锁的线程可以获得锁,另外的线程则继续循环等待
    public void releaseLock(String key) {
        redis.delete(key);
    }
	
	//这个方法只尝试获取一次锁,返回获取结果
    public boolean tryLock(String key) {
        Boolean lockSuccess = redis.opsForValue().setIfAbsent(key, "1", 1, TimeUnit.DAYS);
        if (lockSuccess == null) {
            throw new IllegalStateException();
        }

        return lockSuccess;
    }
}

    

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: java如何使用redis加锁

本文链接: https://www.lsjlt.com/news/177222.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java如何使用redis加锁
    目录java使用redis加锁redis锁用法java代码总结java使用redis加锁 1.编写LockUtil工具类 import org.springframework.bea...
    99+
    2023-01-09
    java使用redis加锁 java redis加锁 redis加锁
  • 如何用redis setNX命令来加锁
    目录用Redis setNX命令来加锁redis几种加锁的实现1. redis加锁分类2. 第一种锁命令INCR3. 第二种锁SETNX4. 第三种锁SET5. 其它问题6. 解决办法7. 另外一个锁总结用redis s...
    99+
    2023-01-09
    redis加锁 setNX命令来加锁 redissetNX命令
  • 如何使用Redis和Java开发分布式锁功能
    如何使用Redis和Java开发分布式锁功能引言分布式锁是在分布式系统中实现互斥访问共享资源的一种机制。在多个节点同时访问共享资源时,需要确保只有一个节点在访问,其他节点需要等待。Redis是一个常用的内存数据库,具备高性能和高可靠性的特点...
    99+
    2023-10-22
    Java redis 分布式锁
  • java怎么使用redis实现分布式锁
    在Java中使用Redis实现分布式锁可以通过以下步骤:1. 引入Redis相关的依赖,例如Jedis或Lettuce。2. 创建一...
    99+
    2023-10-09
    java redis
  • 使用Redis如何实现分布式锁
    这篇文章主要介绍了使用Redis如何实现分布式锁的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇使用Redis如何实现分布式锁文章都会有所收获,下面我们一起来看看吧。 ...
    99+
    2022-10-19
  • 如何使用Redis实现分布式锁
    这篇文章将为大家详细讲解有关如何使用Redis实现分布式锁,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。加锁部分解锁部分主要原理是使用了 redis 的 s...
    99+
    2022-10-18
  • redis加锁的常用方式是什么
    这篇文章主要介绍了redis加锁的常用方式是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。常用的加锁方式有:一、incr加锁<ph...
    99+
    2022-10-18
  • redis中使用java脚本实现分布式锁
    redis被大量用在分布式的环境中,自然而然分布式环境下的锁如何解决,立马成为一个问题。例如我们当前的手游项目,服务器端是按业务模块划分服务器的,有应用服,战斗服等,但是这两个vm都有可能同时改变玩家的属性...
    99+
    2022-06-04
    分布式 脚本 redis
  • Java中怎么使用Redis实现分布式锁
    这篇“Java中怎么使用Redis实现分布式锁”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇...
    99+
    2023-05-25
    java redis
  • SpringBoot中如何使用Redis作为全局锁
    这篇文章主要讲解了“SpringBoot中如何使用Redis作为全局锁”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot中如何使用Redis作为全局锁”吧!一、模拟没有锁情况...
    99+
    2023-06-29
  • 如何使用Redis的SETNX实现锁机制
    这篇文章给大家分享的是有关如何使用Redis的SETNX实现锁机制的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。setNX,是set if not exists 的缩写,也就是只...
    99+
    2022-10-18
  • python如何使用with处理加锁
    这篇文章将为大家详细讲解有关python如何使用with处理加锁,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 使用 with 处理加锁##不推荐 import...
    99+
    2022-10-19
  • 怎么在Java中使用redis实现分布式锁
    本篇文章给大家分享的是有关怎么在Java中使用redis实现分布式锁,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。原理剖析上述三种分布式锁都是通过各自为依据对各个请求进行上锁,...
    99+
    2023-06-15
  • 如何使用Java操作Redis
    这篇文章给大家分享的是有关如何使用Java操作Redis的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。首先让我们创建一个普通的Maven工程,添加相应的依赖<dependencies><depe...
    99+
    2023-06-15
  • redis乐观锁与悲观锁怎么使用
    本篇内容主要讲解“redis乐观锁与悲观锁怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“redis乐观锁与悲观锁怎么使用”吧!概念Redis是一个内存中的键值存储系统,支持多种数据结构,...
    99+
    2023-07-06
  • SpringBoot之如何使用Redis实现分布式锁
    小编给大家分享一下SpringBoot之如何使用Redis实现分布式锁,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!springboot是什么springboot一种全新的编程规范,其设计目的是用来简化新Spring应用的...
    99+
    2023-06-14
  • redis如何防止死锁
    redis防止死锁的方法:锁信息设置一定是会过期超时的,不允许一个线程长期占有一个锁。同一时刻只能有一个线程获取到锁。代码示例:long expires = System.currentTimeMillis() + expireTime;S...
    99+
    2022-10-24
  • redis如何解决死锁
    redis解决死锁的方法:从其它进程剥夺足够数量的资源给死锁进程,解除死锁状态。撤消死锁进程或撤消代价最小的进程,直至有足够的资源可用。...
    99+
    2022-10-18
  • Java-Redis-Redisson分布式锁的功能使用及实现
    目录前置基础设施功能使用和介绍其他悲观锁的实现方式前置 Java-Redis-Redisson配置基础上我们进行了改造,让锁的使用更加方便 基础设施 RedissonLock imp...
    99+
    2022-11-13
    Java Redis Redisson分布式锁 Java  Redisson分布式锁
  • Redis中如何实现支持几乎所有加锁场景的分布式锁
    小编给大家分享一下Redis中如何实现支持几乎所有加锁场景的分布式锁,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!实战部分1、引...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作