悲观锁有什么区别死锁用redis乐观锁和悲观锁有何不同(死锁用redis乐观锁和)
悲观锁和乐观锁具有明显的不同,这些差异在用redis实现时尤其明显。
悲观锁是指在编程中将一段资源(例如:字符串key)标记为未被其他程序处理前,始终处于上锁状态。每次程序访问这段资源都需要去获取锁,不然无法进行操作。因此,悲观锁会造成大量的开销,导致性能降低。
用redis来实现悲观锁要求我们使用命令setnx(){value}语句,可以使用Redis的setnx命令去设置一个特殊的key,如果key不存在,则说明资源没被锁定,可以执行操作,如果key存在,则说明资源已被锁定,此时会返回一个错误,表示不能执行操作。
而乐观锁是指程序在操作某一资源前,会先比较一下本地与线上的状态是否一致,如果一致,则执行操作,如果存在差异,则流程会被终止,不会被执行,乐观锁在操作时没有使用任何锁机制,因此具有非常好的性能。
用redis实现乐观锁需要使用redis的getset方法,其原理是获取原有value值,并将其设置为新value值。如果getset操作之后返回的值与原来的一致,则执行操作,如果返回的是不一致,则表明有并发操作发生,当前的操作不能执行,此时可以重新尝试再次执行操作或者执行另一种操作。
从实现技术和性能上来看,redis乐观锁是要比悲观锁好得多的,但是要考虑到并发操作所导致的可能存在的问题,以及可能出现的死锁问题,仍然需要根据需求来甄别使用哪种模式。