• Redis8 实现分布式锁


    CAP:

    • p:分区容错性,只要是分布式架构,那么必然会满足P
    • C:一致性
    • A:可用性

    锁的处理

    • 单应用中使用锁:(单进程多线程)
      synchronize、ReentrantLock
    • 分布式应用中使用锁:(多进程多线程)
      分布式锁是控制分布式系统之间同步访问共享资源的一种方式。

    分布式锁的实现方式

    • 基于数据库的乐观锁实现分布式锁
    • 基于 zookeeper 临时节点的分布式锁
      请添加图片描述
    • 基于 Redis 的分布式锁
    • 基于ETCD

    分布式锁的注意事项

    • 互斥性:在任意时刻,只有一个客户端能持有锁
    • 同一性:加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给解了。
    • 可重入性:即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。

    实现分布式锁

    获取锁

    方式1(使用set命令实现)–推荐
    在这里插入图片描述

    /** 
    	* 使用redis的set命令实现获取分布式锁 
    	* @param lockKey 可以就是锁 
    	* @param requestId 请求ID,保证同一性 uuid+threadId+随机 
    	* @param expireTime 过期时间,避免死锁 
    	* @return 
    */ 
    	public boolean getLock(String lockKey,String requestId,int expireTime) {
    		//NX:保证互斥性 
    		String result = jedis.set(lockKey, requestId, "NX", "EX", expireTime); 
    		if("OK".equals(result)) { 
    			return true; 
    		}
    		return false; 
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    方式2(使用setnx命令实现)

    public boolean getLock(String lockKey,String requestId,int expireTime) { 
    	Long result = jedis.setnx(lockKey, requestId); 
    	if(result == 1) { 
    		jedis.expire(lockKey, expireTime); 
    		return true; 
    	}
    	return false; 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    释放锁

    方式1(del命令实现)

    	/**
    		* 释放分布式锁 
    		* @param lockKey 
    		* @param requestId 
    	*/ 
    	public static void releaseLock(String lockKey,String requestId) { 
    	if (requestId.equals(jedis.get(lockKey))) { 
    		jedis.del(lockKey); 
    	} 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    方式2(redis+lua脚本实现)–推荐

    	public static boolean releaseLock(String lockKey, String requestId) { 
    	
    		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(lockKey), Collections.singletonList(requestId));
    		 
    		if (result.equals(1L)) { 
    			return true; 
    		}
    		return false; 
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 相关阅读:
    Delegate介绍
    (视频教程)Complexheatmap做热图之设置不一样的注释效果
    Llama3-8B+ LLaMA-Factory 中文微调
    [运维|数据库] 在 PostgreSQL 中使用正则表达式进行模式匹配
    Containerd 安装使用与高级命令行工具 crictl、nerdctl
    zookeeper源码(10)node增删改查及监听
    网页前端设计-作业四(HTML5)
    kubeadm init命令时报错(关键词-无法加载)
    5道关于Python基础方面的练习题
    计算机毕业设计ssm大学生课外学习系统m65wl系统+程序+源码+lw+远程部署
  • 原文地址:https://blog.csdn.net/Miaoshuowen/article/details/126024055