Redis实现分布式文件夹锁
缘起
最近做一个项目,类似某度云盘,另外附加定制功能,本人负责云盘相关功能实现,这个项目跟云盘不同的是,以项目为分配权限的单位,同一个项目及子目录所有有权限的用户可以同时操作所有文件,这样就很容易出现并发操作,而且表结构设计的时候,定下来文件和文件夹都有个path字段,存储的是所在父级文件夹路径,这样检索方便,重命名和移动比较麻烦。
如下,例如甲同学正在移动项目下C文件夹,而此时乙同学也在操作项目下D下的d.txt文件,这样就会出现问题,所以需要分布式锁控制,甲在操作C文件夹的时候,C文件夹所有子文件和包含C文件夹的父文件夹都被锁住,如图将会被锁定的文件夹和子文件有:A、C、c.txt、D、E、d.txt,其中a.txt和B未被锁定,这个是移动的情况,如下表格列出其他情况.
操作对象 | 操作 | 新建 | 上传 | 移动文件夹 | 移动文件 | 复制文件夹 | 复制文件 | 重命名文件夹 | 重命名文件 | 删除文件夹 | 删除文件 | 回收站清除 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
/A | 新建 | √ | √ | × | √ | × | √ | × | √ | × | √ | / |
/A | 上传 | √ | √ | × | √ | × | √ | × | √ | × | √ | / |
/A->/B | 移动文件夹 | A×B× | A×B× | A×B× | A×B× | A√B√ | A√B√ | A×B× | A×B√ | A×B× | A×B√ | / |
a.txt->/B | 移动文件 | B√ | B√ | B× | B√ | B× | a√B× | a×B× | a×B√ | B× | a×B√ | / |
/A->/B | 复制文件夹 | B√ | B√ | B× | B√ | B√ | B√ | B× |