首页 技术文章 数据库 介绍redis分布式锁
正文 评论

介绍redis分布式锁

介绍redis分布式锁

推荐(免费):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分布式锁的详细内容,更多请关注主题君其它相关文章!

-=||=-收藏赞 (0)
更多主题
单栏极简文艺WordPress博客主题:Diaspora主题
¥ 0 关注:20,013
详情
简约黑白WordPress个人博客主题:Personal主题
¥ 0 关注:19,974
详情
v1.0.0
小程序收录免费WordPress主题:XCX主题
¥ 0 关注:19,582
详情
v1.0.0
一款简约单栏的免费WordPress博客主题:itheme主题
¥ 0 关注:18,105
详情
功能丰富切轻量的WordPress虚拟资源主题:Rizhuti主题
¥ 599 关注:17,994
详情
大气优雅免费WordPress博客主题:HONEY主题
¥ 0 关注:14,845
详情
回复
暂无评论

不要再留垃圾评论了,主题君整理资源不容易,留几句鼓励的话吧。