Redis分布式锁实例

maven依赖

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.0.1</version>
</dependency>

代码实现

package com.zhi.demo;

import java.util.Collections;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.params.SetParams;

/**
 * Redis分布式锁
 *
 * @date 2019年03月05日17:20:05
 *
 */
public class RedisLock {
    private static JedisPool jedisPool;
    /**
     * 加锁成功标示
     */
    private static final String LOCK_SUCCESS = "OK";
    /**
     * 解锁成功标示
     */
    private static final Long RELEASE_SUCCESS = 1L;

    static {
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxIdle(5);
        config.setTestOnBorrow(false);

        jedisPool = new JedisPool(config, "192.168.153.137", 6379);
    }

    /**
     * 申请锁
     *
     * @param key       锁名
     * @param requestId 请求ID,一般用UUID(用于记录谁申请的锁)
     * @return 是否成功
     *
     */
    public static boolean lock(String key, String requestId) {
        try (Jedis jedis = jedisPool.getResource();) {
            SetParams params = new SetParams();
            params.ex(100); // 设置超时时间
            params.nx(); // 若锁不存在才进行写操作
            String back = jedis.set(key, requestId, params);
            return LOCK_SUCCESS.equals(back);
        }
    }

    /**
     * 解锁,判断requestId的一致性和删除锁必须放在一个请求中,防止时间差引起错误
     *
     * @param jedis
     * @param key       锁名
     * @param requestId 请求ID
     * @return 是否解锁成功
     *
     */
    public static boolean unlock(String key, String requestId) {
        try (Jedis jedis = jedisPool.getResource();) {
            String script = "if redis.call(‘get‘, KEYS[1]) == ARGV[1] then return redis.call(‘del‘, KEYS[1]) else return 0 end";
            Object result = jedis.eval(script, Collections.singletonList(key), Collections.singletonList(requestId));
            return RELEASE_SUCCESS.equals(result);
        }
    }

    public static void main(String[] args) {
        if (RedisLock.lock("redis", "1")) {
            System.out.println("申请锁成功");
            if (RedisLock.lock("redis", "2")) {
                System.out.println("再次申请锁成功");
            } else {
                System.out.println("再次申请锁失败");
            }
            if (RedisLock.unlock("redis", "1")) {
                System.out.println("解锁成功");
            } else {
                System.out.println("解锁失败");
            }
        } else {
            System.out.println("申请锁失败");
        }
        jedisPool.close();
    }
}

有兴趣的同学可以参考:https://www.cnblogs.com/linjiqin/p/8003838.html,这个讲解比较清楚。

原文地址:https://www.cnblogs.com/zhi-leaf/p/10502646.html

时间: 2024-10-31 10:22:00

Redis分布式锁实例的相关文章

单实例redis分布式锁的简单实现

redis分布式锁的基本功能包括, 同一刻只能有一个人占有锁, 当锁被其他人占用时, 获取者可以等待他人释放锁, 此外锁本身必须能超时自动释放. 直接上java代码, 如下: package com.test; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import jav

Redis分布式锁实现

直接上代码: 1 package cn.wywk.yac.comm.redis; 2 3 import org.slf4j.Logger; 4 import org.slf4j.LoggerFactory; 5 6 import redis.clients.jedis.Jedis; 7 8 /** 9 * ClassName: redis分布式锁实现 <br/> 10 * date: 2017年2月17日 上午10:23:24 <br/> 11 * 12 * @author 134

Redis分布式锁的实现原理

一.写在前面 现在面试,一般都会聊聊分布式系统这块的东西.通常面试官都会从服务框架(Spring Cloud.Dubbo)聊起,一路聊到分布式事务.分布式锁.ZooKeeper等知识. 所以咱们这篇文章就来聊聊分布式锁这块知识,具体的来看看Redis分布式锁的实现原理. 说实话,如果在公司里落地生产环境用分布式锁的时候,一定是会用开源类库的,比如Redis分布式锁,一般就是用Redisson框架就好了,非常的简便易用. 大家如果有兴趣,可以去看看Redisson的官网,看看如何在项目中引入Red

对比各类分布式锁缺陷,抓住Redis分布式锁实现命门

近两年来微服务变得越来越热门,越来越多的应用部署在分布式环境中,在分布式环境中,数据一致性是一直以来需要关注并且去解决的问题,分布式锁也就成为了一种广泛使用的技术. 常用的分布式实现方式为Redis,Zookeeper,其中基于Redis的分布式锁的使用更加广泛. 但是在工作和网络上看到过各个版本的Redis分布式锁实现,每种实现都有一些不严谨的地方,甚至有可能是错误的实现,包括在代码中,如果不能正确的使用分布式锁,可能造成严重的生产环境故障. 本文主要对目前遇到的各种分布式锁以及其缺陷做了一个

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

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

漫谈Redis分布式锁实现

在Redis上,可以通过对key值的独占来实现分布式锁,表面上看,Redis可以简单快捷通过set key这一独占的方式来实现分布式锁,也有许多重复性轮子,但实际情况并非如此.总得来说,Redis实现分布式锁,如何确保锁资源的安全&及时释放,是Redis实现分布式锁的最关键因素.如下逐层分析Redis实现分布式锁的一些过程,以及存在的问题和解决办法. solution 1 :setnx setnx命令设置key的方式实现独占锁 1,#并发线程抢占锁资源setnx an_special_lock

Redlock:Redis分布式锁最牛逼的实现

普通实现 说道Redis分布式锁大部分人都会想到:setnx+lua,或者知道set key value px milliseconds nx.后一种方式的核心实现命令如下: - 获取锁(unique_value可以是UUID等) SET resource_name unique_value NX PX 30000 - 释放锁(lua脚本中,一定要比较value,防止误解锁) if redis.call("get",KEYS[1]) == ARGV[1] then return red

死磕 java同步系列之redis分布式锁进化史

问题 (1)redis如何实现分布式锁? (2)redis分布式锁有哪些优点? (3)redis分布式锁有哪些缺点? (4)redis实现分布式锁有没有现成的轮子可以使用? 简介 Redis(全称:Remote Dictionary Server 远程字典服务)是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. 本章我们将介绍如何基于redis实现分布式锁,并把其实现的进化史从头到尾讲明白,以便大家在面试的时候能讲清楚

redis分布式锁深度剖析

转自https://www.jianshu.com/p/d0caf5d99e56 redis分布式锁的实现主要是基于redis的setnx 命令(setnx命令解释见:http://doc.redisfans.com/string/setnx.html),我们来看一下setnx命令的作用: redis-setnx.png 1.redis分布式锁的基本实现 redis加锁命令: SETNX resource_name my_random_value PX 30000 这个命令的作用是在只有这个ke