只用Mysql搞一个分布式锁

在web开发中,分布式的锁的应用场景甚多,我们可以通过分布式锁来进行一些仅依赖于数据库的事务很难直接保证原子性的操作,比如多种不同数据源的访问,网络通信等等。多数情况下我们会使用memcache的add, redis中在set中指定nx参数等来完成。

下面介绍一个仅依赖Mysql来完成分布式锁的方式,如果项目比较小且主要使用的数据库是Mysql,那么就不需要引入额外的架构上的依赖了。

这里的方法就是通过Mysql的GET_LOCK函数和RELEASE_LOCK函数来完成的。我们可以通过GET_LOCK(lock_key, timeout)函数来创建一个key:

SELECT GET_LOCK('user_id_XXXX', 10)

除了获取到lock_key的进程,其他进程就无法进入被这个锁锁住的代码逻辑了。之后,在同一个db session中,可以再通过RELEASE_LOCK(lock_key)来释放这个lock_key:

SELECT RELEASE_LOCK('user_id_XXXX')

被释放的lock_key就可以被别的进程获取了。

我写了一个python的例子,可以看一下

class DbLock(object):def __init__(self, key, connection, timeout=5):'''key: lock key.connection: a db connection object.'''self.key = keyself.connection = connectionself.timeout = timeoutself.cursor = Nonedef __enter__(self):self.cursor = self.connection.cursor()self.cursor.execute("SELECT GET_LOCK(%s, %s)",[self.key, self.timeout])result, = self.cursor.fetchone()if result != 1:raise Exception("DbLock %s error, timeout %s, returned %s."\% (self.key, self.timeout, result))def __exit__(self, exc_type, exc_value, traceback):self.cursor.execute("SELECT RELEASE_LOCK(%s)",[self.key])self.cursor.close()if exc_type is not None:pass# deal with error

这样在实际的代码中,就可以通过如下方式来使用这个lock了(我们假设是django的数据库connection对象):

from django.db import connectionwith DbLock(key, connection, 5):# your own code

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么用小程序将身份证转为结构化Excel?

随着科技的不断发展,我们的生活变得越来越智能化。现在,我们可以使用金鸣表格文字识别小程序来识别身份证并转为结构化的excel,并且可自动核对真伪,保留头像。金鸣表格文字识别小程序是一种基于人工智能技术的应用程序&#xff0c…

nacos,nginx及java服务自重启

微服务之服务自重启 设置Nacos开机自启在/lib/systemd/system文件夹下创建nacos.service文件 [Unit] Descriptionnacos Afternetwork.target[Service] Typeforking ExecStart/opt/nacos-server-1.4.1/nacos/bin/startup.sh -m standalone ExecReload/opt/nacos-server-1.4.1/…

将字符串中的制表符替换为指定数量的空格expandtabs()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将字符串中的制表符 替换为指定数量的空格 expandtabs() [太阳]选择题 请问以下代码text3的空白处是? text1 "这里有一个\t制表符" text2 "这里有一个12345制表符…

第二次作业+第三次作业

第二次作业第三次作业 第二次作业 题目: 网站需求: ​ 1.基于域名[www.openlab.com](http://www.openlab.com)可以访问网站内容为 welcome to openlab!!! 2.给该公司创建三个子界面分别显示学生信息,教学资料和缴费网站,基于[ww…

利用HTML+CSS+JS打造炫酷时钟网页的完整指南

引言 在现代Web开发中,制作一个引人注目的时钟网页是一种常见而令人愉悦的体验。本文将介绍如何使用HTML、CSS和JavaScript来创建一个炫酷的时钟网页,通过这个项目,你将学到如何结合这三种前端技术,制作一个动态且美观的时钟效果…

vue 中的watch 的deep属性

在 Vue 中,watch 是一个用于观察和响应 Vue 实例上的数据变化的选项。当你在一个属性上设置 watch 时,Vue 会监视该属性的变化并在变化时执行相应的回调函数。 deep 属性是 watch 选项的一个属性,用于深度观察一个对象的变化。默认情况下&am…

深入探索 Android 中的 Runtime

深入探索 Android 中的 Runtime 一、什么是 Runtime二、Android 中的 Runtime 类型2.1. Dalvik Runtime2.2. ART(Android Runtime) 三、Runtime 的作用和特点3.1. 应用程序执行环境3.2. 跨平台支持3.3. 性能优化3.4. 应用程序优化 四、与应用开发相关的重…

Unity3D Pico VR 手势识别物体交互 适配 MRTK3

当前Pico已经支持手势识别了,但是提供的PICO Unity Integration SDK 中是没有手势和物体交互的功能,Unity XR Interaction Toolkit提供的手势识别物体交互对 Quest适配的挺好的,Pico 当前只能用指尖点触还不能对物体进行抓握以及手势控制射线…

ubuntu18.04以上版本使用systemd 开启自启动服务

进入/etc/systemd/system/目录,创建myscript.service,并赋予权限 sudo vim /etc/systemd/system/myscript.service [Unit] DescriptionMy Script Service Afternetwork.target [Service] Userroot ExecStart/home/start.sh Restartalways [Install]…

【水文】打印99乘法表

#include <stdio.h> int main() { for (int i 1; i < 9; i) { for (int j 1; j < i; j) { printf("%d*%d%d\t", j, i, i * j); } printf("\n"); } return 0; }

JS-WebAPIs-其他事件(三)

• 页面加载事件 页面加载事件主要有二种事件&#xff0c;分别是load和DOMContentLoaded 加载外部资源&#xff08;如图片、外联CSS和JavaScript等&#xff09;加载完毕时触发的事件为什么要学&#xff1f; 有些时候需要等页面资源全部处理完了做一些事情老代码喜欢把 scrip…

JAVA如何创建对象

在 Java 中创建对象的步骤如下&#xff1a; 定义一个类&#xff1a;在 Java 中&#xff0c;所有的对象都是通过类来创建的。因此&#xff0c;首先需要定义一个类&#xff0c;即描述对象的属性和行为。 声明变量&#xff1a;要创建一个对象&#xff0c;需要先声明一个变量来保存…

Spring MVC的面试知识点

1、Spring MVC的入口是什么&#xff1f; Spring MVC的入口是DispatcherServlet。这个Servlet是Spring MVC框架的关键组件&#xff0c;负责接收所有来自客户端的请求&#xff0c;并将其分派给适当的Controller对象进行处理。在Spring MVC框架中&#xff0c;所有的请求都会经过D…

redisson-spring-boot-starter 自动化配置源码解析

版本 redisson-spring-boot-starter:3.25.2 此starter会自动注册RedissonClient Bean 并可通过注册RedissonAutoConfigurationCustomizer Bean实现配置自定义 BeanRedissonAutoConfigurationCustomizer jdkCodecCustomizer() {return configuration->{// 使用JDK序列化器c…

Hadoop详解

Hadoop 概念 就是一个大数据解决方案。它提供了一套分布式系统基础架构。 核心内容包含 hdfs 和mapreduce。hadoop2.0 以后引入 yarn. hdfs 是提供数据存储的&#xff0c;mapreduce 是方便数据计算的。 hdfs 又对应 namenode 和 datanode. namenode 负责保存元数据的基本信息…

移动端自适应解决方法(adaptive插件,原理是rem布局)

点击跳转官方Git地址 此博客参考笔记 也可以直接复制下方的js文件直接使用 index.js var adaptive {}; (function (win, lib) {var doc win.document;var docEl doc.documentElement;// 设备像素比var devicePixelRatio win.devicePixelRatio;// 我们设置的布局视口与理…

docker使用Dockerfile制做容器(以hyperf为列,开机启动)

1、Dockerfile文件 FROM hyperf/hyperf:8.1-alpine-v3.18-swoole WORKDIR /data MAINTAINER dade <dadeqq.com> ADD start.sh start.sh RUN chmod x ./start.sh CMD /data/start.sh1-1、执行命令生成hyperf:latest容器&#xff08;文件名是Dockerfile可以省略&#xff0…

YZ系列工具之YZ04:文本批量替换使用说明文档

我给VBA下的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套一部VBA手册&#xff0c;教程分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的…

解锁新身份:无忧秘书智脑-AI智能直播的10宫格姓氏头像制作秘籍

在这个信息爆炸的时代&#xff0c;一个独特的标识是个人或品牌在众多竞争者中脱颖而出的关键。而头像作为我们日常在线身份的一部分&#xff0c;更是我们展示个性和风格的重要窗口。无忧秘书智脑-AI智能直播最新推出的专属姓氏10宫格头像功能&#xff08;ai6ai69)&#xff0c;为…

【Python学习】Python学习21- 正则表达式(2)

目录 【Python学习】Python学习21- 正则表达式&#xff08;2&#xff09; 前言字符串检索和替换repl 参数是一个函数参考 文章所属专区 Python学习 前言 本章节主要说明Python的正则表达式。 正则表达式是一个特殊的字符序列&#xff0c;它能帮助你方便的检查一个字符串是否与…