最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java如何使用redis加鎖

 更新時(shí)間:2023年01月09日 16:54:26   作者:KLOCIC  
這篇文章主要介紹了java如何使用redis加鎖問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

java使用redis加鎖

編寫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;
?
/**
?* LockUtil <br>
?*
?*/
@Service
public class LockUtil {
?
? ? @Autowired
? ? private RedisTemplate redisTemplate;
?
? ? @Autowired
? ? private StringRedisTemplate stringRedisTemplate;
?
? ? /**
? ? ?* @param lockKey 上鎖的key
? ? ?* @param lockSeconds 上鎖的秒數(shù)
? ? ?* @return
? ? ?*/
? ? 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);
? ? }
}

使用鎖

public abstract class AbstractTask {
?
? ? @Autowired
? ? private LockUtil lockUtil;
?
? ? /**
? ? ?* 獲取redis鎖的key
? ? ?*
? ? ?* @return
? ? ?*/
? ? 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("本實(shí)例無需執(zhí)行定時(shí)任務(wù)");
? ? ? ? ? ? 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實(shí)現(xiàn)鎖機(jī)制。

下方是java代碼

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

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

    //這個(gè)方法,可以傳入key加鎖;多線程調(diào)用時(shí),只有1個(gè)能獲取鎖成功,其它線程則會(huì)進(jìn)入循環(huán),不停嘗試獲取鎖
    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);
    }

    //這個(gè)方法,傳入key釋放鎖,當(dāng)持有鎖的線程執(zhí)行業(yè)務(wù)代碼完畢后調(diào)用,釋放這個(gè)鎖;上方某一個(gè)在lock方法中循環(huán)嘗試獲得鎖的線程可以獲得鎖,另外的線程則繼續(xù)循環(huán)等待
    public void releaseLock(String key) {
        redis.delete(key);
    }
	
	//這個(gè)方法只嘗試獲取一次鎖,返回獲取結(jié)果
    public boolean tryLock(String key) {
        Boolean lockSuccess = redis.opsForValue().setIfAbsent(key, "1", 1, TimeUnit.DAYS);
        if (lockSuccess == null) {
            throw new IllegalStateException();
        }

        return lockSuccess;
    }
}

    

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java中的各種修飾符作用及范圍

    java中的各種修飾符作用及范圍

    這篇文章主要介紹了java中的各種修飾符作用及范圍,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 詳解Java無需解壓直接讀取Zip文件和文件內(nèi)容

    詳解Java無需解壓直接讀取Zip文件和文件內(nèi)容

    本篇文章主要介紹了詳解Java無需解壓直接讀取Zip文件和文件內(nèi)容,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 淺談Java代碼的 微信長(zhǎng)鏈轉(zhuǎn)短鏈接口使用 post 請(qǐng)求封裝Json(實(shí)例)

    淺談Java代碼的 微信長(zhǎng)鏈轉(zhuǎn)短鏈接口使用 post 請(qǐng)求封裝Json(實(shí)例)

    下面小編就為大家?guī)硪黄獪\談Java代碼的 微信長(zhǎng)鏈轉(zhuǎn)短鏈接口使用 post 請(qǐng)求封裝Json(實(shí)例)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07
  • java使用poi導(dǎo)出Excel的方法

    java使用poi導(dǎo)出Excel的方法

    這篇文章主要為大家詳細(xì)介紹了java使用poi導(dǎo)出Excel的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • 實(shí)例講解Java并發(fā)編程之閉鎖

    實(shí)例講解Java并發(fā)編程之閉鎖

    這篇文章主要介紹了實(shí)例講解Java并發(fā)編程之閉鎖,閉鎖相當(dāng)于一扇門,在閉鎖到達(dá)結(jié)束狀態(tài)之前,這扇門一直是關(guān)閉著的,沒有任何線程可以通過,當(dāng)?shù)竭_(dá)結(jié)束狀態(tài)時(shí),這扇門才會(huì)打開并容許所有線程通過,需要的朋友可以參考下
    2015-04-04
  • SpringBoot數(shù)據(jù)脫敏的實(shí)現(xiàn)示例

    SpringBoot數(shù)據(jù)脫敏的實(shí)現(xiàn)示例

    數(shù)據(jù)脫敏主要應(yīng)用在客戶安全數(shù)據(jù)或商業(yè)性敏感數(shù)據(jù)的情況,本文主要介紹了SpringBoot數(shù)據(jù)脫敏的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • Java文件處理之使用itextpdf實(shí)現(xiàn)excel轉(zhuǎn)pdf

    Java文件處理之使用itextpdf實(shí)現(xiàn)excel轉(zhuǎn)pdf

    在文件處理中,經(jīng)常有文件類型轉(zhuǎn)換的使用場(chǎng)景,本文主要介紹了如何使用poi以及itextpdf完成excel轉(zhuǎn)pdf的操作,需要的小伙伴可以參考一下
    2024-02-02
  • IDEA 2023創(chuàng)建JSP項(xiàng)目的完整步驟教程

    IDEA 2023創(chuàng)建JSP項(xiàng)目的完整步驟教程

    這篇文章主要介紹了IDEA 2023創(chuàng)建JSP項(xiàng)目的完整步驟教程,創(chuàng)建項(xiàng)目需要經(jīng)過新建項(xiàng)目、設(shè)置項(xiàng)目名稱和路徑、選擇JDK版本、添加模塊和工件、配置Tomcat服務(wù)器等步驟,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2024-10-10
  • 解析spring-boot-starter-parent簡(jiǎn)介

    解析spring-boot-starter-parent簡(jiǎn)介

    本文通過代碼的形式給大家介紹了spring-boot-starter-parent的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2018-09-09
  • Java調(diào)用groovy腳本的方式分享

    Java調(diào)用groovy腳本的方式分享

    Groovy?是一種基于?JVM?的動(dòng)態(tài)語言,與?Java?語言緊密集成,可以很方便地在?Java?項(xiàng)目中使用。本文為大家整理了Java調(diào)用groovy腳本的幾種方式,希望對(duì)大家有所幫助
    2023-04-04

最新評(píng)論

竹北市| 东乌珠穆沁旗| 新宾| 杭锦后旗| 武冈市| 井陉县| 探索| 武川县| 西城区| 珲春市| 安多县| 建水县| 勐海县| 六安市| 格尔木市| 临漳县| 古田县| 偃师市| 青海省| 济南市| 田林县| 万年县| 长宁区| 孝感市| 荔浦县| 石台县| 南昌市| 宜丰县| 万年县| 琼海市| 广宗县| 乌拉特后旗| 子长县| 商南县| 牟定县| 留坝县| 开江县| 商水县| 绥德县| 淮阳县| 洪洞县|