千家信息网

redis分布式锁的实现示例

发表于:2025-02-05 作者:千家信息网编辑
千家信息网最后更新 2025年02月05日,小编给大家分享一下redis分布式锁的实现示例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Redissonredisso
千家信息网最后更新 2025年02月05日redis分布式锁的实现示例

小编给大家分享一下redis分布式锁的实现示例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

Redisson

redisson和下列一下自行封装两种方式的区别(场景):

  1. redisson未获取到锁的会进入等待,直到获取到锁。

  2. 另外两种方式如果未获取到锁,会放弃,不会执行业务代码。

    org.redisson    redisson-spring-boot-starter    3.13.6
@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)

   org.springframework.boot   spring-boot-starter-data-redis
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 booleanRedisCallback = new RedisCallback() {            @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 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 booleanRedisCallback = new RedisCallback() {            @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 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分布式锁的实现示例"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

方法 篇文章 封装 分布式 示例 业务 代码 内容 方式 程序 线程 不怎么 场景 大哥 大部分 更多 知识 行业 资讯 资讯频道 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 天津潮流软件开发厂家现货 我的世界服务器转让 平谷区综合网络技术服务一体化 学网络安全维护工程师难 先进网络技术哪家好 获取当前时间 数据库 我的世界服务器及插件指令 网络安全专业学习计划 叛乱2打了mod还能进服务器吗 平面设计和网络技术哪个难 tmbl数据库 数据库更新时应用程序错误 富士康云端网络技术学院 山东c语言软件开发需要多少钱 软件开发人工费明细表 安徽兰泽互联网科技有限公司 小龙女趣解软件开发流程 杭州点告网络技术 军事网络安全加固行动方案 会考网络技术知识点 电脑重装系统后无法连接数据库 黄石服务器回收公司地址 海南服务器包装选哪家 测绘数据库平台 乌克兰网络安全公司 基层医疗卫生系统 网络安全 php数据库frm怎么弄 安徽少儿编程软件开发 浙江省高校计算机三级数据库真题 计算机网络技术实践评价
0