91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

redis分布式鎖的實現示例

發布時間:2021-02-20 10:09:53 來源:億速云 閱讀:186 作者:小新 欄目:關系型數據庫

小編給大家分享一下redis分布式鎖的實現示例,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

Redisson

redisson和下列一下自行封裝兩種方式的區別(場景):

  1. redisson未獲取到鎖的會進入等待,直到獲取到鎖。

  2. 另外兩種方式如果未獲取到鎖,會放棄,不會執行業務代碼。

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
    <version>3.13.6</version></dependency>
@Autowiredprivate Redisson redisson;@GetMapping("/redissonLock")public String redissonLock() {
    log.info("進入了方法");
    RLock lock = redisson.getLock("redissonLock");
    try {
        lock.lock(30, TimeUnit.SECONDS);
        Thread.sleep(10000);
        System.out.println("我是你大哥");
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
    // 如果不釋放,不會喚起其他線程,則其他線程會超時過期自動喚醒,不會執行業務代碼
        lock.unlock();
    }
    return "運行結束";}

RedisTemplate封裝redis鎖(1)

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-redis</artifactId></dependency>
package com.util;import org.springframework.dao.DataAccessException;import org.springframework.data.redis.connection.RedisConnection;import org.springframework.data.redis.connection.RedisStringCommands;import org.springframework.data.redis.core.RedisCallback;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.script.RedisScript;import org.springframework.data.redis.core.types.Expiration;import org.springframework.stereotype.Component;import java.util.Arrays;@Componentpublic class RedisLock {

    private static RedisTemplate redisTemplate;

    private static String script = "if redis.call(\"get\",KEYS[1]) == ARGV[1] then\n" +
            "\treturn redis.call(\"del\",KEYS[1])\n" +
            "else\n" +
            "   \treturn 0\t\n" +
            "end  ";

    public RedisLock(RedisTemplate redisTemplate) {
        RedisLock.redisTemplate = redisTemplate;
    }

    public static Boolean getLock(String key, String value, Long expireTime) {
        RedisStringCommands.SetOption setOption = RedisStringCommands.SetOption.ifAbsent();
        Expiration expiration = Expiration.seconds(expireTime);
        RedisCallback<Boolean> booleanRedisCallback = new RedisCallback<Boolean>() {
            @Override
            public Boolean doInRedis(RedisConnection connection) throws DataAccessException {
                return connection.set(redisTemplate.getKeySerializer().serialize(key), redisTemplate.getValueSerializer().serialize(value), expiration, setOption);
            }
        };
        return (Boolean) redisTemplate.execute(booleanRedisCallback);
    }

    public static Boolean unLock(String key, String value) {
        RedisScript<Boolean> redisScript = RedisScript.of(script, Boolean.class);
        return (Boolean) redisTemplate.execute(redisScript, Arrays.asList(key), value);
    }}
@GetMapping("/redisLock")public String redisLock() {
    log.info("進入了方法");
    String key = "redisLock";
    String uuid = UUID.randomUUID().toString();
    try {
        if (RedisLock.getLock(key, uuid, 30L)) {
            log.info("進入了鎖");
            Thread.sleep(10000);
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        RedisLock.unLock(key, uuid);
    }
    log.info("方法執行完成");
    return "程序結束";}

RedisTemplate封裝redis鎖(2)

package com.util;import lombok.extern.slf4j.Slf4j;import org.springframework.dao.DataAccessException;import org.springframework.data.redis.connection.RedisConnection;import org.springframework.data.redis.connection.RedisStringCommands;import org.springframework.data.redis.core.RedisCallback;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.script.RedisScript;import org.springframework.data.redis.core.types.Expiration;import java.util.Arrays;import java.util.UUID;@Slf4jpublic class HighRedisLock implements AutoCloseable{

    private RedisTemplate redisTemplate;

    private String key;

    private String value;

    private Long expireTime;

    private static String script = "if redis.call(\"get\",KEYS[1]) == ARGV[1] then\n" +
            "\treturn redis.call(\"del\",KEYS[1])\n" +
            "else\n" +
            "   \treturn 0\t\n" +
            "end  ";

    public HighRedisLock(RedisTemplate redisTemplate, String key, Long expireTime) {
        this.redisTemplate = redisTemplate;
        this.key = key;
        this.value = UUID.randomUUID().toString();
        this.expireTime = expireTime;
    }

    public Boolean getLock() {
        RedisStringCommands.SetOption setOption = RedisStringCommands.SetOption.ifAbsent();
        Expiration expiration = Expiration.seconds(expireTime);
        RedisCallback<Boolean> booleanRedisCallback = new RedisCallback<Boolean>() {
            @Override
            public Boolean doInRedis(RedisConnection connection) throws DataAccessException {
                return connection.set(redisTemplate.getKeySerializer().serialize(key), redisTemplate.getValueSerializer().serialize(value), expiration, setOption);
            }
        };
        return (Boolean) redisTemplate.execute(booleanRedisCallback);
    }

    public Boolean unLock() {
        RedisScript<Boolean> redisScript = RedisScript.of(script, Boolean.class);
        return (Boolean) redisTemplate.execute(redisScript, Arrays.asList(key), value);
    }

    @Override
    public void close() throws Exception {
        unLock();
    }}
@Autowiredprivate RedisTemplate redisTemplate;@GetMapping("/highRedisLock")public String highRedisLock() {
    log.info("進入了方法");
    try (HighRedisLock redisLock = new HighRedisLock(redisTemplate, "highRedisLock", 30L)) {
        if (redisLock.getLock()) {
            log.info("進入了鎖");
            Thread.sleep(10000);
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
    log.info("方法執行完成");
    return "程序結束";}

以上是“redis分布式鎖的實現示例”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

灵山县| 犍为县| 武平县| 尖扎县| 宣汉县| 襄城县| 达拉特旗| 从化市| 新干县| 五寨县| 叙永县| 阜城县| 武胜县| 凉山| 同江市| 鹤山市| 威信县| 元朗区| 曲周县| 洪泽县| 红安县| 郁南县| 洞口县| 汉寿县| 洞头县| 绍兴县| 宜城市| 崇仁县| 孝义市| 长阳| 得荣县| 团风县| 凉城县| 黄龙县| 隆安县| 本溪市| 甘洛县| 镶黄旗| 上蔡县| 邯郸县| 德清县|