深入浅出redis(二)

分布式锁的实现

锁是来解决单进程多线程中并发问题
java中的synchronized lock

分布式锁是来针对于多个进程对一个资源的访问

  1. 资源共享竞争问题
  2. 数据的安全性

分布式锁的解决方案

数据库,通过唯一约束

lock(
id int(11)
methodName varchar(100),
memo varchar(1000)
modifyTime timestamp
unique key mn (method) --唯一约束
)
获取锁的伪代码
try{
exec insert into lock(methodName,memo) values(‘method’,’desc’); method
return true;
}Catch(DuplicateException e){
return false;
}
释放锁
delete from lock where methodName=’’;

存在的需要思考的问题

1.锁没有失效时间,一旦解锁操作失败,就会导致锁记录一直在数据库中,其他线程无法再获得到锁
2.锁是非阻塞的,数据的insert操作,一旦插入失败就会直接报错。没有获得锁的线程并不会进入排队队列,要想再次获得锁就要再次触发获得锁操作
3.锁是非重入的,同一个线程在没有释放锁之前无法再次获得该锁

zookeeper实现分布式锁

利用zookeeper的唯一节点特性或者有序临时节点特性获得最小节点作为锁. zookeeper 的实现相对简单,通过curator客户端,已经对锁的操作进行了封装,原理如下

zookeeper的优势

  1. 可靠性高、实现简单
  2. zookeeper因为临时节点的特性,如果因为其他客户端因为异常和zookeeper连接中断了,那么节点会被删除,意味着锁会被自动释放
  3. zookeeper本身提供了一套很好的集群方案,比较稳定
  4. 释放锁操作,会有watch通知机制,也就是服务器端会主动发送消息给客户端这个锁已经被释放了

redis实现分布式锁

在这里插入图片描述

释放锁
在这里插入图片描述
WATCH命令可以监控一个或多个键,一旦其中有一个键被修改(或删除),之后的事务就不会执行。监控一直持续到EXEC命令(事务中的命令是在EXEC之后才执行的,所以在MULTI命令后可以修改WATCH监控的键值)

redis性能关于多路复用机制(一个线程的多事件)

IO多路复用机制
linux的内核会把所有外部设备都看作一个文件来操作,对一个文件的读写操作会调用内核提供的系统命令,返回一个 file descriptor(文件描述符)。对于一个socket的读写也会有响应的描述符,称为socketfd(socket 描述符)。而IO多路复用是指内核一旦发现进程指定的一个或者多个文件描述符IO条件准备好以后就通知该进程
IO多路复用又称为事件驱动,操作系统提供了一个功能,当某个socket可读或者可写的时候,它会给一个通知。当配合非阻塞socket使用时,只有当系统通知我哪个描述符可读了,我才去执行read操作,可以保证每次read都能读到有效数据。操作系统的功能通过select/pool/epoll/kqueue之类的系统调用函数来使用,这些函数可以同时监视多个描述符的读写就绪情况,这样多个描述符的I/O操作都能在一个线程内并发交替完成,这就叫I/O多路复用,这里的复用指的是同一个线程
多路复用的优势在于用户可以在一个线程内同时处理多个socket的 io请求。达到同一个线程同时处理多个IO请求的目的。而在同步阻塞模型中,必须通过多线程的方式才能达到目的

猜你喜欢

转载自blog.csdn.net/lf1013667686/article/details/87020461