首页>>数据库>>nosql->redis锁setnx作用,redis锁使用

redis锁setnx作用,redis锁使用

时间:2024-01-09 本站 点击:0

如何用redis实现分布式锁

1、事务1加个三个行锁和间隙锁。 场景1,场景3会发生锁等待 。间隙锁与查询不冲突, 场景2不会锁等待。 分析: RC隔离级别: 事务1加的都是行锁。 场景1会发生锁等待, 场景2,场景3不会发生锁等待。

2、需要在获得 lock-key 后判断加锁对象是否为当前client,是,则解锁。

3、使用分布式锁要满足的几个条件:系统是一个分布式系统(关键是分布式,单机的可以使用ReentrantLock或者synchronized代码块来实现)共享资源(各个系统访问同一个资源,资源的载体可能是传统关系型数据库或者NoSQL)。

4、那这时候,我们就需要一个跨平台、跨语言的加锁方式。redis就是其中最方便的一种。使用redis实现并发锁,主要是靠两个redis的命令:setnx和getset。

5、此时就需要使用分布式锁了。简而言之,分布式锁就是用来控制同一时刻,只有一个线程可以访问被保护的资源。可以使用 SETNX key value 命令实现互斥的特性。

Redis分布式锁的原理是什么?如何续期?

所以这个就是redis cluster,或者是redis master-slave架构的主从异步复制导致的redis分布式锁的最大缺陷:在redis master实例宕机的时候,可能导致多个客户端同时完成加锁。

redis是保持的AP而非CP,如果要追求强一致性可以使用zookeeper分布式锁,但是zookeeper也不是完全没问题,在出现网络颜值,客户端与服务端失联情况的时候也依然可能会出现分布式的问题。

分布式锁其实可以理解为:控制分布式系统有序的去对共享资源进行操作,通过互斥来保持一致性。

redissetnx加锁和hash加锁区别

1、分布式锁:在分布式服务中。可以利用Redis的setnx功能来编写分布式的锁,虽然这个可能不是太常用。

2、改进版的加锁:命令是: setnx expire 添加分布式锁的同时,添加一个锁锁过期的时间。这样,当加锁线程退出之后,至少等一段时间之后,锁是有机会释放掉的。

3、setIfAbsent 这个函数实现的功能与 setnx 命令一样,代表如果没有这个key则set成功获取到锁,否则set失败没有获取到锁。 获得锁后进行资源的操作,最后释放锁。执行效果 :可以看到同时只有1个线程能够获取到锁。

4、基于缓存实现分布式锁:理论上来说使用缓存来实现分布式锁的效率最高,加锁速度最快,因为Redis几乎都是纯内存操作,而基于数据库的方案和基于Zookeeper的方案都会涉及到磁盘文件IO,效率相对低下。

5、values = 10, 10, 10 如果真的必须将所有访问量存放在同一个hash的话,有可能是为了方便持久化到数据库。也就是先通过redis进行自增,然后定时将数据从redis同步到mysql中,避免mysql的并发和锁问题。

6、但在并发量高的场合中,利用数据库锁来控制资源的并发访问是不太理想的,大大影响了数据库的性能。可以利用Redis的setnx功能来编写分布式的锁,如果设置返回1说明获取锁成功,否则获取锁失败,实际应用中要考虑的细节要更多。

关于redis锁setnx作用和redis锁使用的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/nosql/103707.html