2016 - 2024

感恩一路有你

PHP使用redis实现自旋锁 分布式锁用zookeeper还是redis好?

浏览量:2151 时间:2021-03-14 11:50:08 作者:admin

分布式锁用zookeeper还是redis好?

1. 无法重新进入

2。没有本地锁,并发性能会很差。它不用于并发锁争用较多的场景。本地锁没有自旋

3。不考虑锁等待排序。redis很难实现,可以通过redis的列表实现,但是列表下的每个子节点都没有超时。Redis也不能执行模糊查询键*

所以当我们遇到性能瓶颈时,最好通过zookeeper来实现,我们离线的常常无法注册

zookeeper原则是临时节点

自旋锁)

自旋锁有点像互斥锁,但自旋锁不会导致呼叫者睡眠。如果一个自旋锁被另一个执行单元持有,调用者总是在那里循环,看它是否被持有

自旋锁的持有者是否已经释放了锁,因此得名“自旋”。它的功能是解决资源的互斥使用问题。由于自旋锁不会导致调用者睡眠,所以自旋锁的效率比互斥锁高很多。虽然它的效率高于互斥锁,但它也有一些缺点:1。自旋锁总是占用CPU。它运行所有的时间-自旋没有得到锁,所以它占用CPU。如果不能在短时间内获得锁,无疑会降低CPU效率。

2. 使用自旋锁时,可能会导致死锁。递归调用时,可能导致死锁。调用其他一些函数也可能导致死锁,例如copyuutouuser()、copyufromuuser()、kmalloc()等,因此使用自旋锁要谨慎。只有当内核是抢占式或SMP时,才真正需要自旋锁。在单CPU非抢占式内核中,自旋锁的操作为空。旋转锁适用于锁用户在短时间内保持锁。

互斥:线程将切换上下文,抢占CPU并将信号从休眠发送到运行。

自旋锁:线程总是在运行(lock> unlock),死循环检测锁标志位,机制并不复杂。

互斥锁是一种睡眠等待锁。例如,在双核机器上,有两个线程(线程a和线程b),分别在core0和

core1上运行。假设线程a希望通过pthreadmutexLock操作来获得关键区域的锁。此时,锁由线程B持有,那么线程a将被阻塞

这是毫无疑问的,因为线程锁定是资源密集型的

!那么,如何避免锁的性能下降呢?

1、从业务上避免大量锁结构

!2. 使用ThreadLocal,可以保证每个线程中的数据不会互相污染

!3. 如果读多写少,请使用读写锁

!4. 自旋锁将挑战CPU,尽管它是一个线程时间很少的锁

!5. 锁的粒度应该尽可能小:可以在方法中的锁不应该占用整个方法

PHP使用redis实现自旋锁 redis锁为什么要用uuid 如何使用redis实现分布式锁

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。