• Redis之分布式锁


     背景

    分布式应用中,经常会遇到并发问题。熟悉的朋友都知道这个时候就需要加锁。只有原子操作才能保证数据不会混乱。(原子操作是不会被线程调度机制所打断的的操作,一旦开始就会执行到最后,要么做要么不做,不会被打断),分布式锁应运而生。

    本质

    分布式锁要实现的目标就是在Redis中占一个格子,当其他进程也要进来的时候发现已经被占领了,就只好放弃或者等待。

    一般用于占格子的命令是

    setnx(set if not exists) 如:setnx lock:asfagas  true     

    很好记忆,如果没有就设置,先来先占,用完之后del指令释放格子。

     所以流程是先占格子做事情再释放,如果事情做到一半出现异常了,那么是不是就是del不了了,就会一直占用,成为所谓的死锁。

    解决方案

    我们可以在占格子的时候设置一个定时,如果超过这个时间事情还没做完(异常),会自动释放,那么就解决了可能会出现死锁的问题。

    expire 锁名字 秒数     

    如: expire lock:asfas 5   代表五秒之后解锁

    我们是先setnx设置锁,expire设置过期时间,看起来天衣无缝,但是如果这两条命令之间出现问题了怎么办。

    所以在2.8版本中,作者加入了set扩展参数,使得它俩一起执行,成为原子操作,就真的天衣无缝了

    set lock:asfawf  true ex 5 nx ok 

    1. lock:asfawf:这是要设置的键名。在这个例子中,键名为 "lock:asfawf"。
    2. true:这是要设置的值。在这个例子中,值是 "true"。
    3. ex 5:这是可选参数,表示键的过期时间。在这个例子中,过期时间是 5 秒。
    4. nx:这是一个条件选项,表示仅当键不存在时,才对键进行设置操作。在这个例子中,如果键 "lock:asfawf" 已经存在,那么命令将不会执行任何操作。
    5. ok:这是一个响应选项,表示如果命令执行成功,返回 "OK"。在这个例子中,如果命令执行成功,将返回 "OK"

     分布式锁的奥义便是这个

  • 相关阅读:
    v-model的各种使用状态和使用结果
    【Item 02: 尽量以const, enum, inline替换 #define】
    Qt 设置程序置顶
    vue 和 后端交互
    js三元表达式复杂条件判断
    随笔记录:SE模块插入位置总结
    js中Promise的常见用法 比如resolve、race都是啥意思
    Python中安装Beautiful Soup库及其相关解析器的方法2-1
    simpleitk 读数据 图像 dicom nii 处理数据
    97%的客户说评论影响购买决策,那么跨境商家如何影响这97%呢?
  • 原文地址:https://blog.csdn.net/Yoke______/article/details/132616953