本文是一个demo,利用多进程,来模拟使用redis分布式锁的使用场景。本机需要安装redis,python3.7下运行代码。分布式锁用redlock这个包实现,实现步骤分三步:

  1. 实例化锁:rlock = RedLock('test',[{'host': 'localhost','port': 6379,'db': 0,}])
  2. 获取锁:rlock.acquire(),获取锁之后才能执行程序。
  3. 释放锁:rlock.release(),程序执行完之后,要释放锁,否者其他程序就阻塞,一直执行不了。

完整代码如下:

# -*- coding: utf-8 -*-
import os
import arrow
import redis
from multiprocessing import Pool
from redlock.lock import RedLock HOT_KEY = 'count'
r = redis.Redis(host='localhost', port=6379) def seckilling():
name = os.getpid()
v = r.get(HOT_KEY)
if int(v) > 0:
print (name, ' decr redis.')
r.decr(HOT_KEY)
else:
print (name, ' can not set redis.', v)
#
def run_without_lock(name):
while True:
if arrow.now().second % 5 == 0:
seckilling()
return rlock = RedLock('test',[{'host': 'localhost','port': 6379,'db': 0,}])
def run_with_redis_lock(name):
while True:
if arrow.now().second % 5 == 0:
# 二,获取锁
if rlock.acquire():
seckilling()
# 释放锁
rlock.release()
return
if __name__ == '__main__':
p = Pool(80)
r.set(HOT_KEY, 1) for i in range(80):
# p.apply_async(run_without_lock, args=(i,))
p.apply_async(run_with_redis_lock, args=(i,))
print ('now 16 processes are going to get lock!')
p.close()
p.join()
print('All subprocesses done.')

  使用锁的代码,主要是:

rlock = RedLock('test',[{'host': 'localhost','port': 6379,'db': 0,}])
def run_with_redis_lock(name):
while True:
if arrow.now().second % 5 == 0:
# 二,获取锁
if rlock.acquire():
seckilling()
# 释放锁
rlock.release()
return

使用redlock得步骤很简单,总结出来,一共四步:

#  一,实例化一把锁 rlock
from redlock.lock import RedLock

rlock = RedLock('test',[{'host': 'localhost','port': 6379,'db': 0,}])
# 二,获取锁
if rlock.acquire():
# 三,需要锁住形成阻塞得程序
seckilling()
# 四,释放锁
rlock.release()

总结,我们使用锁的原因,就是让并发的程序形成阻塞,并发可以引起的问题是数据不一致的情况,使用锁,形成阻塞,排队使用数据,就不会造成数据不一致的问题了,当然了,阻塞肯定会降低效率了,速度要慢很多。

用redlock实现redis的分布式锁的更多相关文章

  1. 用Redis构建分布式锁-RedLock(真分布)

    在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段. 有很多三方库和文章描述如何用Redis实现一个分布式锁管理器,但是这些库实现的方式差别很大,而且很多简单的实现其实只需采用稍微增 ...

  2. 【Redis】分布式锁RedLock

    普通实现 说道Redis分布式锁大部分人都会想到: 1.setnx+lua, 2.setkey value px milliseconds nx. - 获取锁(unique_value可以是UUID等 ...

  3. 基于Redis的分布式锁和Redlock算法

    1 前言 前面写了4篇Redis底层实现和工程架构相关文章,感兴趣的读者可以回顾一下: Redis面试热点之底层实现篇-1 Redis面试热点之底层实现篇-2 Redis面试热点之工程架构篇-1 Re ...

  4. 身为一枚优秀的程序员必备的基于Redis的分布式锁和Redlock算法

    1 前言 今天开始来和大家一起学习一下Redis实际应用篇,会写几个Redis的常见应用. 在我看来Redis最为典型的应用就是作为分布式缓存系统,其他的一些应用本质上并不是杀手锏功能,是基于Redi ...

  5. Redis实现分布式锁

    http://redis.io/topics/distlock 在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段. 有很多三方库和文章描述如何用Redis实现一个分布式锁管理器,但 ...

  6. 基于Redis的分布式锁真的安全吗?

    说明: 我前段时间写了一篇用consul实现分布式锁,感觉理解的也不是很好,直到我看到了这2篇写分布式锁的讨论,真的是很佩服作者严谨的态度, 把这种分布式锁研究的这么透彻,作者这种技术态度真的值得我好 ...

  7. 【转】Redis学习笔记(五)如何用Redis实现分布式锁(2)—— 集群版

    原文地址:http://bridgeforyou.cn/2018/09/02/Redis-Dsitributed-Lock-2/ 单机版实现的局限性 在上一篇文章中,我们讨论了Redis分布式锁的实现 ...

  8. 基于redis的分布式锁(转)

    基于redis的分布式锁 1 介绍 这篇博文讲介绍如何一步步构建一个基于Redis的分布式锁.会从最原始的版本开始,然后根据问题进行调整,最后完成一个较为合理的分布式锁. 本篇文章会将分布式锁的实现分 ...

  9. 基于redis的分布式锁(不适合用于生产环境)

    基于redis的分布式锁 1 介绍 这篇博文讲介绍如何一步步构建一个基于Redis的分布式锁.会从最原始的版本开始,然后根据问题进行调整,最后完成一个较为合理的分布式锁. 本篇文章会将分布式锁的实现分 ...

随机推荐

  1. 微信小程序 scroll-View 动态定位之scroll-into-view

  2. 【CTS】几个serialno失败项

    [问题结论] [Common]SN配置项的问题,只可以'数字与大小写字母' 将配置SN改为字母数字组合,测试全部pass [问题描述] CTS三条失败项 run cts -m CtsTelephony ...

  3. PHPstorm Xdebugger最全详细

    0 Xdebug调试的原理(选看) 图0-1 单机调试原理示意图 图0-2 多机调试原理示意图 对于PHP开发,初来咋到,开发环境的搭建和理解感觉是最烦人的一件事了.不像JAVA,打开一个Eclips ...

  4. 安全运维 - Linux系统攻击回溯

    入侵排查思路 (1)- 日志分析 日志分析 默认日志路径: /var/log 查看日志配置情况: more /etc/rsyslog.conf 重要日志: 登录失败记录: /var/log/btmp ...

  5. SQL语句创建函数

    ----先create,再alter alter function fuc (@userid int,@strWhere varchar(max),@strWhere2 varchar(max) )  ...

  6. 12 (H5*) JS第二天 流程控制:顺序结构、分支结构、循环结构

    目录 1:一元运算符 2:流程控制 3:分支之if语句 4:分支之if-else语句 5:分支语句之三元运算符 6:if和else if语句 7:switch-case语句 8:while循环 9:d ...

  7. c语言秋季作业2

    问题 答案 这个作业属于哪个课程 C语言程序设计I 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-4/homework/8657 我在这 ...

  8. python 安装成linux中的systemd守护运行

    参考文档1:https://blog.csdn.net/luckytanggu/article/details/53467687 参考文档2:https://www.jianshu.com/p/e14 ...

  9. mysql字符串拆分实现split功能

    转自:https://blog.csdn.net/pjymyself/article/details/81668157有分隔符的字符串拆分题目要求数据库中 num字段值为: 实现的效果:需要将一行数据 ...

  10. Spring框架中AOP特性

    1.AOP介绍 即:面向切面编程,在不改变原有方法的定义与使用.也不改变原程序流程的情况下,可以改变原有方法的功能{增加一些附加的功能,在指定的地方添加其他函数方法:} 2.其他的方法:[需要的四个接 ...