在大数据集群环境当中,因为资源的共享,往往容易导致程序运行当中不同任务的互相影响,甚至是导致程序运行受阻,这是我们在程序实际运行当中,不希望出现的。今天的大数据入门分享,我们就来讲讲Redis分布式锁的实现。Java是大数据编程主要使用的编程语言,其中JDK提供的锁在单体项目中不会有什么问题,但是在集群项目中就会有问题了。在分布式模型下,数据只有一份(或有限制),此时需要利用锁的技术控制某一时刻修改数据的进程数。JDK锁显然无法满足我们的需求,于是就有了分布式锁。
什么是分布式锁?分布式锁是控制分布式系统或不同系统之间共同访问共享资源的一种锁实现,如果不同的系统或同一个系统的不同主机之间共享了某个资源时,往往需要互斥来防止彼此干扰来保证一致性。分布式锁需要具备哪些条件?互斥性:在任意一个时刻,只有一个客户端持有锁。无死锁:即便持有锁的客户端崩溃或者其他意外事件,锁仍然可以被获取。容错:只要大部分Redis节点都活着,客户端就可以获取和释放锁。分布式锁的实现有三种方式:基于数据库实现分布式锁;基于缓存(Redis,memcached,tair)实现分布式锁;基于Zookeeper实现分布式锁。Redis分布式锁的实现因为基于Redis的分布式锁,在实际当中使用更加普遍,这里我们主要介绍其原理和使用:Redis实现锁的机制是setnx指令,setnx是原子操作命令,锁存在不能设置值,返回0;锁不存在,则设置锁,返回1,根据返回值来判断上锁是否成功。看到这里你可能想为啥不先get有没有值,再set上锁;首先我们要知道,Redis是单线程的,同一时刻只可能有一个线程操作内存,然后setnx是一个操作步骤(具有原子性),而get再set是两个步骤(不具有原子性)。如果使用第二种可能会发生这种情况:客户端aget发现没有锁,这个时候被切换到客户端b,bget也发现没锁,然后bset,这个时候又切换到a客户端aset;这种情况下,锁完全没起作用。所以,Redis分布式锁,原子性是关键。对于web应用中Redis客户端用的比较多的是lettuce,jedis,Redisson。springboot的Redis的start包底层是lettuce,但对Redis分布式锁支持的最好的是Redisson(如果用Redisson你就享受不到Redis自动化配置的好处了);不过springboot的RedisTemplete支持手写lua脚本,我们可以通过手写lua脚本来实现Redis锁。关于大数据入门,Redis分布式锁的实现,以上就为大家做了简单的介绍了。Redis的分布式锁,在实际的开发当中,是一种比较主流的实现形式,也建议大家扎实掌握。