分布式锁-redis

@Autowired
    private RedisTemplate<String, Object> redisTemplate;

/**
     * 获取分布式锁 - 过期时间
     * @param key
     * @param expireTime 毫秒
     * @return
     */
    public Object getExpiredLock(String key, Long expireTime) {
        Long value = System.currentTimeMillis() + expireTime;
        return redisTemplate.execute((RedisCallback) connection -> {
            int count = 3;
            while (count > 0) {
                try {
                    JedisCommands commands = (JedisCommands) connection.getNativeConnection();
                    return commands.set(key, String.valueOf(value), "NX", "PX", expireTime);
                } catch (Exception e) {
                    logger.error("getExpiredLock exception key={}, count={}:", key, count, e);
                    count--;
                }
            }
            return null;
        });
    }

/**
     * 获取分布式锁 - 过期时间,value
     * @param key
     * @param expireTime
     * @return
     */
    public Object getExpiredLock(String key, Long expireTime, String value) {
        return redisTemplate.execute((RedisCallback) connection -> {
            int count = 3;
            while (count > 0) {
                try {
                    JedisCommands commands = (JedisCommands) connection.getNativeConnection();
                    return commands.set(key, value, "NX", "PX", expireTime);
                } catch (Exception e) {
                    logger.error("getExpiredLock exception key={}, count={}:", key, count, e);
                    count--;
                }
            }
            return null;
        });
    }

/**
     * 获取分布式锁value
     * @param key
     * @return
     */
    public Object getValue4ExpiredLock(String key) {
        return redisTemplate.execute((RedisCallback) connection -> {
            int count = 3;
            while (count > 0) {
                try {
                    JedisCommands commands = (JedisCommands) connection.getNativeConnection();
                    return commands.get(key);
                } catch (Exception e) {
                    logger.error("getExpiredLock exception key={}, count={}:", key, count, e);
                    count--;
                }
            }
            return null;
        });
    }

/**
     * 删除任务队列锁
     * @param lockKey
     */
    public void deleteLock(String lockKey) {
        int count = 3;
        while (count > 0) {
            try {
                if (redisTemplate.hasKey(lockKey) && Long.valueOf(""+getValue4ExpiredLock(lockKey)) > System.currentTimeMillis()) {
                    // 当前时间比该锁对应的value小,说明未过期,并占有该锁,可以直接删除
                    redisTemplate.delete(lockKey);
                    logger.info("删除list锁:{}", lockKey);
                } else {
                    logger.info("任务锁已过期, taskListLockKey={}", lockKey);
                }
                break;
            } catch (Exception e) {
                logger.error("deleteLock count={}", count, e);
                count--;
            }
        }

    }

  

        // 获取分布式锁
        if (redisService.getExpiredLock(key, 5000L) == null) {
            return;
        }    

        // 删除分布式锁
         redisService.deleteLock(key);

  

原文地址:https://www.cnblogs.com/wanhua-wu/p/11929297.html

时间: 2024-10-31 21:41:32

分布式锁-redis的相关文章

分布式&amp;分布式锁&amp;Redis分布式锁

一.什么是分布式分布式的CAP理论告诉我们:任何一个分布式系统都无法同时满足一致性(Consistency).可用性(Availability)和分区容错性(Partition tolerance),最多只能同时满足两项.C:一致性,在分布式环境下,一致性是指多个节点同一时刻要有同样的值:A:可用性,服务一直保持可用状态,当用户发出一个请求,服务能在一定时间内返回结果:P:分区容忍性,即使单个组件不可用,操作依然可以完成:目前很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是

分布式锁--redis(集群)

原文链接:https://blog.csdn.net/weixin_38003389/article/details/89434629 redis 集群做分布式锁,我们使用 Redisson. 框架 版本 Spring Boot 2.0.3.RELEASE Spring Cloud Finchley.RELEASE redis redis-4.0.11 JDK 1.8.x maven配置 <parent> <groupId>org.springframework.boot</

分布式锁-Redis方案

1 #!/usr/bin/env python 2 # coding=utf-8 3 4 import time 5 import redis 6 7 class RedisLock(object): 8 def __init__(self, key): 9 self.rdcon = redis.Redis(host='', port=6379, password="", db=1) 10 self._lock = 0 11 self.lock_key = "%s_dynam

Memcached 和 Redis 分布式锁方案

分布式缓存,能解决单台服务器内存不能无限扩张的瓶颈.在分布式缓存的应用中,会遇到多个客户端同时争用的问题.这个时候,需要用到分布式锁,得到锁的客户端才有操作权限. Memcached 和 Redis 是常用的分布式缓存构建方案,下面列举下基于Memcached 和 Redis 分布式锁的实现方法. Memcached 分布式锁 Memcached 可以使用 add 命令,该命令只有KEY不存在时,才进行添加,或者不会处理.Memcached 所有命令都是原子性的,并发下add 同一个KEY ,只

Redis 分布式锁的实现

0X00 测试环境 CentOS 6.6 + Redis 3.2.10 + PHP 7.0.7(+ phpredis 4.1.0) [[email protected] ~]# cat /etc/issue CentOS release 6.6 (Final) Kernel \r on an \m [[email protected] ~]# redis-server -v Redis server v=3.2.10 sha=00000000:0 malloc=jemalloc-3.6.0 bi

Redlock(redis分布式锁)原理分析

Redlock:全名叫做 Redis Distributed Lock;即使用redis实现的分布式锁: 使用场景:多个服务间保证同一时刻同一时间段内同一用户只能有一个请求(防止关键业务出现并发攻击): 官网文档地址如下:https://redis.io/topics/distlock 这个锁的算法实现了多redis实例的情况,相对于单redis节点来说,优点在于 防止了 单节点故障造成整个服务停止运行的情况:并且在多节点中锁的设计,及多节点同时崩溃等各种意外情况有自己独特的设计方法: 此博客或

【redis】--springboot实现redis的分布式锁

目录 1.redis的应用场景 2.redis的分布式锁 3.通过redisson框架实现redis分布式锁 1.redis的应用场景 商品秒杀 点赞等 现在有一个减少商品的场景,我们很容易能写出其代码 @Controller @ResponseBody public class Test { @Autowired private StringRedisTemplate redisTemplate; @RequestMapping("/redis") public String ded

.net 分布式锁实现

分布式锁 经常用于在解决分布式环境下的业务一致性和协调分布式环境. 实际业务场景中,比如说解决并发一瞬间的重复下单,重复确认收货,重复发现金券等. 使用分布式锁的场景一般不能太多. 开源地址:http://git.oschina.net/chejiangyi/XXF.BaseService.DistributedLock 开源相关群: .net 开源基础服务 238543768 这里整理了C#.net关于redis分布式锁和zookeeper分布式锁的实现,仅用于研究.(可能有bug) 采用Se

分布式锁的实现方式

目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题.分布式的CAP理论告诉我们“任何一个分布式系统都无法同时满足一致性(Consistency).可用性(Availability)和分区容错性(Partition tolerance),最多只能同时满足两项.”所以,很多系统在设计之初就要对这三者做出取舍.在互联网领域的绝大多数的场景中,都需要牺牲强一致性来换取系统的高可用性,系统往往只需要保证“最终一致性”,只要这个最终时间是在用户可以接受的范围内即